DB_Algorithm_and_Data_Structure_About_BTree

2,713 views

Published on

数据库算法与数据结构系列(一)——B树相关

Published in: Technology
0 Comments
10 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,713
On SlideShare
0
From Embeds
0
Number of Embeds
755
Actions
Shares
0
Downloads
129
Comments
0
Likes
10
Embeds 0
No embeds

No notes for slide
  • 从基础到最后的重点,我们依次从树的基本概念,到最基本的查找树 —— 二叉查找树,再从二叉树的最差特例分析平衡二叉树的必要性和优势,然后引申到普通的平衡树 —— 红黑树, 然后介绍最像 B 树的线段树, 最后综合前面的基础,介绍 B-/+Tree 的实现算法和数据结构。
  • 非重点
  • 非重点
  • 非重点
  • 例如左图, 3 的子树,左节点 2 比 3 小,右结点 5 比 3 大。 5 的左子树节点 3 比 5 小,右结点 7 比 5 大。
  • 非重点
  • 例如查找 9 ,从根节点开始, 9 比 15 小,走左子树, 9 比 6 大走右子树, 9 比 7 大,走右子树, 9 比 13 小,走左子树,最终找到 9.
  • 非重点
  • 非重点
  • 非重点
  • 例如插入 13 ,先跟根节点比, 13 比 12 大,走右子树, 13 比 18 小,走左子树, 13 比 15 小,挂到 15 的左子树。
  • 非重点
  • 当删除节点为叶子节点时,直接拿掉节点,剩下的子树依然是二叉查找树。如果删除的节点只有 1 个子树,那么删除节点并且把子树接到节点的父节点,形成的依然是二叉查找树。如果要删除的节点左右子树均有,那么在左右子树中寻找一个在左右子树根节点的区间范围内的一个只有一个子树(或叶子节点)的节点换到要删除的位置即可。
  • 平凡的二叉查找树,树的形状依赖于元素进入的顺序。
  • 非重点
  • 非重点
  • 非重点
  • 非重点
  • 非重点
  • 非重点
  • 非重点
  • 非重点
  • 重点
  • 非重点
  • B 树从原理上跟线段树很相似, B 树实际上是在每个节点控制了多个区间,查找时先在节点上遍历到所属的区间,再根据指针到指向的下个节点中继续遍历。
  • B 树依靠分裂节点来达近似平衡的目的。
  • 重点
  • 重点。修改操作呢?先删除再添加一个节点不就行了么
  • B+ 树的非叶子节点实际上不存储任何有意义的信息,只用于区分区间,所有信息全部在叶子节点,并且每个叶子节点都有一个指针指向后继的节点。
  • DB_Algorithm_and_Data_Structure_About_BTree

    1. 1. 数据结构与算法 —— B 树相关 MySQL DBA 彭立勋
    2. 2. <ul><li>树的基本概念 </li></ul><ul><li>查找树的基本操作 </li></ul><ul><li>二叉搜索树 </li></ul><ul><li>平衡二叉树 </li></ul><ul><li>平衡树算法 (AVL/Treep/Splay) </li></ul><ul><li>红黑树 </li></ul><ul><li>线段树 </li></ul><ul><li>B 树原型 </li></ul><ul><li>B+ 树 </li></ul>将要介绍什么?
    3. 3. 树的基本概念 <ul><li>树是 n(n>=0) 个结点的有限集。 </li></ul><ul><li>在任意一棵非空树中: </li></ul><ul><li>(1) 有且仅有一个特定的称为根的结点; </li></ul><ul><li>(2) 当 n>1 时 , 其余结点可分为 m(m>0) 个互不相交的有限集 T1,T2,...Tm, 其中每一个集合本身又是一棵树 , 并且称为根的子树 . </li></ul><ul><li>补充 :从图来定义,树是一个无环的连通无向图。 </li></ul>
    4. 4. 查找树的基本操作( 1 ) <ul><li>SEARCH(S,k) :返回有限集 S 中一个关键字为 k 的元素的指针 x 。即 key[x]=k 。 </li></ul><ul><li>INSERT(S,x) :将由 x 指向的元素添加到 S 。 </li></ul><ul><li>DELETE(S,x) :将由 x 指向的元素从 S 中删除。 </li></ul><ul><li>MINIMUM(S) :返回全序集 S 中具有最小关键字的元素指针。 </li></ul><ul><li>MAXIMUM(S) :返回全序集 S 中具有最大关键字的元素指针。 </li></ul>
    5. 5. 查找树的基本操作( 2 ) <ul><li>SUCCESSOR(S,x) (后继):返回全序集 S 中比 x 大的下一个元素的指针。 </li></ul><ul><li>PREDECESSOR(S,x) (前驱):返回全序集 S 中比 x 小的上一个元素的指针。 </li></ul>
    6. 6. 二叉查找树 <ul><li>定义:任取一颗子树,根节点都比左节点大(小),比右结点小(大)。递归定义 </li></ul>
    7. 7. 二叉查找树 <ul><li>搜索二叉查找树 (复杂度 O(LogN) ) </li></ul><ul><li>TREE-SEARCH ( x, k) </li></ul><ul><li>1 if x= NIL or k = key[x] </li></ul><ul><li>2 then return x </li></ul><ul><li>3 if k < key[x] </li></ul><ul><li>4 then return TREE-SEARCH( left[x], k) </li></ul><ul><li>5 else return TREE-SEARCH( right[x], k) </li></ul>
    8. 8. 二叉查找树 <ul><li>搜索的例子 </li></ul>
    9. 9. 二叉查找树 <ul><li>获取最大 / 最小关键字元素 (复杂度 O(LogN) ) </li></ul><ul><li>TREE-MINIMUM ( x) /* TREE-MAXIMUM( x)*/ </li></ul><ul><li>1 while left[x] ≠ NIL /* while right[x] ≠ NIL*/ </li></ul><ul><li>2 do x ← left[x] /* do x ← right[x]*/ </li></ul><ul><li>3 return x </li></ul>
    10. 10. 二叉查找树 <ul><li>获取前驱 / 后继 (复杂度 O(LogN) ) </li></ul><ul><li>TREE-SUCCESSOR( x) </li></ul><ul><li>1 if right[x] ≠ NIL </li></ul><ul><li>2 then return TREE-MINIMUM ( right[x]) </li></ul><ul><li>3 y ← p[x] </li></ul><ul><li>4 while y ≠ NIL and x = right[y] </li></ul><ul><li>5 do x ← y </li></ul><ul><li>6 y ← p[y] </li></ul><ul><li>7 return y </li></ul>
    11. 11. 二叉查找树 <ul><li>插入元素 (复杂度 O(LogN) ) </li></ul><ul><li>TREE-INSERT(T, z) </li></ul><ul><li>1 y ← NIL </li></ul><ul><li>2 x ← root[T] </li></ul><ul><li>3 while x ≠ NIL </li></ul><ul><li>4 do y ← x </li></ul><ul><li>5 if key[z] < key[x] </li></ul><ul><li>6 then x ← left[x] </li></ul><ul><li>7 else x ← right[x] </li></ul><ul><li>8 p[z] ← y </li></ul><ul><li>9 if y = NIL </li></ul><ul><li>10 then root[T] ← z ⊹ Tree T was empty </li></ul><ul><li>11 else if key[z] < key[y] </li></ul><ul><li>12 then left[y] ← z </li></ul><ul><li>13 else right[y] ← z </li></ul>
    12. 12. 二叉查找树 <ul><li>插入操作的例子 </li></ul>
    13. 13. 二叉查找树 <ul><li>删除元素(复杂度 O(LogN) ) </li></ul><ul><li>TREE-DELETE(T, z) </li></ul><ul><li>1 if left[z] = NIL or right[z] = NIL </li></ul><ul><li>2 then y ← z </li></ul><ul><li>3 else y ← TREE-SUCCESSOR(z) </li></ul><ul><li>4 if left[y] ≠ NIL </li></ul><ul><li>5 then x ← left[y] </li></ul><ul><li>6 else x ← right[y] </li></ul><ul><li>7 if x ≠ NIL </li></ul><ul><li>8 then p[x] ← p[y] </li></ul><ul><li>9 if p[y] = NIL </li></ul><ul><li>10 then root[T] ← x </li></ul><ul><li>11 else if y = left[p[y]] </li></ul><ul><li>12 then left[p[y]] ← x </li></ul><ul><li>13 else right[p[y]] ← x </li></ul><ul><li>14 if y ≠ z </li></ul><ul><li>15 then key[z] ← key[y] </li></ul><ul><li>16 copy y's satellite data into z </li></ul><ul><li>17 return y </li></ul>
    14. 14. 二叉查找树 <ul><li>删除操作的例子 </li></ul>
    15. 15. 二叉查找树 <ul><li>可能出现的特例:偏树 </li></ul><ul><li>算法蜕化: O(LogN)->O(N) </li></ul>
    16. 16. 平衡二叉树 <ul><li>平衡二叉树本质上是一颗二叉查找树,但是它是严格平衡的,即任一结点的左右子树高度差不超过 1. </li></ul>
    17. 17. 平衡二叉树 <ul><li>为什么要平衡 </li></ul>随机生成的二叉查找树 经过多次插入 / 删除操作之后
    18. 18. 平衡二叉树 <ul><li>为什么要任一结点的左右子树高度差不超过 1 而不只是根节点 </li></ul>
    19. 19. 平衡树算法 (AVL) <ul><li>AVL 树,严格平衡的二叉树旋转算法 </li></ul>
    20. 20. 平衡树算法 (AVL) <ul><li>单旋转(左旋 / 右旋) </li></ul>
    21. 21. 平衡树算法 (AVL) <ul><li>双旋转(左右旋,右左旋) </li></ul>
    22. 22. 平衡树算法 ( 其他 ) <ul><li>Splay :伸展树,也是利用旋转的方法,但是只做单旋转。 </li></ul><ul><li>Treep :为每个节点附加一个随机的优先级,规定优先级必须满足堆的性质的前提下对关键字执行基本二叉查找树的算法。 </li></ul>
    23. 23. 红黑树 <ul><li>红黑树是一种二叉查找树,但在每个节点上增加一个存储位表示结点的颜色,可以使 RED/BLACK 。通过对任何一条从根节点到叶子的路径上各个着色方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因而是接近平衡的。 </li></ul>
    24. 25. 线段树 <ul><li>使用区间作为节点构成的查找树 </li></ul><ul><li>适用于区间统计计算和动态统计 </li></ul>
    25. 26. B 树原型 <ul><li>B 树与红黑树的不同在于, B 树 的节点可以有许多子节点,所以 B 树的分支因子可能很大。 </li></ul>
    26. 27. B 树原型 <ul><li>分裂操作:当节点不能再增加元素时,节点会分裂成两个节点 </li></ul>
    27. 28. 插入操作
    28. 29. 删除操作
    29. 30. B+ 树 <ul><li>在叶子节点上添加指向下一个节点的指针 </li></ul><ul><li>非叶子节点不保存实际关键字信息 </li></ul>
    30. 31. 数据库算法与数据结构系列 <ul><li>B 树相关 </li></ul><ul><li>排序相关 </li></ul><ul><li>锁相关 </li></ul><ul><li>缓存相关 </li></ul><ul><li>* 操作系统相关 ( 调度模型 / 段页管理 ) </li></ul><ul><li>* 人工智能相关 ( 遗传算法 / 神经网络 ) </li></ul>
    31. 32. 数据库原理系列 <ul><li>笛卡尔积与集合理论 </li></ul><ul><li>数据库范式理论 </li></ul><ul><li>分布式事务理论 </li></ul>

    ×