植樹節,程式設計師要爬哪些“樹”?
作者 | 程式猿小吳、進擊的Hello_World
轉載自五分鐘學演算法(ID: CXYxiaowu)
公曆 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) 。
應用場景
二叉排序樹就既有連結串列的好處,也有陣列的好處,因此 在處理大批量的動態的資料是比較有用。
種樹
平衡二叉樹
定義
平衡二叉樹是一種特殊的二叉搜尋樹。平衡二叉樹保證節點平衡因子的絕對值不超過1,保證了樹的平衡。
查詢效能
平衡二叉樹是嚴格平衡的,那麼查詢過程與二叉搜尋樹一樣,只是平衡二叉樹不會出現最差的單支樹情形。因此查詢效率最好,最壞情況時間複雜度為 O(logN) 。
插入效能
插入資料之前需要進行查詢操作,查詢到插入位置。插入資料後需要進行旋轉操作,旋轉操作複雜度為常量級。因此插入資料的時間複雜度與查詢相同為 O(logN)。
刪除效能
刪除資料同樣需要查詢資料,在刪除資料後需要進行調整。一次刪除最多需要需要O(logN)次旋轉,因此刪除資料的時間複雜度為O(logN)+O(logN)=O(2logN)。
應用場景
SGI/STL的 set/map 底層都是用紅黑樹(平衡二叉樹的一種)實現的。
種樹
紅黑樹
定義
平衡二叉樹的嚴格平衡策略以犧牲建立查詢結構(插入,刪除操作)的代價,換來了穩定的O(logN) 的查詢時間複雜度。紅黑樹採用了折中策略,即不犧牲太大的建立查詢結構的代價,同時又能保證穩定高效的查詢效率。
查詢效能
由於紅黑樹的性質(最長路徑長度不超過最短路徑長度的 2 倍),可以說明紅黑樹雖然不像平衡二叉樹一樣是嚴格平衡的,但平衡效能還是要比二叉搜尋樹要好。其查詢代價基本維持在 O(logN) 左右,但在最差情況下(最長路徑是最短路徑的 2 倍少 1),比平衡二叉樹效率低一些。
插入效能
紅黑樹插入結點時,需要旋轉操作和變色操作。但由於只需要保證紅黑樹基本平衡就可以了。因此插入結點最多隻需要2次旋轉,這一點和平衡二叉樹的插入操作一樣,但是變色操作的時間複雜度為O(logN)。
刪除效能
紅黑樹的刪除操作代價要比平衡二叉樹要好的多,刪除一個結點最多隻需要 3 次旋轉操作,保證了刪除時間複雜度維持在常量級。
應用場景
應用場景有很多。
Java 中的 TreeSet ,TreeMap,HashMap
C++ 的 STL中的 map 和 set 都是用紅黑樹實現的
epoll 在核心中的實現,用紅黑樹管理事件塊
nginx 中,用紅黑樹管理 timer 等
linux 程式排程 Completely Fair Schedule r,用紅黑樹管理程式控制塊
種樹
B 樹
定義
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+樹相比B-樹的特點:
(1)索引節點的key值均會出現在葉子節點中。
(2)索引節點中的key值在葉子節點中或者為最大值或者為最小值。
(3)葉子節點使用單連結串列的形式連結起來。
查詢效能
(1)在相同數量的待查資料下,B+樹查詢過程中需要呼叫的磁碟IO操作要少於普通B-樹。由於B+樹所在的磁碟儲存背景下,因此B+樹的查詢效能要好於B-樹。
(2)B+樹的查詢效率更加穩定,因為所有葉子結點都處於同一層中,而且查詢所有關鍵字都必須走完從根結點到葉子結點的全部歷程。因此同一顆B+樹中,任何關鍵字的查詢比較次數都是一樣的。而B樹的查詢是不穩定的。
插入效能
B+樹的插入過程與B樹類似,效能也基本一致。
刪除效能
刪除效能與B樹也基本一致。
應用場景
B樹/B+樹主要用於磁碟檔案組織 資料索引和資料庫索引等場景。
種樹
霍夫曼樹
定義
給定 n 個權值作為 n 個葉子結點,構造一棵二叉樹,若該樹的帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為霍夫曼樹(Huffman Tree)。
霍夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。
應用場景
霍夫曼樹主要用於霍夫曼編碼,進行資料壓縮領域。
今日互動,上面這六種樹中,你爬過哪幾種樹?
◆
線上分享會
◆
分享者:董文馨(00後,暢銷書“你也能看得懂的Python演算法書”作者之一。史丹佛大學計算機系和劍橋大學雙Offer。)
最短路徑問題在我們生活中無處不在,本次分享將會用四個不同的Python演算法解決最短路徑問題,並且分析每一個演算法在實際應用中的利與弊。
推薦閱讀:
❤點選“閱讀原文”,檢視歷史精彩文章。
相關文章
- 植樹節主題PPT模板,可以來領取了!
- 程式設計師的聖誕節--送她一顆聖誕樹(附原始碼)程式設計師原始碼
- 程式設計師的聖誕節–送她一顆聖誕樹(附原始碼)程式設計師原始碼
- Python程式設計 聖誕樹教程 (附程式碼)程式設計師的浪漫Python程式設計師
- 樹莓派GUI程式設計樹莓派GUI程式設計
- 植樹節營銷活動策劃方案線上製作分享
- 高階Java程式設計師要具備哪些知識Java程式設計師
- 樹莓派的GPIO程式設計樹莓派程式設計
- 梨樹種植,樹苗常發生的幾種蟲害DJSJS
- 程式設計師節快樂程式設計師
- Android程式設計師會遇到的演算法(part 5 字典樹)Android程式設計師演算法
- ui設計師要懂哪些B端設計原則?UI
- 樹,計算父節點的值
- 【1024程式設計師節】程式設計師,你學程式設計的初衷是什麼?程式設計師
- 一個合格的web前端程式設計師要學會哪些技能?Web前端程式設計師
- 屬於每個程式設計師的節日,1024程式設計師節程式碼敲響世界程式設計師
- 1024程式設計師節:向改變世界的程式設計師致敬程式設計師
- 「程式設計師小漫畫」 之 程式設計師眼中的聖誕節和萬聖節程式設計師
- 1024程式設計師節,向用程式碼改變世界的程式設計師致敬!程式設計師
- 團體程式設計天梯賽-玩轉二叉樹(簡潔建樹)程式設計二叉樹
- 程式設計師節只有程式設計師才能看懂的祝福語程式設計師
- 1024程式設計師節,向1G棒的程式設計師致敬!程式設計師
- 程式設計師的技能樹,決定了一生職業的高度程式設計師
- #1024程式設計師節#之最近感想....程式設計師
- 【1024程式設計師節】為什麼有些程式設計師下班比你早?程式設計師
- 成為ui設計師要培訓哪些技能呢?UI
- 好程式設計師Java分享零基礎學Java要掌握哪些技能?程式設計師Java
- 學習Shell程式設計要掌握哪些基礎?linux運維工程師前景程式設計Linux運維工程師
- 谷歌程式設計師有哪些高效的程式設計習慣?谷歌程式設計師
- IT程式設計師面試技巧有哪些?程式設計師面試
- B+樹要點梳理
- ui設計師要養成哪些職場習慣呢?UI
- 1024程式設計師節即將到來,致敬那些默默工作的程式設計師們程式設計師
- 程式設計師高薪盛宴背後:未來有哪些程式設計師會被淘汰?程式設計師高薪
- angular primeng 樹節點 tree預設保持展開Angular
- 中國程式設計師為什麼要跳槽?程式設計師
- 程式設計師壓力那麼大,為什麼還要選擇做程式設計師程式設計師
- VUE 實現 Studio 管理後臺(七):樹形結構,檔案樹,節點樹共用一套程式碼 NodeTreeVue