1 顺序查找
顺序查找指在通过遍历表中的每个元素,直到找到关键字为止。
时间复杂度为O(n)
2 择半查找(二分查找)
择半查找指在顺序表(有序数组)的前提条件下,假设数组s长度为n,开始索引为sIndex=0,结束索引为eIndex=n-1,中间索引为mIndex,查找关键字为k;第一次查找,mIndex=(sIndex+eIndex)/2和查找关键字k比较,若k>s[mIndex],即说明待查找的关键字k在数组的右侧,此时sIndex=mIndex+1,eIndex=n-1;若k<s[mIndex],则说明待查找的关键字k在数组的左侧,此时,sIndex=0,eIndex=mIndex-1;再重复上面步骤继续查找,直到k=s[mIndex]为止。主要的思想就是每一次比较搜索元素都减少一半。
时间复杂度为:O()
3 斐波那契查找
斐波那契查找就是在二分查找的基础上根据斐波那契数列进行分割的。
4 分块查找
分块查找是介于顺序查找和二分查找之间而产生的算法,性能也是介于两者之间,主要是将一组数据n进行分块,假设分为m块(m<=n),即第1块,第2块....第m块;块与块之间是有序的,块内元素可以无序;而且第2块中的最小元素大于第1块中的所有元素,第3块中的最小元素大于第2块中的所有元素,以此类推,分块是按每块中最大的值作为索引构成一个有序的数组。所以查找的过程主要分为以下两个步骤:
1、先按二分查找在索引表中确定属于哪一个块。
2、在确定哪一块的基础上用顺序查找找到对应元素。
时间复杂度:小于O(n),大于O()
4 二叉排序树(二叉查找树)
条件:先创建二叉排序树:
1. 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2. 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 它的左、右子树也分别为二叉排序树。
原理:
在二叉查找树b中查找x的过程为:
1. 若b是空树,则搜索失败,否则:
2. 若x等于b的根节点的数据域之值,则查找成功;否则:
3. 若x小于b的根节点的数据域之值,则搜索左子树;否则:
4. 查找右子树。
时间复杂度:O()
5 哈希表法(散列表)
条件:先创建哈希表(散列表)
原理:根据键值方式(Key value)进行查找,通过散列函数,定位数据元素。
时间复杂度:几乎是O(1),取决于产生冲突的多少。
参考:https://blog.csdn.net/wqc_CSDN/article/details/52691019