数据结构-查找介绍

合集下载

查找 数据结构讲义

查找 数据结构讲义

ASL blk
s1 s ASL bn ASL sq log 2 (h 1) 1 log 2 (n / s 1) 2 2
若以顺序查找确定块,则分块查找成功时的平 均查找长度为:
ASL ASL bn ASL sq blk
b 1 s 1 s 2s n 2 2 2s
low=0 high=3 第2次比较: 2 4 7 9 10 14 18
mid=(0+3)/2=1 26 32 40
low=2
第3次比较: 2 4 7
high=3
9 10 14 18 26
mid=(2+3)/2=2
32 40
R[2].key=7 查找成功,返回序号2
其算法如下(在有序表R[0..n-1]中进行二分查找, 成功时返回记录的位置,失败时返回-1):
二分查找过程可用二叉树来描述,我们
把当前查找区间的中间位置上的记录作为根,
左子表和右子表中的记录分别作为根的左子
树和右子树,由此得到的二叉树,称为描述
二分查找的判定树或比较树。
<
5 =
>
< 0 = > 1 < = >
2 =
> 3 < = >
2~3
8 < =
6 < = >
5~6
> 9 < = > 10 < = >
采用二分查找索引表的分块查找算法如下(索引表I的长度 为m):
int IdxSearch(IDX I, int m, SeqList R, int n, KeyType k)
{
int low=0,high=m-1,mid,i;

数据结构——查找,顺序查找,折半查找

数据结构——查找,顺序查找,折半查找

实验五查找的应用一、实验目的:1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。

2、增强上机编程调试能力。

二、问题描述1.分别利用顺序查找和折半查找方法完成查找。

有序表(3,4,5,7,24,30,42,54,63,72,87,95)输入示例:请输入查找元素:52输出示例:顺序查找:第一次比较元素95第二次比较元素87 ……..查找成功,i=**/查找失败折半查找:第一次比较元素30第二次比较元素63 …..2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查询。

输入输出示例同题1的要求。

三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明)(1)逻辑结构设计顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。

(2)存储结构设计采用顺序存储的结构,开辟一块空间用于存放元素。

