階段總結(三)——爲什麼有了散列表我們還需要二叉樹

二叉查找樹最大的特點就是,支持動態數據集合的快速插入、刪除、查找操作。

散列表也是支持這些操作的,而且散列表的這些操作比二叉查找樹更高效,時間複雜度是 O(1)。

既然散列表如此高效,那麼散列表是不是可以完全替代二叉樹呢。

或者說有沒有什麼地方用散列表是做不了的,必須用二叉樹呢?

 

散列表的插入、刪除、查找操作的時間複雜度可以做到常量級的 O(1),非常高效。

而二叉查找樹在比較平衡的情況下,插入、刪除、查找操作時間複雜度纔是 O(logn)。

 

但是爲什麼我們不能完全用散列表去替代二叉樹呢?

 

散列表中的數據是無序存儲的,如果要輸出有序的數據,需要先進行排序。

而對於二叉查找樹來說,我們只需要中序遍歷,就可以在 O(n) 的時間複雜度內,輸出有序的數據序列。

 

散列表擴容耗時很多,而且當遇到散列衝突時,性能不穩定。

儘管二叉查找樹的性能也不穩定,但是在工程中,最常用的平衡二叉查找樹的性能非常穩定,時間複雜度穩定在 O(logn)。

 

儘管散列表的查找等操作的時間複雜度是常量級的,但因爲哈希衝突的存在,這個常量不一定比 logn 小,所以實際的查找速度可能不一定比 O(logn) 快。加上哈希函數的耗時,也不一定就比平衡二叉查找樹的效率高。

 

散列表的構造比二叉查找樹要複雜,需要考慮的東西很多。比如散列函數的設計、衝突解決辦法、擴容、縮容等。

平衡二叉查找樹只需要考慮平衡性這一個問題,而且這個問題的解決方案比較成熟、固定。

 

爲了避免過多的散列衝突,散列表裝載因子不能太大,特別是基於開放尋址法解決衝突的散列表,不然會浪費一定的存儲空間。綜合這幾點,平衡二叉查找樹在某些方面還是優於散列表的。

 

所以,這兩者的存在並不衝突。我們在實際的使用過程中,需要結合具體的需求來選擇使用哪一個。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章