【出处】http://www.cnblogs.com/butyoux/archive/2013/01/15/2861291.html
五种查找算法总结
下列五种查找算法,除顺序查找外,其他算法的思路基本相同:
先对数据按某种方法进行排序,然后使用相应的规则查找。
因此,搞清排序算法才是关键。
一、顺序查找
条件:无序或有序队列。
原理:按顺序比较每个元素,直到找到关键字为止。
时间复杂度:O(n)
二、二分查找(折半查找)
条件:有序数组
原理:查找过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。
时间复杂度:O(logn)
三、二叉排序树查找
条件:先创建二叉排序树:
1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 它的左、右子树也分别为二叉排序树。
原理:
在二叉查找树b中查找x的过程为:
1. 若b是空树,则搜索失败,否则:
2. 若x等于b的根节点的数据域之值,则查找成功;否则:
3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:
4. 查找右子树。
时间复杂度:
四、哈希表法(散列表)
条件:先创建哈希表(散列表)
原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。
时间复杂度:几乎是O(1),取决于产生冲突的多少。
五、分块查找
原理:将n个数据元素"按块有序"划分为m块(m ≤ n)。
每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;
而第2块中任一元素又都必须小于第3块中的任一元素,……。
然后使用二分查找及顺序查找。
分块查找
分块查找(Blocking Search)又称索引顺序查找。它是一种性能介于顺序查找和二分查找之间的查找方法。
1、 二分查找表存储结构
二分查找表由"分块有序"的线性表和索引表组成。
(1)"分块有序"的线性表
表R[1..n]均分为b块,前b-1块中结点个数为 ,第b块的结点数小于等于s;每一块中的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字,即表是"分块有序"的。
(2)索引表
抽取各块中的最大关键字及其起始位置构成一个索引表ID[l..b],即:
ID[i](1≤i≤b)中存放第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。
【例】下图就是满足上述要求的存储结构,其中R只有18个结点,被分成3块,每块中有6个结点,第一块中最大关键字22小于第二块中最小关键字24,第二块中最大关键字48小于第三块中最小关键字49。
2、分块查找的基本思想
分块查找的基本思想是:
(1)首先查找索引表
索引表是有序表,可采用二分查找或顺序查找,以确定待查的结点在哪一块。
(2)然后在已确定的块中进行顺序查找
由于块内无序,只能用顺序查找。
3、分块查找示例
【例】对于上例的存储结构:
(1)查找关键字等于给定值K=24的结点
因为索引表小,不妨用顺序查找方法查找索引表。即首先将K依次和索引表中各关键字比较,直到找到第1个关键宇大小等于K的结点,由于K<48,所以关键字为24的结点若存在的话,则必定在第二块中;然后,由ID[2].addr找到第二块的起始地址7,从该地址开始在R[7..12]中进行顺序查找,直到R[11].key=K为止。
(2)查找关键字等于给定值K=30的结点
先确定第二块,然后在该块中查找。因该块中查找不成功,故说明表中不存在关键字为30的结点。
具体过程【参见动画演示】
4、算法分析
(1)平均查找长度ASL
分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。
①以二分查找来确定块,分块查找成功时的平均查找长度
ASLblk=ASLbn+ASLsq≈lg(b+1)-1+(s+1)/2≈lg(n/s+1)+s/2
②以顺序查找确定块,分块查找成功时的平均查找长度
ASL'blk=(b+1)/2+(s+1)/2=(s2+2s+n)/(2s)
注意:
当 s= 时ASL'blk取极小值 +1 ,即当采用顺序查找确定块时,应将各块中的结点数选定为 。
【例】若表中有10000个结点,则应把它分成100个块,每块中含100个结点。用顺序查找确定块,分块查找平均需要做100次比较,而顺序查找平均需做5000次比较,二分查找最多需14次比较。
注意:
分块查找算法的效率介于顺序查找和二分查找之间。
(2)块的大小
在实际应用中,分块查找不一定要将线性表分成大小相等的若干块,可根据表的特征进行分块。
【例】一个学校的学生登记表,可按系号或班号分块。
(3) 结点的存储结构
各块可放在不同的向量中,也可将每一块存放在一个单链表中。
(4)分块查找的优点
分块查找的优点是:
①在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。
②因块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。
分块查找的主要代价是增加一个辅助数组的存储空间和将初始表分块排序的运算。