1. 程式人生 > 實用技巧 >「易天說」(10-10)雙十之日 比特幣再次起飛 空單何去何從?

「易天說」(10-10)雙十之日 比特幣再次起飛 空單何去何從?

B和B+樹

image.png

樹中有些節點是有多個元素的,並且和二叉查詢樹一樣,左節點的所有元素的值都比父親元素小。例如對於(3, 7)這個節點。兩個元素把這個節點分割成三個值域,即可以有 3 個孩子。2 相當於 3 的左孩子節點,而 (4,6)相當於 3 的右孩子,同時也是 7 的左孩子,而 9 是 7 的右孩子。

image.png

注意一下B樹的兩個明顯特點

  • 樹內的每個節點都儲存資料
  • 葉子節點之間無指標相鄰

image.png

注意一下B+樹的兩個明顯特點

  • 資料只出現在葉子節點
  • 所有葉子節點增加了一個鏈指標

針對上面的B+樹和B樹的特點,我們做一個總結

(1)B樹的樹記憶體儲資料,因此查詢單條資料的時候,B樹的查詢效率不固定,最好的情況是O(1)。我們可以認為在做單一資料查詢的時候,使用B樹平均效能更好。但是,由於B樹中各節點之間沒有指標相鄰,因此B樹不適合做一些資料遍歷操作。

(2)B+樹的資料只出現在葉子節點上,因此在查詢單條資料的時候,查詢速度非常穩定。因此,在做單一資料的查詢上,其平均效能並不如B樹。但是,B+樹的葉子節點上有指標進行相連,因此在做資料遍歷的時候,只需要對葉子節點進行遍歷即可,這個特性使得B+樹非常適合做範圍查詢。

因此,我們可以做一個推論:沒準是Mysql中資料遍歷操作比較多,所以用B+樹作為索引結構。而Mongodb是做單一查詢比較多,資料遍歷操作比較少,所以用B樹作為索引結構。

那麼為什麼Mysql做資料遍歷操作多?而Mongodb做資料遍歷操作少呢?

因為Mysql是關係型資料庫,而Mongodb是非關係型資料

紅黑樹

紅黑樹本質上是一種二叉查詢樹,但它在二叉查詢樹的基礎上額外添加了一個標記(顏色),同時具有一定的規則,這些規則使紅黑樹保證了一種平衡,插入、刪除、查詢的最壞時間複雜度都為O(logn)

每個節點增加一個儲存位表示節點的顏色

它的統計效能要好於平衡二叉樹(AVL樹),紅黑樹在很多地方都有應用,比如在集合框架中,很多部分(HashMap, TreeMap, TreeSet 等)都有紅黑樹的應用,這些集合均提供了很好的效能

基本特性

每個節點要麼是紅色,要麼是黑色

根節點永遠是黑色的

所有的葉節點都是是黑色的

每個紅色節點的兩個子節點一定都是黑色

不可能有連在一起的紅色結點(黑色的就可以),每個葉子節點都是黑色的空節點(NIL),也就是說,葉子節點不儲存資料

從任一節點到其子樹中每個葉子節點的路徑都包含相同數量的黑色節點

紅黑樹調整可以分為兩類:

一類是顏色調整,即改變某個節點的顏色,這種比較簡單,直接將節點顏色進行轉換即可

另一類是結構調整,改變檢索樹的結構關係,結構調整主要包含兩個基本操作:左旋,右旋

與平衡二叉樹區別

AVL樹是高度平衡的,頻繁的插入和刪除,會引起頻繁的reblance,導致效率下降紅黑樹不是高度平衡的,算是一種折中,插入最多兩次旋轉,刪除最多三次旋轉

應用場景

AVL樹適合用於插入與刪除次數比較少,但查詢多的情況,Windows NT核心中廣泛存在

紅黑樹確保沒有一條路徑會比其它路徑長出兩倍,因此,紅黑樹是一種弱平衡二叉樹(由於是弱平衡,可以看到,在相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數少,所以對於搜尋,插入,刪除操作較多的情況下,我們就用紅黑樹

IO多路複用的epoll的的的實現採用紅黑樹組織管理的的的sockfd,以支援快速的增刪改查。