查找算法的简单总结

大学快毕业了,马上要找工作了,最近在网上找了些资料复习了一下,这里主要简单的总结一下查找算法

在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。
静态查找:数据集合稳定,不需要添加,删除元素的查找操作。
动态查找:数据集合在查找的过程中需要添加或删除元素。

顺序查找:大家都知道,最简单的查找方法就是顺序查找 (一个接一个得查下去)。这种线性结构的查找效率是最低的,时间复杂度在O(N)数量级,最坏的情况莫过于所有数据都

找遍了,还是没找到。

或许你会想到不一定每个数据都要找一次。

折半查找就是一个不错的例子,对有序的线性数据进行查找,每一次都找1/2的部分,查找的次数当然就大大减少了。时间复杂度在O(log2 N)数量级上。

但是如果某些特定的数据一年可能才查找几次,而有些数据一天可能都要查找几百次,这种折半查找效率又不行了

那就针对被查找的概率构建数据结构吧

静态最优查找树/次优查找树:次优查找树的思想就是在折半查找二叉树的基础上求解一个带权(数据概率)路径长度最小/近视最小的树。总体上说,静态最优/次优查找树的时间复

杂度也在 O(log2 N)数量级上(特别是在数据具有查找概率的情况下也能保证这个效率)

此外,还有一些别的静态查找结构:索引顺序表的分块查找,线性冲突再散列的hash表的查找等等。

上面介绍查找表都属于静态查找结构,也就是说当需要查找的数据集合动态变化的时候,这些结构都很不方便。 比如:折半查找: 当查找过程中没有发现元素A的时候,需要动态

添加元素A,此时整个有序表将面临重新排序的问题。
静态最优查找树: 新增元素不光要重新排序,而且原有的整棵带权路径长度最小值的树也将重建(最优解变化了)。这在代价上是沉重的,这也是为什么 静态最优查找树并不适

合实际应用的巨大缺陷了。

正是由于实际应用中,很多时候需要在查找的同时进行添加,删除操作。因此便捷的动态查找结构就十分的重要了,例如:二叉查找树,平衡二叉树,红黑树,B-树/B+树。

二叉查找树:查找一个数不必遍历所有结点数据,查找效率很高。但是最坏情况下,二叉查找树蜕变成一个单支数,树的深度为n,其查找时间复杂度与顺序查找一样O(N)。最好的

情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log2(N)成正比 (O(log2(n)))。
效率总结 : 查找最好时间复杂度O(logN),最坏时间复杂度O(N)。
插入删除操作算法简单,时间复杂度与查找差不多


所以平衡查找树就解决了二叉查找树不平衡的问题

平衡二叉树:又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(

平衡因子 ) 不超过1。也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。AVL保持平衡的基本思想就是在插入一个数据节点时,首先检查是否

破坏了平衡,若破坏,则找出其中的最小不平衡二叉树,在保持二叉排序树特性的情况下,调整最小不平衡子树中节点之间的关系,以达到新的平衡。所谓最小不平衡子树 指离插

入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。 这里调整的方法就是4钟旋转方法,根据不同的情况进行调整。平衡二叉树的优势在于不会出现普通二叉查找树的最

差情况。其查找的时间复杂度为O(logN)。但是为了保证高度平衡,动态插入和删除的代价也随之增加,其查找代价也与树高密切相关,还有就是在大量数据情况下,所有二叉查找

结构都不适合,因为将比如几G数据在内存中组织成一棵平衡二叉树基本不可能。
效率总结 : 查找的时间复杂度维持在O(logN),不会出现最差情况
AVL树在执行每个插入操作时最多需要1次旋转,其时间复杂度在O(logN)左右。
AVL树在执行删除时代价稍大,执行每个删除操作的时间复杂度需要O(2logN)。

正是上面提到的缺点,就有了深度有界查找树来解决。

红黑树:由于红黑树的一些性质就决定了红黑树的查找长度最多不超过2log(n+1),因此其查找时间复杂度也是O(log N)级别的。每一个红黑树也是一个特化的二叉查找树,因此红

黑树上的查找操作与普通二叉查找树上的查找操作相同。 然而,在红黑树上进行插入操作和删除操作会导致不 再符合红黑树的性质。恢复红黑树的属性需要少量(O(log n))的颜

色变更(实际是非常快速的)和不超过三次树旋转(对于插入操作是两次)。 虽然插入和删除很复杂,但操作时间仍可以保持为 O(log n) 次,所以红黑树的优势很明显。
效率总结 : 查找效率最好情况下时间复杂度为O(logN),但在最坏情况下比AVL要差一些,但也远远好于BST。
插入和删除操作改变树的平衡性的概率要远远小于AVL(RBT不是高度平衡的)。因此需要的旋转操作的可能性要小,而且一旦需要旋转,插入一个结点最多只需要旋转

2次,删除最多只需要旋转3次(小于AVL的删除操作所需要的旋转次数)。虽然变色操作的时间复杂度在O(logN),但是实际上,这种操作由于简单所需要的代价很小。


上面总结的都是典型的二叉查找树结构,其查找的时间复杂度与树高相关。那么降低树高自然对查找效率是有所帮助的。另外还有一个比较实际的问题:就是大量数据存储中,实

现查询这样一个实际背景下,平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。进而提出了多路查找树

平衡多路查找树:其性质就不在介绍了,主要思想就是每个节点存储多个元素,但是不是无限多,不然就成了节点内部的线性查找了,另外就是采用多叉树。一棵m阶的平衡多路查

找树和平衡二叉树不同的是,每次插入一个关键字并不是在树中上添加一个节点,而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插

入完成。否则,要产生结点的分裂 。
效率总结: 由于考虑磁盘储存结构,B树的查找、删除、插入的代价都远远要小于任何二叉结构树(读写磁盘次数的降低)

B+树:是应文件系统所需而产生的一种平衡多路查找树的变形树。B+树的叶子结点包含了所有待查询关键字,而非终节点只是作为叶子结点中最大(最小)关键字的索引。因此B+树

的非终结点没有文件内容所在物理存储的地址,而平衡多路查找树所有结点均有文件内容所在的磁盘物理地址。 这个特点是B+树的一个重要优势(B+树的磁盘读写代价更低,B+树

的查询效率更加稳定)所在。B+树在数据库,文件系统的索引结构中是十分常用的。
在应用背景下,特别是文件结构存储中。B+树的应用要更多,其效率也要比B~树好


上面介绍的几种动态查找树(二叉查找树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree))都是动态结构,在删除,插入操作的时候,都不需要彻底重建原始的索

引树。最多就是执行一定量的旋转,变色操作来有限的改变树的形态。而这些操作所付出的代价都远远小于重建一棵树, 查找的时间复杂度大体维持在O(log(N))数量级上。可能

有些结构在最差的情况下效率将会下降很快,比如上面说的二叉查找树最坏的情况。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值