数据结构是可以被串起来的,每新出现一种新的数据结构或者算法肯定是前面的存在一些不足,新提出的可以对其进行改进,多问自己为什么要有这种数据结构/算法,这样子就有利于将知识点串联起来,知识点不再是孤立地散布在大脑中,调用起来也会更快。
在查找的章节,可以按照如下的知识点串联起来,学起来会更加容易一点。
查找数据结构和算法
首先介绍了顺序表(可以理解为数组)查找,首先从最简单的数据无序可以找起,其复杂度为O(n),显然我们是不满意的,于是我们可以想到将数据进行排序可能会加快查找的速度,接下来是数据有序的情况找起,一共有三种查找的方法,二分法、插值法、Fabonacci法,三种方法大同小异,只不过是每次分开数据的节点不同而已,这时的已经变为时间复杂度为O(lgn),当然我们在一开始的时候要对数据进行排序。这个时候我们还发现一个问题,顺序表查找在删除和插入的时候时间复杂度是O(n)(看见有没有,一路下来都是发现问题,针对问题设计新的方案),于是我们引入了搜索二叉树(BST)。网上搜文的时候发现有人说搜索二叉树是为了加快搜索的速度,那么我就要问他,为什么不用有序排序的顺序表?搜索二叉树数据结构比起一个简单的数组可是要比较复杂,显然搜索二叉树并不是为了加快搜索速度,仅仅为此,我们用有序排序的顺序表查找就可以了。甚至严格来说,搜索二叉树的时间复杂度跟其高度有关,不完全是O(lgn)。搜索二叉树是为了加快顺序表删除和插入操作。引入搜索二叉树后,我们可知,其搜索、插入、删除都与其高度有关,对于满/完全二叉树来说,高度接近lgn,但却存在为单链的情况,这时高度为n,各种操作的复杂度都是O(lgn)。因此我们又引入平衡二叉树,平衡二叉树可以尽量平衡整棵二叉树,注意不是将其弄成满/完全二叉树,那这样子操作起来比较复杂,我们只要求尽量平衡。每次在插入和删除节点的时候,都检查树是否违反了平衡二叉树的定义(平衡因子绝对值小于2),如果是对检测地方进行旋转,于是得到的树整体仍然可以比较平衡,高度比较低。那现在总归可以了吧,各种操作时间复杂度都是O(lgn)。然而在查找的数据多到内存装不下的时候,我们每次判断一个节点就要到硬盘进行读取一次数据,这样子耗时是非常多的,硬盘读取的速度跟内存读取速度相差10^5倍,大概是1天和1秒的区别,因此又有了多路查找树(2-3数、3-3-4树、B树)。多路查找树在每个节点放多个数据,我们可以一次性读取多个,“一棵B个树的阶为1001(即一个节点包含1000个关键字),高度为2,它可以存储超过10亿个关键字……读取两次硬盘即可…….”。
数据结构
总结
如果你已经对查找的各种数据结构建立起了以上的知识结构,那么下次需要遇到查找相关的问题,你的思路收敛起来是比较快的,而不是像一团浆糊,比如问你。
在解决一个新的问题,我们首先对其进行简化后模式识别,看该问题跟其他已经遇到的问题,学过的知识点是否有共通之处,如果有我们便能够对其比较快地进行解决。(如果没有,那就真的靠的是智商了,不过大部分情况下,我们还是在脑子搜索是否遇到类似的问题)而识别的快慢,能否识别起来,靠的是我们的学习能力,学习的时候你是否有将这些知识点进行归纳整理。所以大部分情况下,想问题想的慢可能要归咎于学习能力的问题。