當前位置: 華文星空 > 知識

為什麽 360 面試官說 Trie 樹沒用?

2018-03-09知識

說句實話,工程上來說,和hash比起來,trie就是沒有用的東西。這個可以說很深刻地表現出了一個學生和一個軟件工程師的思維差異。

你可能很清楚,hash類的演算法都有可能因為碰撞而退化,而trie是穩定的復雜度,簡直太招人喜歡了。

但是工程師99.9%的情況下都會用hash。因為,hash函數、map、set,都有內建庫,所有語言都有。

這意味著一個功能用hash就是五行程式碼,甚至體現不出用了hash,而用trie,你要麽先交一份trie開源庫的分析選型比較報告來,要麽自己擼一個,附帶著先寫一千行的單元測試用例,再跑個壓測。萬一將來換個語言,請從頭再來。

是的,就是這麽簡單,工程師才不會考慮碰撞,他們甚至不關心rehash、hash實作這些細節,許多語言內建的hash實作已經考慮了防止惡意碰撞了,而隨機碰撞,沒有那麽巧的事情。寫出簡單可用能快速上線的程式碼要更重要。

你看出來了,學術關心理論最優,工程關心實踐最優。

你可能憤憤不平,為啥標準庫不把trie加進去?那你有沒有想過這些問題呢?

1. 如果字串不是常見的英文小寫字母,而是unicode呢?

2. 如果這些字串超級長,甚至有傻子拿來了一千個文字檔案,每個有100KB呢?

3. 字串現在多得不能忍了,需要分布式處理,你要怎麽設計一個分布式的trie(要記得trie的節點分布可能是高度不均衡的)?

所以,工程看重什麽也是有道理的。

當然trie自然不是真的沒用,它支持字首匹配,支持範圍尋找,這些都有獨特的套用,比如數據庫裏字串類別的索引就經常實作為字首樹(另一種常見實作自然就是hash)。但說實話,不會有工程師認為這是兩種可以相互競爭的技術。