数据结构查找

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

采用折半查找时,先求位于搜索区间正中的对象 的下标mid,用其关键码与给定值x比较:
➢ l[mid]. Key = x,搜索成功;
➢ l[mid]. Key > x,把搜索区间缩小到表的前 半部分,再继续进行对分搜索;
➢ l[mid]. Key < x,把搜索区间缩小到表的后
半部分,再继续进行对分搜索。
ST.elem[0].key = key; //哨兵
while (ST.elem[k]!=key ) k--;
return(k);
}
数据结构
8
顺序查找算法分析
由顺序查找过程可见,查找表中最后一个元素时, 仅需比较一次;查找表中第一个元素时,需比较n次; 对任一元素i需比较n-i+1次。 设顺序表中每个记录的查找概率相同,即Pi=1/n, 则顺序查找算法查找成功时的平均查找长度为:
ASLseq=
可以证明,在不等概率查找的情况下,ASLseq

时取极小值,这就是说,如果事先已经知
道查找表中各个关键字的查找概率的话,则应该按
照关键字的查找概率从小而大存放数据元素。
数据百度文库构
9
有序表的查找(折半查找)
折半查找要求线性表的结点按其关键字从小到大 (或从大到小)按序排列,并采用顺序存储结构。
12
折半查找的实现
❖ 折半查找的主要步骤为: (1)置初始查找范围:low=1,high=n
(2)求查找范围中间项:mid=(low+high)/2
(3)将指定的关键字值k与中间项a[mid].key比较
若相等,查找成功,找到的数据元素为此时mid 指向的 位置;
若小于,查找范围的低端数据元素指针low不变,高端数 据元素指针high更新为mid-1;
查找算法的评价标准:查找过程的主要操作是关 键字的比较,所以通常以“平均比较次数”来衡 量查找算法的时间效率。
对于具有n个数据元素的集合,查找某元素成功的
平均查找长度为: ASL=
数据结构
4
静态查找表
顺序表的查找(顺序查找) 有序表的查找(折半查找) 索引顺序表的查找(分块查找)
数据结构
5
顺序表的查找(顺序查找)
顺序表的查找将集合中的数据元素构成一个序 列,以顺序表或线性链表表示静态查找表。
顺序查找的过程:从表的一端开始,顺序(逐 个)扫描线性表,依次将扫描到的结点关键字 和给定值Key相比较,若当前扫描到的结点关 键字与Key相等,则查找成功;若扫描结束后, 仍未找到关键字等于Key的结点,则查找失败。
若大于,查找范围的高端数据元素指针high不变,低端 数据元素指针low更新为mid+1;
(4)重复步骤(2)、(3)直到查找成功或查找范
围空(low>high),数即据结查构找失败为止。
13
索引顺序表的查找(分块查找)
分块查找(Blocking Search)又称索引顺序查找,是 一种性能介于顺序查找和二分查找之间的查找方法。
❖ 集合关系 ❖ 查找表(search table)
数据结构
1
查找的基本概念
查找表(Search Table):是由一些具有相同可辨 认特性的数据元素(或记录)构成的集合。
对查找表经常进行的操作有: (1)查询某个"特定的"数据元素是否在表中; (2)查找某个"特定的"数据元素的各种属性; (3)在查找表中插入一个数据元素; (4)从查找表中删除某个数据元素。
数据结构
10
每比较一次,搜索区间缩小一半。如果搜索区间已 缩小到一个对象,仍未找到想要搜索的对象,则搜索 失败。
例 有一组有序的线性表如下:
(10,14,20,32,45,50,68,90,100,120)
下面分析在其中二分查找关键字20的过程。
数据结构
11
下面分析二分查找关键字95的过程:
数据结构
数据结构
7
int Search_Seq(SSTable ST,KeyType key)
{ int k=ST.len-1;
while (k>=0 && ST.elem[k]!=key ) k--;
return(k);
}
int Search_Seq(SSTable ST,KeyType key)
{ int k=ST.len-1;
数据结构
6
顺序查找的实现
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
#define LISTINCREMENT 10 //线性表存储空间的分配增量
typedef struct{ ElemType *elem; //存储空间基址
int length; //当前长度 int listsize; //当前分配的存储容量 }SSTable;
数据结构
3
查找(searching):是根据给定的某个值,在 查找表中确定一个其关键字等于给定值的数据元 素。若表中存在这样的一个元素,则称查找是成 功的,此时查找的结果为给出整个数据元素的信 息,或指示该数据元素在查找表中的位置;若表 中不存在这样的元素,则称查找不成功,此时查 找的结果可给出一个“null”元素(或空指针)。
静态查找表(Static Search Table):在使用时主 要作前两种统称为“查找”的操作。即查找的前后不 会改变查找表的内容。
动态查找表(Dynamic Search Table)
数据结构
2
关键字:是数据元素中某个数据项的值, 用它可以标识(识别)一个数据元素。若 此关键字可以唯一地标识一个元素,则称 此关键字为主关键字(Primary key) (对不同的元素,其主关键字均不同)。 反之,称用以识别若干元素的关键字为次 关键字(secondary key)。当数据元素 只有一个数据项时,其关键字即为该数据 元素的值。
该块在表L中的起始位置。由于表L是分块有序的,所以
索引表是一个递增有序表。
数据结构
14
【例】例如,图9.2就是一个带索引的分块有序的线 性表。其中线性表L共有20个结点,被分成3块,第 一块中最大关键字25小于第二块中的最小关键字27 ,第二块中最大关键字55小于第三块中的最小关键 字60。
索引顺序查找表由“分块有序”的线性表和索引表
组成。(1)“分块有序”的线性表
线性表L被均分为若干块,每一块中的关键字不一定
有序,但前一块中的最大关键字必须小于后一块中的
最小关键字,即表是"分块有序"的。
(2)索引表
抽取各块中的最大关键字及其起始位置构成一个索引表
ID[l..b],即:ID[i](1≤i≤b)中存放第i块的最大关键字及
相关文档
最新文档