(3)存储结构形式说明分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据四、算法设计(1)算法列表(说明各个函数的名称,作用,完成什么操作)序号 名称 函数表示符 操作说明1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素3 初始化 Init 对顺序表进行初始化,并输入元素4 树初始化 CreateBST 创建一棵二叉排序树5 插入 InsertBST 将输入元素插入到二叉排序树中6 查找 SearchBST在根指针所指二叉排序树中递归查找关键字数据元素 (2)各函数间调用关系(画出函数之间调用关系)typedef struct { ElemType *R; int length;}SSTable;typedef struct BSTNode{Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针}BSTNode,*BSTree; typedef struct Elem{ int key; }Elem;typedef struct {int key;//关键字域}ElemType;(3)算法描述int Search_Seq(SSTable ST, int key){//在顺序表ST中顺序查找其关键字等于key的数据元素。

数据结构_查找原理及典型的查找算法

数据结构_查找原理及典型的查找算法
无法实现!因全部元素的定位只能从头指针head开 始,是一种非随机存取结构。
3.对非线性(树)结构如何进行折半查找? 可借助二叉排序树来查找(属动态查找表形式)。
9.1.2 有序表的查找
折半查找过程可以描述为一棵二叉树
折半查找的判定树 如:(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
总之:
二叉排序树既有类似于折半查找的特性,又采用了链 表存储,它是动态查找表的一种适宜表示。
一、二叉排序树
(3)构造过程: 例:输入序列{45,12,37,3,53,100,24}
45
12
53
3
37
100
24
一、二叉排序树
(2)非递归查找过程 BiTree SearchBST(BiTree T,KeyType key){
CH9 查找
查找的基本概念 9.1 静态查找表
9.1.1 顺序查找 9.1.2 有序表的查找 9.1.3 索引顺序表的查找
9.2 动态查找表
9.2.1 二叉排序树和平衡二叉树 9.2.2 B-和B+树
9.3 哈希表
查找的基本概念
1.查找表 2.查找
关键字 主关键字 次关键字
}
9.2.1 二叉排序树和平衡二叉树
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义、特点、构造过程
(1)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储

数据结构(三十七)查找的基本概念

数据结构(三十七)查找的基本概念

数据结构(三⼗七)查找的基本概念 ⼀、查找的基本概念 1.查找(Searching):就是在由⼀组记录组成的集合中寻找关键字值等于给定值的某个记录,或是寻找属性值符合特定条件的某些记录。

若表中存在这样⼀个记录,则称查找是成功的,此时查找的结果给出整个记录的信息,或指⽰该记录在查找表中的位置。

若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可以给出⼀个“空”记录或者“空”指针。

2.查找表(Search Table):是⼀种以同⼀类型的记录构成的集合为逻辑结构,以查找为核⼼运算的数据结构。

3.关键字(Key):是数据元素中某个数据项的值,⼜称为键值,⽤它可以标识⼀个数据元素,也可以标识⼀个记录的某个数据项(字段)。

4.主关键字(Primaty Key):可以惟⼀地标识⼀个记录的关键字。

对于那些可以标识多个数据元素(或记录)的关键字,称为次关键字(Secondary Key)。

⼆、查找表的分类 1.静态查找表(Static Search Table):只作查找操作的查找表。

主要操作有:查询某个“特定的”数据元素是否在查找表中检索某个“特定的”数据元素和各种属性。

2.动态查找表(Dynamic Search Table):动态表的特点是表结构本⾝是在查找过程中动态⽣成的。

同时在查找过程中同时插⼊查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。

主要操作有:查找时插⼊数据元素查找时删除数据元素 三、静态表和动态表的代表 静态表:顺序查找、⼆分查找、插值查找、斐波那契查找、线性索引查找 动态表:⼆叉排序树、平衡⼆叉树、B树、散列表。

大学数据结构课件--第9章 查找

大学数据结构课件--第9章 查找
——这种既查找又插入的过程称为动态查找。
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p

数据结构(八)查找

数据结构(八)查找
122
99
250
110
300
280
类C程序实现: void InsertBST(*&t,key) //在二叉排序树中插入查找关键字key { if(t= = NULL){ t=new BiTree; t->lchild=t->rchild=NULL; t->data=key; return; } if(key<t->data ) InsertBST(t->lchild,key); else InsertBST (t->rchild, key ); } void CreateBiTree(tree,d[ ],n) //n个数据在数组d中,tree为二叉排序树根 { tree=NULL; for(i=0;i<n;i++) InsertBST(tree,d[i]); }
p q
void delete(*&p) { if(p->rchild = = NULL) { q=p; p=p->lchild; delete q; } else if(p->lchild= =NULL) { q=p; p=p->rchild; delete q; } else { q=p; s=p->lchild; while(s->rchild!=NULL) {q=s; s=s->rchild;} p->data=s->data; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; } delete s; }
在xL中选值最大的代替x,该数据按二叉排序树的性质应在 最右边。
f x f s c

数据结构中的查找算法总结

数据结构中的查找算法总结

数据结构中的查找算法总结静态查找是数据集合稳定不需要添加删除元素的查找包括:1. 顺序查找2. 折半查找3. Fibonacci4. 分块查找静态查找可以⽤线性表结构组织数据,这样可以使⽤顺序查找算法,再对关键字进⾏排序就可以使⽤折半查找或斐波那契查找等算法提⾼查找效率,平均查找长度:折半查找最⼩,分块次之,顺序查找最⼤。

顺序查找对有序⽆序表均适⽤,折半查找适⽤于有序表,分块查找要求表中元素是块与块之间的记录按关键字有序动态查找是数据集合需要添加删除元素的查找包括: 1. ⼆叉排序树 2. 平衡⼆叉树 3. 散列表 顺序查找适合于存储结构为顺序存储或链接存储的线性表。

顺序查找属于⽆序查找算法。

从数据结构线形表的⼀端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相⽐较,若相等则表⽰查找成功 查找成功时的平均查找长度为: ASL = 1/n(1+2+3+…+n) = (n+1)/2 ; 顺序查找的时间复杂度为O(n)。

元素必须是有序的,如果是⽆序的则要先进⾏排序操作。

⼆分查找即折半查找,属于有序查找算法。

⽤给定值value与中间结点mid的关键字⽐较,若相等则查找成功;若不相等,再根据value 与该中间结点关键字的⽐较结果确定下⼀步查找的⼦表 将数组的查找过程绘制成⼀棵⼆叉树排序树,如果查找的关键字不是中间记录的话,折半查找等于是把静态有序查找表分成了两棵⼦树,即查找结果只需要找其中的⼀半数据记录即可,等于⼯作量少了⼀半,然后继续折半查找,效率⾼。

根据⼆叉树的性质,具有n个结点的完全⼆叉树的深度为[log2n]+1。

尽管折半查找判定⼆叉树并不是完全⼆叉树,但同样相同的推导可以得出,最坏情况是查找到关键字或查找失败的次数为[log2n]+1,最好的情况是1次。

时间复杂度为O(log2n); 折半计算mid的公式 mid = (low+high)/2;if(a[mid]==value)return mid;if(a[mid]>value)high = mid-1;if(a[mid]<value)low = mid+1; 折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向⼀个实际上不存在的结点——外结点,所有外界点都是查找不成功的情况,如图所⽰。

数据结构查找知识点总结

数据结构查找知识点总结

数据结构查找知识点总结查找是在一组数据中寻找特定元素或特定条件的操作。

1. 线性查找:从列表、数组或链表的头部开始逐个检查元素,直到找到目标元素或搜索结束。

最坏情况下需要遍历整个数据集。

- 特点:简单易懂但效率低。

- 时间复杂度:O(n)。

2. 二分查找:对有序的列表、数组或链表,采用分治思想,通过比较目标元素和中间元素的大小关系,缩小搜索范围,直到找到目标元素或搜索结束。

- 前提条件:数据必须有序。

- 特点:效率高,但要求数据有序,且适用于静态数据集。

- 时间复杂度:O(log n)。

3. 哈希查找:通过将元素进行哈希函数映射,将元素存储在哈希表中,以快速定位目标元素。

- 特点:查找速度快,适用于动态数据集。

- 时间复杂度:平均情况下是O(1),最坏情况下是O(n)(哈希冲突)。

4. 二叉查找树:一种有序的二叉树结构,左子树的所有节点的值都小于根节点的值,右子树的所有节点的值都大于根节点的值。

- 特点:可用于快速插入、删除和查找元素。

- 时间复杂度:平均情况下是O(log n),最坏情况下是O(n)(树退化为链表)。

5. 平衡二叉查找树:通过在二叉查找树的基础上对树进行平衡操作,使得树的高度保持在较小范围,从而提高查找效率。

- 特点:保持查找性能稳定,适用于动态数据集。

- 时间复杂度:平均情况下是O(log n),最坏情况下是O(log n)(由于树平衡操作的代价,最坏情况下仍可达到O(n))。

6. B树/B+树:一种多路搜索树,通过增加每个节点的子节点数目,减少树的高度,从而提高查找效率。

常用于磁盘索引等场景。

- 特点:适用于大规模数据集以及磁盘访问等场景,对于范围查找尤为高效。

- 时间复杂度:平均情况下是O(log n),最坏情况下是O(log n)。

7. 字典树(Trie树):一种通过字符串的前缀来组织和查找数据的树形数据结构。

- 特点:适用于按前缀匹配查找、排序等操作。

- 时间复杂度:查找操作的时间复杂度与字符串长度有关。

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

第八章查找一、填空题1.线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索次。

设有100个结点,用二分法查找时,最大比较次数是。

2.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。

3. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。

4、对线性表进行二分查找时,要求线性表必须以方式存储,且结点按关键字排列。

5.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为_ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ 。

6.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为____ _____。

7. 在有序表A[1..20]中,按二分查找方法进行查找,查找长度为5的元素个数是_8. 已知二叉排序树的左右子树均不为空,则_______上所有结点的值均小于它的根结点值,________上所有结点的值均大于它的根结点的值。

9、中序遍历二叉排序树得到的序列是序列(填有序或无序)。

10、从有序表(10,16,25,40,61,28,80,93)中依次二分查找40和61元素时,其查找长度分别为和。

二、单项选择题()1.在表长为n的链表中进行顺序查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;(n+1)-1C. ASL=n+1; D. ASL≈log2()2.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

若查找表中元素58,则它将依次与表中比较大小,查找结果是失败。

A.20,70,30,50 B.30,88,70,50C.20,50 D.30,88,50()3.对22个记录的有序表作折半查找,当查找失败时,至少需要比较次关键字。

A.3 B.4 C.5 D. 6()4. 链表适用于查找A.顺序 B.二分法 C.顺序,也能二分法 D.随机()5. 折半搜索与二叉搜索树的时间性能。

A. 相同B. 完全不同n)C. 有时不相同D. 数量级都是O(log2()6.散列表的地址区间为0-17,散列函数为H(K)=K mod 17。

采用线性探测法处理冲突,并将关键字序列26,25,72,38,8,18,59依次存储到散列表中。

元素59存放在散列表中的地址是。

A. 8 B. 9 C. 10 D. 11( )7. 当采用分快查找时,数据的组织方式为A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同( )8. 散列函数有一个共同的性质,即函数值应当以取其值域的每个值。

A. 最大概率B. 最小概率C. 平均概率D. 同等概率( )9. 假定有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表中,至少要进行次探测?A.k-1次 B. k次 C. k+1次 D. k(k+1)/2次( )10、二叉查找树的查找效率与二叉树的有关, 在时其查找效率最低(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。

( )11、在顺序表 ( 3, 6, 8, 10, 12, 15, 16, 18, 21, 25, 30 ) 中,用折半法查找关键码值11,所需的关键码比较次数为A) 2 B) 3 C) 4 D) 5( )12、对包含n个元素的哈希表进行查找,平均查找长度为A) O(log2n) B) O(n) C) O(nlog2n) D) 不直接依赖于n( )13、若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。

