[查找] 1 顺序查找法 | 折半查找法 | 分块查找(索引顺序查找)

版权声明:本文为博主原创文章,若有错误之处望大家批评指正!转载需附上原文链接,谢谢! https://blog.csdn.net/summer_dew/article/details/84315926

顺序查找法

【思路】从头到尾遍历表,找到目标即退出

int Search(int a[], int n, int k) {
	int i;
	for (i=1; i<=n; i++)
		if (a[i]==k)
			return i;
		return 0;
}

【ASL】

  1. 查找成功:ASL1 = ∑i/n = (1/n) ×n×(1+n)/2 = (n+1)/2
  2. 查找不成功:ASL2n
    • 查找目标k是在a[]值范围之外的任何树,所以k的取值是无线的
    • 但是对于k的任意一个取值,其查找长度必为n
    • 根据代码中if语句可以看出,对于所有i值,a[i]==k都不成立,则循环必执行n次–>必有n次比较
    • 【注意】有些情况会在表的最后插入一个结束的标记,这是ASL2=n+1,也就是比较了n+1次

折半查找法

【要求】表一定是有序的
【思想】找中间位置,来判断下一次去哪里找,或者已经找到了

int BiSearch(int R[],int low, int high, int k) {
	int mid;
	while (low<=high) {
		mid = (low+high)/2;
		if (R[mid]==k) return mid;
		else if (R[mid]>k) high = mid-1; //注意,取的是mid-1,不是mid
		else low = mid+1; //注意,取的是mid-1,不是mid
	}
	return 0;
}

【例子】13个元素的有序表

【折半查找判断树】查找过程可以用一个二叉树来表示,称为描述折半查找的判定树

  1. 圆形:判定树的结点
  2. 矩形:不是判定树的内容,画出便于理解,属于K1的左孩子=NULL,表示查找失败的地方
  3. 该树的中序遍历序列即为原序列

在这里插入图片描述

  1. 折半查找的比较次数:从根结点到待查找元素所经过的节点数 --> 其比较次数最多的情况即为一直走到叶子结点 --> 时间复杂度可以用树的高度来表示
  2. 时间复杂度、ASL:对于一般情况,有n个记录的查找表,进行折半查找的时间复杂度为log2n。折半查找的平均查找长度(ASL)近似为log2(n+1) -1
  3. 失败的ASL:即从根走到叶子结点的儿子NULL处(方框表示,代表查找不成功的位置)

在这里插入图片描述

分块查找

【分块查找】又称为索引顺序查找
【思路】把表分成若干块,块与块之间是有序,块内部可以是无序
【索引表】对顺序表进行分块查找需要额外建立一个索引表

typedef struct indexElem{
	int key;	//表内的最值
	int low,high; //块的第一个位置、最后一个位置
}IndexElem;
IndexElem index[maxSize]; //索引表

在这里插入图片描述

【性能】

  1. 对索引表进行二分查找
  2. 对块内部的元素进行顺序查找
  3. 平均查找长度=二分查找ASL+顺序查找ASL

猜你喜欢

转载自blog.csdn.net/summer_dew/article/details/84315926