公曆 3 月 12 日是一年一度的植樹節。旨在宣傳保護森林,並動員群眾參加植樹造林活動。說到樹,程式猿們肯定不陌生,趁著這個植樹節到來之時普及一下程式猿們經常遇見的樹。
定義二叉搜尋樹又稱二叉查詢樹,亦稱為二叉排序樹。設 x 為二叉查詢樹中的乙個節點,x 節點包含關鍵字 key,節點x 的 key 值記為 key[x] 。如果 y 是 x 的左子樹中的乙個節點,則 key[y] <= key[x] ;如果 y 是 x 的右子樹的乙個節點,則 key[y] >= key[x] 。
查詢效能
當資料數目為 n,樹高度保持 logn 附近。則平均查詢長度與 logn 成正比,查詢平均時間複雜度為 o(logn) 。 當先後插入的關鍵字有序時,二叉搜尋樹退化成單支樹結構。此時樹高 n 。平均查詢長度為 (n+1)/2 ,查詢的平均時間複雜度為 o(n) 。
插入效能
插入效率與查詢效率一致。
刪除效能
刪除節點時,若節點為葉子節點,或者節點只有單一子樹,則時間複雜度為 o(1) 。若節點既有左子樹又有右子樹,則需要執行遞迴過程,對應時間複雜度為 o(logn) 。
應用場景
二叉排序樹就既有鍊錶的好處,也有陣列的好處,因此在處理大批量的動態的資料是比較有用。
種樹定義
平衡二叉樹的嚴格平衡策略以犧牲建立查詢結構(插入,刪除操作)的代價,換來了穩定的o(logn) 的查詢時間複雜度。紅黑樹採用了折中策略,即不犧牲太大的建立查詢結構的代價,同時又能保證穩定高效的查詢效率。
查詢效能
由於紅黑樹的性質(最長路徑長度不超過最短路徑長度的 2 倍),可以說明紅黑樹雖然不像平衡二叉樹一樣是嚴格平衡的,但平衡效能還是要比二叉搜尋樹要好。其查詢代價基本維持在 o(logn) 左右,但在最差情況下(最長路徑是最短路徑的 2 倍少 1),比平衡二叉樹效率低一些。
插入效能
紅黑樹插入結點時,需要旋轉操作和變色操作。但由於只需要保證紅黑樹基本平衡就可以了。因此插入結點最多隻需要2次旋轉,這一點和平衡二叉樹的插入操作一樣,但是變色操作的時間複雜度為o(logn)。
刪除效能
紅黑樹的刪除操作代價要比平衡二叉樹要好的多,刪除乙個結點最多隻需要 3 次旋轉操作,保證了刪除時間複雜度維持在常量級。
應用場景
應用場景有很多。
種樹
定義b樹是一種多路平衡查詢樹,在相同資料數目情形下,b樹的高度更小,這樣就減少了磁碟的io次數,在檔案系統以及資料庫索引等場景下提公升了查詢效率。
查詢效能
b樹的查詢分成兩種:一種是從乙個結點查詢另一結點的位址的時候,需要定位磁碟位址(查詢位址),查詢代價極高。另一種是將結點中的有序關鍵字序列放入記憶體,進行優化查詢(可以用折半),相比查詢代價極低。而b樹的高度很小,因此在這一背景下,b樹比任何二叉結構查詢樹的效率都要高很多。
插入效能
b樹的插入會發生結點的**操作。當插入操作引起了 s 個節點的**時,磁碟訪問的次數為 h (讀取搜尋路徑上的節點) +2s (回寫兩個**出的新節點) +1(回寫新的根節點或插入後沒有導致**的節點)。因此,所需要的磁碟訪問次數是 h+2s+1,最多可達到 3h+1。因此插入的代價較大。
刪除效能
b樹的刪除會發生結點合併操作。最壞情況下磁碟訪問次數是 3h=(找到包含被刪除元素需要h次讀訪問)+(獲取第2至h層的最相鄰兄弟需要h-1次讀訪問)+(在第3至h層的合併需要h-2次寫訪問)+(對修改過的根節點和第2層的兩個節點進行3次寫訪問)。
應用場景
b樹/b+樹主要用於磁碟檔案組織 資料索引和資料庫索引等場景。
種樹
定義b+樹是b-樹的一種變體,b+樹相比b-樹的特點:
(1)索引節點的key值均會出現在葉子節點中。查詢效能(1)在相同數量的待查資料下,b+樹查詢過程中需要呼叫的磁碟io操作要少於普通b-樹。由於b+樹所在的磁碟儲存背景下,因此b+樹的查詢效能要好於b-樹。(2)索引節點中的key值在葉子節點中或者為最大值或者為最小值。
(3)葉子節點使用單鏈表的形式鏈結起來。
(2)b+樹的查詢效率更加穩定,因為所有葉子結點都處於同一層中,而且查詢所有關鍵字都必須走完從根結點到葉子結點的全部歷程。因此同一顆b+樹中,任何關鍵字的查詢比較次數都是一樣的。而b樹的查詢是不穩定的。
插入效能
b+樹的插入過程與b樹類似,效能也基本一致。
刪除效能
刪除效能與b樹也基本一致。
應用場景
b樹/b+樹主要用於磁碟檔案組織 資料索引和資料庫索引等場景。
種樹
定義給定 n 個權值作為 n 個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為霍夫曼樹(huffman tree)。
霍夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
應用場景
霍夫曼樹主要用於霍夫曼編碼,進行資料壓縮領域。
霍夫曼編碼
end今日互動,上面這六種樹中,你爬過哪幾種樹?
明天就是植樹節
想起來明天又是乙個植樹節了,北京這兩天氣溫突然拉公升,中午都快有20度了,搞得街上一群人還穿著厚厚的棉襖,哈哈誰叫有種說法 捂秋凍呢。天有點幹,印象中有個把月沒有下雨了,從上週開始喉嚨就出奇的疼,慢慢的說話都困難了,沒辦法上周五在家休息了一天,可是還是沒有好轉,我只好週六放棄上課 嘿嘿,我還是很想去...
植樹節,種個二叉樹吧?
植樹節,種個二叉樹吧?3 月 12 號,是全國的重大節日 植樹節,記得小時候就跟隨老師一起植過樹。現在參加工作了,雖然沒有植過樹,但是學到過很多樹的結構,比如二叉樹 b 樹,紅黑樹。每次面試必問,恰逢植樹節,這裡給大家做個二叉樹的總結,也方便自己複習。比如現在有個陣列,存放了很多使用者的名字,需要從...
京東物流「青流計畫」 助力植樹節
3月12日下午,西安國際港務區出現了一批盛滿有機化肥的綠色生態箱。在第40個植樹節到來之際,國際港務區組織開展了自建區以來的第9個植樹節活動 貢獻陸港一抹綠,共享美麗大西安 主題義務植樹活動。值得一提的是,京東物流為了積極響應綠色環保主題,特意使用可迴圈快遞箱運輸有機化肥,這種更輕便更堅固的快遞箱是...