查找:

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

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

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

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

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

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

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

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

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

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

ASL越小,其时间性能越好

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

顺序查找:

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

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

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

性能分析:

查找成功的ASL:

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

 

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

 综上,线性表顺序查找的时间复杂度为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]中

重复这一过程

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

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

代码:
 

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;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

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

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

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

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

外部节点的构造方法:

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

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

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

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

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

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

 

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

 

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

 

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

 

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

 

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

 

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

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