数据结构笔记:查找

查找的基本概念

查找表:
由同一类型的数据元素(或记录)构成的集合
静态查找表:
查找的同时对查找表不做修改操作(如插入和删除)
动态查找表:
查找的同时对查找表具有修改操作
关键字:
记录中某个数据项的值,可用来识别一个记录
主关键字:
唯一标识数据元素
次关键字:
可以标识若干个数据元素

关键字的平均比较次数,也称平均查找长度ASL(Average Search Length)
在这里插入图片描述
n:记录的个数
pi:查找第i个记录的概率 ( 通常认为pi =1/n )
ci:找到第i个记录所需的比较次数

线性表的查找

顺序查找

应用范围:
顺序表或线性链表表示的静态查找表
表内元素之间无序
顺序表的表示:

typedef struct {
          ElemType   *R; //表基址
          int          length;     //表长
}SSTable;

在顺序表L中查找值为e的数据元素

int LocateELem(SqList L,ElemType e)
{  for (i=0;i< L.length;i++)
      if (L.elem[i]==e) return i+1;                
  return 0;}

问题:在查找过程中每一步都需要检测整个表是否查找完毕,即i<L.length的检测。
改进:把待查关键字key存入表头(“哨兵”),从后向前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。

顺序查找的性能分析
空间复杂度:一个辅助空间。
时间复杂度:O(n)

  1. 查找成功时的平均查找长度
    设表中各记录查找概率相等
    ASLs(n)=(1+2+ … +n)/n =(n+1)/2
    2)查找不成功时的平均查找长度 ASLf =n+1

折半查找(非递归算法)

int Search_Bin(SSTable ST,KeyType key){
//若找到,则函数值为该元素在表中的位置,否则为0
    low=1;high=ST.length;						 while(low<=high){
        mid=(low+high)/2;
        if(key==ST.R[mid].key) return mid; 
        else if(key<ST.R[mid].key) high=mid-1;  //前一子表查找
        else low=mid+1;                       		     //后一子表查找
    }									    return 0;		                              //表中不存在待查元素
}		

折半查找的性能分析-判定树
分析折半查找的性能,可以用二叉树来进行描述。把当前查找区间的中间位置上的结点作为根结点,左半区间和右半区间中结点分别作为左子树和右子树,由此得到的二叉树称为折半查找判定树。

求元素的平均查找长度:
例题:假定每个元素的查找概率相等,求查找成功时的平均查找长度。
在这里插入图片描述
这里括号中:红色数字表示每层的数字个数,
黑色表示:从当前结点到根节点的距离。

在这里插入图片描述
查找成功时比较次数:为该结点在判定树上的层次数,不超过树的深度 d = log2 n + 1
查找不成功的过程就是走了一条从根结点到外部结点的路径d或d-1。

分块查找(块间有序,块内无序)

分块有序,即分成若干子表,要求每个子表中的数值都比后一块中数值小(但子表内部未必有序)。
然后将各子表中的最大关键字构成一个索引表,表中还要包含每个子表的起始地址(即头指针)。
在这里插入图片描述
分块查找过程:① 对索引表使用折半查找法(因为索引表是有序表);
② 确定了待查关键字所在的子表后,在子表内采用顺序查找法(因为各子表内部是无序表);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr顺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值