最近群里有人问树.赶紧回头看了看大学的知识.感觉ACM没白得奖.回头捡起来也好捡.
这是数据结构/算法的东西了.科班出身的肯定都学过,没学过的那你可以拍大腿了.因为你学费白他么交了.哈哈哈
树和算法的作用:有人说:你这算法有个JB用,项目也用不到.我呵呵.我想说,如果你看一本书,没有目录,
你肯定会骂他,我***你****.老子想找个啥东西还得让老子挨页翻啊.对咯,算法和树,就是这个目录.
先普及一下知识:
根节点:就是树根,就一个,树杈子啥的,都是树根长出来的.
叶子节点:叶子节点就是最终的节点,叶子后面就是空气,就是啥也没有.
叉子节点: 这个是我自己起的...哈哈哈,不是根节点不是叶子节点,我就管它叫叉子节点
子节点:这个不好说了,就是根长出岔子,岔子节点就是根节点的子节点,岔子长叶子,叶子就是岔子的子节点.
二叉树:对,就是最多只有两个叉的树.真特么简单...哈哈哈,你肯定深深鄙视了我,但是就是这么简单
BST 二叉搜索树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
你想找个东西顺藤摸瓜就好
B树= B-树:多路搜索树(并不一定是二叉的),别看个减号就觉得它简单些,这个就高端了,因为B树每个节点一个关键字.
注: B树就是B-树 因为B树 英文对应 B-Tree
B树与BST的差别就是 B树好多叉,好多节点 为啥? 因为找节点是磁盘IO, 磁盘IO慢, 对比节点大小是内存对比,快的很.为了减少磁盘IO次数
例子:B-树每个节点可以好几个关键字,假如B-树根节点是三个关键字 7 77 777 ,那它就会分四个叉,第一个叉小于7,第二个叉
7-77之间.第三个第四个你就应该懂了,每个叉里面还扔进去三个关键字.建成一个树按此规律排列就好.
B-树的特性:
1.关键字集合分布在整颗树中;
2.任何一个关键字出现且只出现在一个结点中;
3.搜索有可能在非叶子结点结束;
4.其搜索性能等价于在关键字全集内做一次二分查找;
5.自动层次控制;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点
中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
例子:有点难懂,就是排列规律和B-树相似,B-树没有重复的数字,但是B+有.B+每一个叉都会包含上一个节点的某个数字.
假如B+根节点是7 77 777 也分四个叉,第一个叉小于等于7(因为7==7,故7在叉上),第二个数大于7,小于等于77(77在叉上)
小于等于7的那个叉(也就是第一个叉)假如是3 5 7 ,3再分叉就是小于等于3(3在叉里),再分到不能分了,就是子节点了.树最左面的枝是:
根节点:7 77 777 最左面第一层叉: 3 5 7,最左面第二层叉: 1 2 3.
你肯定问:卧槽,这么麻烦,要它何用,这样的好处就是所有的数据都在叶子节点上,树杈子只作为索引.这样减少了叉子的体积.
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好
是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储
(关键字)数据的数据层;
4.更适合文件索引系统;
B*树:在B+树基础上,为叉子结点也增加链表指针,将结点的最低利用率从1/2提高到2/3;
就是B+只能顺着往下找到叶子节点才算完,不能找树杈子的兄弟.现在能找树杈子的兄弟节点了,好处是,一个叉子节点满了,
再加内容的话,直接可以加在兄弟叉子上.所以,B*树分配新结点的概率比B+树要低,空间使用率更高;