【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

本文详细介绍了线性表的两种基本查找方法——顺序查找和折半查找。顺序查找的平均查找长度为O(n),适合静态查找表;而折半查找在有序表中效率更高,平均查找长度为O(logn)。文章还探讨了两种查找方法的判定树和ASL计算,并分析了它们在不同场景下的应用和性能优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查找:

给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败

查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序

动态查找表:查找的同时做修改操作(插入,删除)

静态查找表:查找中不涉及表的修改操作

内查找:整个查找过程都在内存中进行

外查找:查找过程需要访问外存

平均查找长度(ASL):平均需要比较的次数

 ASL分为查找成功和查找失败两种情况

ASL越小,其时间性能越好

线性表的查找是一种最简单的查找表,分为顺序查找折半查找(二分法) 

顺序查找:

思路:从表的一端向另一端逐个将关键字和定值k比较,若相等,则查找成功;否则查找失败

while(i<size&&key!=a[i])
{
i++;
}
if(i>=size)
{
//查找失败
}
else
{
//查找成功

}

性能分析:

查找成功的ASL:

 

 综上,线性表顺序查找的时间复杂度为O(n)

折半(二分)查找:

折半查找又叫二分查找,要求元素有序(递增或者递减),下面讨论递增的情况

思路:

nums[low,..,high]是当前查找区间,首先确定中点mid=(low+high)/2,然后将待查找的值k和

nums[mid]比较:

(1)nums[mid]=k,查找成功

(2)nums[mid]<k,说明k在右子表nums[mid+1,high]中

(3)nums[mid]>k.说明k在左子表nums[low,mid-1]中

重复这一过程

代码:
 

binsearch(int nums[],int k,int n)
{
int low=0;
int high=n-1;
while(low<=high)
{
mid=(low+high)/2;
  if(k==nums[mid])
 {
return mid;
}
else if(k<nums[mid])
{
high=mid-1;
}
else 
low=mid+1;
}
return -1;
}

二分查找的判定树(比较树):

 内部节点:判定树中查找成功对应的节点

 外部节点:判定树中查找失败对应的节点

外部节点的构造方法:

对于内部节点的单分支点,添加一个孩子节点成为双分支节点;

对于内部节点的叶子节点,添加两个孩子节点成为双分支节点

 利用判定树求二分查找的ASL:

查找成功时,每个元素对应的概率为1/n,比较次数为根节点到该元素对应的节点的节点树(不是分支树)

查找失败是,每个外部节点的概率如果近似看出相等,每个外部节点的概率为1/N(N为外部节点的个数),比较次数为根节点到外部节点的边的个数

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值