Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

数据结构-查找(顺序查找,加监视稍,折半查找(代码实现),分块查找 散链表(哈希表)查找(无代码))

查找算法

数据结构-查找(顺序查找,加监视稍,折半查找(代码实现),分块查找,散链表查找(无代码))
一,顺序查找1
按照线性顺序,一个一个的比较,找到返回其位置,找不到返回值0

int Seq_Search1(SeqList p,DataType a)
{
	int i=1;
	while(i<=p.length&&p.data[i]!=a)
	{
		i++;
	}
	if(i>p.length)
		return 0;
	else 
		return i;
}

二,顺序查找2(加监视稍)

int Seq_Search2(SeqList p,DataType a)
{
	int i;
	p.data[0]=a;//监视稍
	i=p.length;
	while(p.data[i]!=a)
	{
		i--;
	}
	return i;
}

比较次数少,效率更高!!!

顺序表上的顺序查找性能分析

对于n个元素的查找表,若查找的是第i个记录时,需进行n-i+1次关键字比较,即ci=n-i+1。设查找每个元素的概率相等。
查找成功时,顺序查找的平均查找长度为:
在这里插入图片描述

查找不成功时,表中每个关键字都要比较一次,直到监视哨,因此关键字的比较次数总是n+1次

在这里插入图片描述

二,折半查找
折半查找的思想为:在有序表中,取中间元素作为比较对象,
若给定值与中间元素的关键字相等,则查找成功;若给定值小
于中间元素的关键字,则在中间元素的左半区继续查找;若给
定值大于中间元素的关键字,则在中间元素的右半区继续查找。
不断重复上述查找过程,直到查找成功,或所查找的区域无数
据元素,查找失败。

例如: key=64 的查找过程如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
伪代码
key≠data[mid],key>p.data[mid]
∴low=mid+1
mid=(low+high)/2
在这里插入图片描述
a≠data[mid],key<data[mid]
∴high=mid-1
mid=(low+high)/2
在这里插入图片描述
a=data[mid] 此时就找到了key(关键字)
返回 mid 下标值

int Binary_Search(SeqList p,DataType a)
{
    int mid,low=1,high=p.length;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(a==p.data[mid])
		{return mid;}
		else if(a<p.data[mid])
		{high=mid-1;}
		else
			low=mid+1;
		return 0;
	}
}

在这里插入图片描述折半查找的平均查找长度可用判定树来分析

设 i=11
在这里插入图片描述
先判断根节点

当判定树的左子树
即将查找区间调整到左半区,此时的查找区间是

[1,5],也就是说,左分支上为根结点的值减1,代表查找区间的高端high,此时,根结点的左孩子是(1+5)/2=3,

当判定树的右子树
即将查找区间调整到右半区,此时的查找区间是

[7,11],也就是说,右分支上为根结点的值加1,代表查找区间的低端low,此时,根结点的右孩子是(7+11)/2=9

重复,依次确定每个结点的左右孩子
在这里插入图片描述
在这里插入图片描述
关于平均查找长度,应用到树形结构的知识,可以点击这里:

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: TPC-C中跑赢Oracle的OceanBase,最近有何惊艳?

下一篇: 20行Python代码爬取王者荣耀全英雄皮肤

精华推荐