大学快毕业了,马上要找工作了,最近在网上找了些资料复习了一下,这里主要简单的总结一下查找算法
在计算机许多应用领域中,查找操作都是十分重要的研究技术。查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。
静态查找:数据集合稳定,不需要添加,删除元素的查找操作。
动态查找:数据集合在查找的过程中需要添加或删除元素。
顺序查找:大家都知道,最简单的查找方法就是顺序查找 (一个接一个得查下去)。这种线性结构的查找效率是最低的,时间复杂度在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))数量级上。可能
有些结构在最差的情况下效率将会下降很快,比如上面说的二叉查找树最坏的情况。
分享到:
相关推荐
在描述中提到的改进方案是将折半查找算法扩展为“段查找算法”,即将查找表分成多个段,而不是简单的两半。这个改进的目的是通过调整段的数量来优化平均查找长度。研究表明,当查找表被分成3段时,平均查找长度达到...
总结来说,掌握这些基本查找算法对于理解数据结构和算法的基础至关重要。在实际应用中,开发者需要根据数据的特性、查询需求以及性能要求来选择合适的查找算法,以优化程序性能。通过实验和实践,不仅可以深化理论...
本文总结了常见的查找算法和排序算法,包括顺序查找、二分查找、选择排序、冒泡排序、二分排序、插入排序、希尔排序、堆排序、归并排序等。 一、查找算法 1. 顺序查找(Sequential Search) 顺序查找是一种简单...
本篇文章总结了几种常用的查找算法,包括静态查找、顺序查找、索引顺序表查找、折半查找和次优查找树等。这些算法都是在C语言中实现的,旨在帮助读者更好地理解和应用这些查找算法。 一、静态查找 静态查找是指在...
排序查找算法总结 排序算法是计算机科学中的一种基本算法,用于对数据进行排序。在各种排序算法中,每种算法都有其特点和应用场景。本文将对10种经典的排序算法进行总结,并对每种算法的时间复杂度、空间复杂度和...
根据给定文件的信息,我们可以总结出以下几种查找算法的关键知识点: ### 一、顺序查找 #### 定义 顺序查找是最基本的一种查找方法,适用于线性表中的数据查找。其核心思想是从序列的第一个元素开始,按照顺序逐一...
总结,本课程设计全面覆盖了查找算法的主要类型,不仅提升了学生的编程技能,还深化了他们对算法效率和适用性的理解。通过这样的实践,学生能够更好地应对实际工作中遇到的查找问题,为未来的软件开发奠定坚实基础。
根据给定的文件信息,我们可以总结出几种在Java中实现的查找算法,这些算法是数据结构和算法领域的重要组成部分,广泛应用于各种计算机科学场景中。下面将详细解释这些算法及其在Java中的实现。 ### 顺序查找...
下面我们将深入探讨这些常用排序查找算法。 首先,我们来看看排序算法。排序是一系列将一组数据按照特定顺序排列的过程。这里提及的"【排序结构1】插入排序"是一种简单直观的算法,它通过构建有序序列,对于未排序...
数据结构中的查找算法是计算机科学领域的一个核心主题,它涵盖了如何高效地在数据集合中定位特定元素的方法。根据所提供的文件信息,本次实验旨在深入理解并实践查找算法,特别是静态查找和动态查找,以及它们在不同...
### C++数据结构查找算法总结 #### 一、顺序查找 **定义与原理:** 顺序查找是最基础也是最直观的一种查找方法。它适用于任何类型的线性表,无论这些线性表是否有序。基本思路是从线性表的第一个元素开始,依次与...
本篇文章将围绕一个简单的顺序查找算法进行详细介绍,并通过C语言代码来实现这一算法。 #### 二、顺序查找原理 顺序查找是最基本的查找方法之一,适用于线性表(如数组)。其工作原理是从线性表的第一个元素开始,...
下面给出一个简单的迭代版本的二分查找算法伪代码: ```plaintext function binarySearch(array A, target T): L = 0 R = length(A) - 1 while L mid = (L + R) / 2 if A[mid] == T then return mid else...
在计算机科学领域,查找算法是数据结构与算法中的核心部分...总结来说,了解和掌握这些基本查找算法对于理解和优化程序性能至关重要。通过实践和比较,我们可以更好地理解各种算法的优劣,为实际问题选择最佳解决方案。
总结来说,哈希查找算法是通过巧妙设计的哈希函数和处理冲突的策略,提供了一种快速查找数据的方法。它在数据库、缓存系统、字符串处理等领域有着广泛的应用。理解并掌握哈希函数的构造方法和冲突解决策略,对于提升...
1. **归纳总结**:总结查找算法的核心知识点,强调对分查找的思想、算法设计原理及程序实现。 2. **知识拓展**:鼓励学生利用网络资源深入学习查找算法的相关知识,如其他高效的查找算法(如哈希查找)等。 通过...