A. (n-1)/2 B. n/2 C. (n+1)/2 D. n( )14. 下面关于二分查找的叙述正确的是 ( )A. 表必须有序,表可以顺序方式存储,也可以链表方式存储B. 表必须有序且表中数据必须是整型,实型或字符型C. 表必须有序,而且只能从小到大排列D. 表必须有序,且表只能以顺序方式存储( )15. 对线性表进行二分查找时,要求线性表必须()A.以顺序方式存储B.以顺序方式存储,且数据元素有序C.以链接方式存储D.以链接方式存储,且数据元素有序( )16.适用于折半查找的表的存储方式及元素排列要求为( )A.链接方式存储,元素无序 B.链接方式存储,元素有序C.顺序方式存储,元素无序 D.顺序方式存储,元素有序( )17.当在一个有序的顺序存储表上查找一个数据时,即可用折半查找,也可用顺序查找,但前者比后者的查找速度( )A.必定快 B.不一定C. 在大部分情况下要快D. 取决于表递增还是递减( )18. 具有12个关键字的有序表,折半查找的平均查找长度()A. 3.1B. 4C. 2.5D. 5( )19. 折半查找的时间复杂性为()A. O(n2)B. O(n)C. O(n log2n) D. O(log2n)( )20.设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找,则其平均查找长度为()。

