可以分为7种查找算法:顺序查找、二分查找、插值查找、斐波那契查找、分块查找、二叉树查找法、哈希查找
a.顺序存储的顺序查找:其实就是在无序队伍中,逐个比较判断查找。时间复杂度是O(n)。
b.顺序存储有序表查找有:前提都是有序顺序存储(排好顺序,内存连续)。
折半查找(二分查找):最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);
插值查找:时间复杂度均为O(log2(log2n))。mid=low+(key-a[low])/(a[high]-a[low])*(high-low),根据关键字在整个有序表中所处的位置,让mid值的变化更靠近关键字key,这样也就间接地减少了比较次数。 对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布非常不均匀,那么插值查找未必是很合适的选择。
斐波那契查找:最坏情况下,时间复杂度为O(log2n),且其期望复杂度也为O(log2n)。
c.线性索引查找:稠密索引、分块索引(最坏的时间复杂度是n的开平方)、倒排索引.
分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
算法流程:
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
d.链表存储的查找法:二叉树查找法
二叉查找树(BinarySearch Tree,也叫二叉搜索树,或称二叉排序树Binary Sort Tree)或者是一棵空树,或者是具有下列性质的二叉树: 1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 3)任意节点的左、右子树也分别为二叉查找树。 二叉查找树性质:对二叉查找树进行中序遍历,即可得到有序的数列。
它和二分查找一样,插入和查找的时间复杂度均为O(logn),但是在最坏的情况下仍然会有O(n)的时间复杂度
e.哈希(散列)查找:复杂度:对于无冲突的Hash表而言,查找复杂度为O(1)(注意,在查找之前我们需要构建相应的Hash表)。