前言
正文
二叉树
二分查找
种方法: 扫描法
第二种方法:二分法
问题:我不服,你这是偷换概念,有本事对比一个查找指定高度鹦鹉的性能。
log2(n)
。问题:如果按高矮排队,仍然需要一个一个比较,跟扫描有什么区别,那还不如直接扫描呢?
查找快
必须有序,需要提前排序
-
每次查找都需要不断计算中间位置
二分查找树
平衡二叉树:
多叉树之 B-tree
找到根节点,对比 10 与 17 和 35 的大小,发现 10 < 17 在左子节点,也就是第 2 层节点;
从根节点的指针,找到左子节点,对比 10 与 8 和 12 的大小,发现 8 < 10 < 12,数据在当前节点的中间子节点,也就是第 3 层节点;
通过上步节点的指针,找到中间子节点(第 3 层节点),对比 10 与 9 和 10 的大小,发现 9 < 10 == 10,因此找到当前节点的第二数即为结果。
至此,我们列举的数据都是孤零零的单个数字。试想,你手里已经有一个数据 10,为什么还要费力吧唧的再从一堆数据中找到这个 10,自己找自己?这不是有病吗?
磁盘I/O
尽量减少 I/O 次数,比如可以使用缓存;
每次 I/O 尽量获取更多的数据;
-
每次 I/O 尽量获取有用的数据,当然相应的也间接减少总 I/O 次数;
多叉树之 B+tree
总结
数据存储在磁盘( SSD 跟 CPU 性能也不在一个量级),而磁盘处理数据很慢;
提高磁盘性能主要通过减少 I/O 次数,以及单次 I/O 有效数据量;
索引通过多阶(一个节点保存多个数据,指向多个子节点)使树的结构更矮胖,从而减少 I/O 次数;
索引通过 B+ 树,把业务数据与索引数据分离,来提高单次 I/O 有效数据量,从而减少 I/O 次数;
索引通过树数据的有序和「二分查找」(多阶树可以假设为多分查找),大大缩小查询范围;
索引针对的是单个字段或部分字段,数据量本身比一条记录的数据量要少的多,这样即使通过扫描的方式查询索引也比扫描数据库表本身快的多;
知识扩展
HashMap 中的数据冲突时,链表转化成红黑树;
数据库索引使用的 B+ 树;
搜索引擎倒排索引使用的字典树;