此段來自《極客時間》王爭老師的資料結構與演算法:
我們在雜湊表那節中講過,雜湊表的插入、刪除、查詢操作的時間複雜度可以做到常量級的 o(1),非常高效。而二叉查詢樹在比較平衡的情況下,插入、刪除、查詢操作時間複雜度才是 o(logn),相對雜湊表,好像並沒有什麼優勢,那我們為什麼還要用二叉查詢樹呢?
我認為有下面幾個原因:
第一,雜湊表中的資料是無序儲存的,如果要輸出有序的資料,需要先進行排序。而對於二叉查詢樹來說,我們只需要中序遍歷,就可以在 o(n) 的時間複雜度內,輸出有序的資料序列。
第二,雜湊表擴容耗時很多,而且當遇到雜湊衝突時,效能不穩定,儘管二叉查詢樹的效能不穩定,但是在工程中,我們最常用的平衡二叉查詢樹的效能非常穩定,時間複雜度穩定在 o(logn)。
第三,籠統地來說,儘管雜湊表的查詢等操作的時間複雜度是常量級的,但因為雜湊衝突的存在,這個常量不一定比 logn 小,所以實際的查詢速度可能不一定比 o(logn) 快。加上雜湊函式的耗時,也不一定就比平衡二叉查詢樹的效率高。
第四,雜湊表的構造比二叉查詢樹要複雜,需要考慮的東西很多。比如雜湊函式的設計、衝突解決辦法、擴容、縮容等。平衡二叉查詢樹只需要考慮平衡性這乙個問題,而且這個問題的解決方案比較成熟、固定。
最後,為了避免過多的雜湊衝突,雜湊表裝載因子不能太大,特別是基於開放定址法解決衝突的雜湊表,不然會浪費一定的儲存空間。
綜合這幾點,平衡二叉查詢樹在某些方面還是優於雜湊表的,所以,這兩者的存在並不衝突。我們在實際的開發過程中,需要結合具體的需求來選擇使用哪乙個。
二叉排序樹 構造雜湊表,
一 實驗內容 1 二叉排序樹。任意給定一組資料,設計乙個演算法,建立一棵二叉排序樹,對它進行查詢 插入 刪除等操作。2 構造雜湊表,key值由隨機數獲得,自己選擇解決衝突的演算法。並且計算查詢次數及平均查詢次數。一 源程式 二叉排序樹 1 include2 include 3using namesp...
B 二叉排序樹(比較兩個二叉排序樹)
description 二叉排序樹的定義是 或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。今天我們要判斷兩序列是否為同一二叉排序樹 input ...
查詢表 二叉排序樹
資料結構實驗之查詢一 二叉排序樹 time limit 400 ms memory limit 65536 kib problem description 對應給定的乙個序列可以唯一確定一棵二叉排序樹。然而,一棵給定的二叉排序樹卻可以由多種不同的序列得到。例如分別按照序列和插入初始為空的二叉排序樹,...