查找:
给定一个值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为外部节点的个数),比较次数为根节点到外部节点的边的个数