Tree Search(樹狀搜尋)

一、什麼是 Tree Search(樹狀搜尋)? 在人工智慧(AI)與演算法中,許多問題都可以表示成一棵樹(圖一): 起點(A) / | \ B C D /|\ | / \ E F G H I J 每個節點(Node)代表一種狀態(State)。 例如: 迷宮中的位置 棋局的盤面 路徑規劃中的城市 遊戲中的決策 搜尋演算法的目的: 從起點找到目標節點(Goal Node) 二、Breadth First Search (BFS) 核心思想 先搜尋離起點最近的節點。 一層一層往外擴展。 Level 0: A Level 1: B C D Level 2: E F G H I J 搜尋順序: A B C D E F G H I J 圖一結果: A → B → C → D → E → F → G → H → I → J 使用資料結構 Queue(佇列) FIFO: First In First Out 先進先出 例如: Queue: A 取出A 加入B,C,D Queue: B,C,D BFS特性 優點 如果邊權重相同: BFS一定找到最短路徑。 缺點 需要大量記憶體。 假設每個節點有10個子節點: 深度5: 10^5 = 100000 需要保存很多節點。 時間複雜度 O(V + E) V = Vertex(節點數) E = Edge(邊數) 三、Depth First Search (DFS) 核心思想 一路往下走到底。 不能走才回頭。 A | B | E 然後: A | B | F 搜尋順序 圖一結果: A B E F G C H D I J 使用資料結構 Stack(堆疊) LIFO Last In First Out 後進先出 例如: push(B) push(C) push(D) pop() => D DFS特性 優點 記憶體需求小。 只需保存: 目前路徑 即可。 缺點 可能找到很差的解。 例如: A ├── Goal └── 巨大子樹 DFS可能先跑完整個巨大子樹。 時間複雜度 O(V+E)...

程式設計師的斜桿人生

最近筆者在閱讀《斜槓青年》一書,想起很多的Programmer都會在自己的履歷上,用類似底下的文字敘述來描述自己所會的程式語言
C/C++/Java/Python
而 這個符號所使用的英文單字正好是Slash。

不過此書所說的斜槓意思可不只是這樣子而已,所以有些Programmer會這樣子寫:
Web/OS/Alg/Driver/Game Software Developer
恩,會這些的Programmer是書上所提的斜槓人生嗎?這還不是。
以AlphaGo的推手之一的黃士傑來說,他本身是台灣圍棋業餘六段,也就是說至少他的人生經歷可以寫成像這樣子:
程式設計師/圍棋業餘六段
OK,到這邊若還看不出來此書作者的意思,那請看底下引用《斜槓青年》的說明:
對於一個斜槓青年最重要的是:  不是身兼很多種賺錢的方式,而是擁有許多真正熱愛的事物。  透過不同管道,讓你的才華和機會超/展/開!
這樣子的思維(或者說是態度)對一個Programmer是很重要的,因為若沒有真正熱愛的事物,一個Programmer可能只是會把Programming當作一個賺錢的技能,這樣也沒什麼不好,畢竟生存壓力與熱愛的事物不見得能擺在天平上一起衡量。

好,容筆者修改一下《斜槓青年》的說明,變成斜槓程式設計師
對於一個程式設計師最重要的是:  不是身兼很多種語言的技能,而是擁有許多真正可用的專案。
  透過不同管道,讓你的專業履歷超/透/明!
為什麼筆者要這麼說呢?隨著人工智慧與大數據的關係,公司的人資部的一些工作會被機器人所取代,例如自動化履歷篩選。而現在也有很多獵人頭會做媒合的事情,而這件事筆者相信未來會有自動化系統協助做這事,於是獵人才機器人會在網路上尋找適合的人才,或許不是所有產業找人才都會是這樣子,但針對Programmer相關的工作,這個趨勢是很有可能的,屆時沒有將自己的專業與履歷公開的人,就少了一些被動機會。(被動機會變成被動收入是很多人的夢想。)

若您覺得文章寫得不錯,請點選文章上的廣告,來支持小編,謝謝。

If you like this post, please click the ads on the blog or buy me a coffee. Thank you very much.

留言

這個網誌中的熱門文章