Day.29 其他树的介绍

树有非常多变型,下面是Wiki的截图
https://ithelp.ithome.com.tw/upload/images/20211004/20129767qi5HOb6z7l.png

以下简单介绍几种常听到的~

AVL TreesRed Black Trees

前几篇介绍的是最基本的二元树,但实际上不太会直接用到二元树,因为它不会做平衡,如果一直对它做insert,很容易就会歪一边,大大影响效能。之前有提到的两种比较常听到的平衡树,AVL Trees 和 Red Black Trees。
平衡树在做insert的时候,会做旋转操作(左旋,右旋等),根据值去调动节点的位置,让整个树一直保持在平衡的状态。
一般来说Red Black Trees在insert&delete上比AVL树有优势,AVL树则在serach有优势。

两种树的程序都很复杂,因为在插入跟删除的时候,都有很多case要处理,大家有兴趣可以再去研究
不过一般来说,我们有需要都会去github找package来用XD,很少情境要你去刻一个出来

B+ Tree

这一种就是MySQL InnoDB底层的资料结构
平衡二元树在搜寻的速度上的确很优秀,但不好去读取大量的资料,如果我们要去找id 1到20的资料,那就要搜寻20次。其次二元树每一个节点底下只可以有两个子节点,DB资料随便都几百万千万,这颗树的深度就很可怕了,这也会影响到搜寻的速度。

https://ithelp.ithome.com.tw/upload/images/20211004/20129767WPW1c9622d.png

而B+ Tree就解决了这些问题
最下面绿色的是真正的资料,以MySQL来说是一页,页跟页之间有做链结,每一页都有下一页的地址。以B+Tree来搜寻id 1到20的资料,我们就可以透过树来找到id 1的页在那,再从页里面照顺序找1~20的资料,就可以一次回传!树就是一个索引的概念,让我们可以快速找到页的位置~

图源在这一篇文章找的,内文写得很细,大家有兴趣可以看看~

Binary Heap

中文叫二元堆积,是为了解决Priority Queue的一种方式
那什麽是Priority Queue?
简单来说在队列里面加入权重,举个例假如一堆平民先进去排队,但权贵人土可以随时插队的概念(像打疫苗),又或者是待办清单,原本就照重要的程度去做排序,但突然有一个紧急的事情,就会插到清单最前面。

Min Heap (root为最小值)

            1         
         /      \        
       2         3                      
    /    \     /   \                 
   4      5   6     7               
  / \    / \                      
 8  9   10 11                     

Max Heap (root为最大值)

          11 
       /      \ 
     9         10
   /   \     /    \ 
  5      6   7      8
 / \    / \
1   2  3   4 

再做Heap sort就可以做出Priority Queue的效果,大家有兴趣再去研究~

今天先到这样~Bye


<<:  [Day 29] Trivy - 介绍、操作与导入CI/CD

>>:  Day21:使用 ws 实作讯息传递

Day 12 | 魔术方块AR游戏开发Part1 - 魔术方块建立

在上一篇文章中为各位介绍ARFoundation/ARCore,今天我们要来制作魔术方块AR游戏。 ...

Day 10:为你的 Hexo 增加页面:标签、分类与自订页面

昨天介绍新增文章,今天要来介绍新增页面。这两者有什麽差别呢?一般来说如果是跟网站有关的资讯、或是一些...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day5

tags: ItIron2021 Javascript 作者碎碎念 当时在用这一系列题目跑模拟面试活...

Day-27 手把手的手写面是模型 0x2:资料训练和结果输出

我们昨天成功拿到资料了,今天就要开始训练模型了 那由於我们当初在介绍 CNN 结构时的 code ...

[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(2)

前言 从上周末开始到周三,除了学习老师教的观察者模式(Observer Pattern)和几种排序方...