(A) 6 (B) 11 (C) 5 (D) 6.5( )21.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( )A .(100,80, 90, 60, 120,110,130)B.(100,120,110,130,80, 60, 90)C.(100,60, 80, 90, 120,110,130)D. (100,80, 60, 90, 120,130,110)( )22、下列二叉排序树中,满足平衡二叉树定义的是( )( )23、设散列表中有m 个存储单元,散列函数H(key)= key % p,则p 最好选择(B )。

(A) 小于等于m 的最大奇数 (B) 小于等于m 的最大素数(C) 小于等于m 的最大偶数 (D) 小于等于m 的最大合数三、判断题1、查找相同结点的效率折半查找总比顺序查找高。

( )2、索引顺序表的特点是块内可无序,块间要有序。

( )3、 在采用线性探测法处理冲突的散列表中,所有同义词在表中一定相邻。

( )4、在平衡二叉树中,任意结点左右子树的高度差(绝对值)不超过1。

( )5、若查找表的长度为n ,则顺序查找法的平均查找长度为(n+1)/2。

( )6、折半搜索适用于有序表,包括有序的顺序表和有序的链表。

( )A 、7.采用线性探测法处理散列时的冲突,当从哈希表删除一个记录时,不应将这个记录的所在位置置空,因为这会影响以后的查找。

()8.负载因子 (装填因子)是散列表的一个重要参数,它反映散列表的装满程度。

()9. 散列法的平均检索长度不随表中结点数目的增加而增加,而是随负载因子的增大而增大。

()10. 若散列表的负载因子α<1,则可避免冲突的产生。

( )11.用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度。

( )12.对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找成功,它们的平均查找长度是相同的,而对于查找失败,它们的平均查找长度是不同的。

()四、简答题1.对分(折半)查找适不适合链表结构的序列,为什么?用二分查找的查找速度必然比线性查找的速度快,这种说法对吗?2.假定对有序表:(3,4,5,7,24,30,42,54,63,72,87,95)进行折半查找,试回答下列问题:(1)画出描述折半查找过程的判定树;(2)若查找元素54,需依次与哪些元素比较?(3)若查找元素90,需依次与哪些元素比较?(4)假定每个元素的查找概率相等,求查找成功时的平均查找长度。

3.设哈希(Hash)表的地址范围为0~17,哈希函数为:H(K)=K MOD 16。

K为关键字,用线性探测法再散列法处理冲突,输入关键字序列:(10,24,32,17,31,30,46,47,40,63,49)造出Hash表,试回答下列问题:(1)画出哈希表的示意图;(2)若查找关键字63,需要依次与哪些关键字进行比较?(3)若查找关键字60,需要依次与哪些关键字比较?(4)假定每个关键字的查找概率相等,求查找成功时的平均查找长度。

4、设哈希表长度为11,哈希函数H(K)=(K的第一字母在字母表中的序号)MOD 11,若输入顺序为(D,BA,TN,M,CI,I,K,X,TA),处理冲突方法为线性探测再散列或链地址法,要求构造哈希表,并求出等概率情况下查找成功平均查找长度。

5、输入一个正整数序列{100,50,302,450,66,200,30,260},建立一棵二叉排序树,要求:⑴画出该二叉排序树;⑵画出删除结点302后的二叉排序树。

6、设有一组关键字:{19,01,23,14,55,20,84,27,68},采用哈希函数:H(key)=key mod 7,采用开放地址法的线性探测再散列方法解决冲突。

要求:在0∽11的散列地址空间中对该关键字序列构造哈希表。

0 1 2 3 4 5 6 7 8 9 10 117、已知如下所示长度为12的表:(Jan, Feb, Mar, Apr, May, June, July, Aug, Sep, Oct, Nov, Dec)(1)试按表中元素的顺序依次插入一棵初始为空的二叉排序树,画出插入完成之后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

(2)若对表中元素先进行排序构成有序表,求在等概率的情况下对此有序表进行折半查找时查找成功的平均查找长度。

(3)按表中元素顺序构造一棵平衡二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

8、用开放地址法的二次探测再散列方法Hi=(H(key)+di) mod 10(di=12,22,32,…,)解决冲突。

要求:对该关键字序列构造哈希表,并计算查找成功的平均查找长度。

9、选取散列函数H(key)=(3*key)%11,用线性探测法处理冲突,对下列关键码序列构造一个散列地址空间为0~10,表长为11的散列表,{22,41,53,08,46,30,01,31,66}。

相关文档
最新文档