《数据结构》数据结构查找

合集下载

数据结构第九章--查找-习题及答案

数据结构第九章--查找-习题及答案

第九章查找一、选择题1•若查找每个记录的概率均等,则在具有n 个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL 为()。

A .(n-1)/2B.n/2C.(n+1)/2D.n 2. 下面关于二分查找的叙述正确的是()A. 表必须有序,表可以顺序方式存储,也可以链表方式存储C.表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型D.表必须有序,且表只 能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法() A. 必然快B.必然慢C.相等D.不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度()A.3.1B.4C.2.5D.55.当采用分块查找时,数据的组织方式为()A. 数据分成若干块,每块内数据有序B. 数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6. 二叉查找树的查找效率与二叉树的((1))有关,在((2))时其查找效率最低(1) :A.高度B.结点的多少C.树型D.结点的位置(2) :A.结点太多B.完全二叉树C.呈单枝树D.结点太复杂。

7. 对大小均为n 的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)),对于查找成功,他们的平均查找长度是((2))供选择的答案:A.相同的B.不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是()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)10. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A 的左孩子的平衡因子为0右孩子的平衡因子为1,则应作()型调整以使其平衡。

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

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

实验五查找的应用一、实验目的: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的数据元素。

大学数据结构课件--第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

数据结构-查找

数据结构-查找

数据结构-查找写在前⾯:这些内容是以考研的⾓度去学习和理解的,很多考试中需要⽤到的内容在实际应⽤中可能⽤不上,⽐如其中的计算问题,但是如果掌握这些东西会帮你更好的理解这些内容。

这篇关于查找的博客也只是⽤来记录以便于后续复习的,所以很多地⽅只是浅谈,并没有代码的实现如果有缘发现这篇⽂章想要深⼊了解或者因为作者表达能⼒差⽽看不懂以及有错的地⽅,欢迎留⾔指出来,我会尽快去完善的,期待有缘⼈内容多和杂,如果有机会我进⼀步进⾏梳理,将其重新梳理⼀⽚⽂章(会更注重于代码)本来只是想简单写⼀下的,但是不⼩⼼就get不到重点了本来打算等逐步完善和优化后再发出来的,但那样继续往前总感觉有所顾及,所以就先给这⼏天查找的复习暂时告⼀段落吧。

导学概览总体(⼀)概念查找:在数据集合中查找特定元素的过程查找表(查找结构):同⼀类型数据元素构成的集合静态查找表:只涉及查找,不存在修改适⽤:顺序查找,折半查找,散列查找等动态查找表:动态插⼊和删除,对查找表进⾏修改适⽤:⼆叉排序树,散列查找等所有数据结构都可以看作是查找表,对于折半查找和顺序查找这些都属于查找算法关键字:数据元素中唯⼀标识该元素的某数据项的值主关键字:此关键字能唯⼀表⽰⼀个数据元素次关键字:此关键字⽤以识别若⼲记录(⼀对多)说明:在查找表中每个数据元素就相当于⼀条记录,包含有不同的数据项,例如拿学⽣为例,⼀个学⽣作为数据元素,那么学号,⾝⾼,姓名就是这个元素中的数据项,每个学⽣都有特定的学号,因此学号可以作为关键字。

(当然如果数据项包含⾝份证号,你⽤⾝份证号⾛位关键字也可以)0x01平均查找长度(重点注意:作为查找算法效率衡量的主要指标,那么查找算法的性能分析肯定是重点分析平均查找长度的,因此必须熟练掌握。

提⼀嘴,算法效率的度量前⾯学过时间和空间复杂度,但是算法效率的度量不是只取决于时间和空间复杂度,针对不同的算法还可能会有其他⼀些辅助度量,如查找算法中的平均查找长度。

数据结构查找知识点总结

数据结构查找知识点总结

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

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树):一种通过字符串的前缀来组织和查找数据的树形数据结构。

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

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

数据结构查找与排序

数据结构查找与排序

第二部分 排序
• 各种排序算法的特性
– 时间性能(最好、最坏、平均情况) – 空间复杂度 – 稳定性
• 常见排序算法
– 堆排序-堆的定义,创建堆,堆排序(厦大3次,南航2次,南大3次) – 快速排序 – 基数排序 – 插入排序 – 希尔排序 – 冒泡排序 – 简单选择排序 – 归并排序
一、基于选择的排序
• 快速排序算法关键字的比较和交换也是跳跃式进行的,所以快速排序 算法也是一种不稳定的排序方法。
• 由于进行了递归调用,需要一定数量的栈O(log2n)作为辅助空间
例如
1、快速排序算法在 数据元素按关键字有序的 情况下最不利于发挥其长处。
2、设关键字序列为:49,38,66,80,70,15,22,欲对该序列进行从小到大排序。 采用待排序列的第一个关键字作为枢轴,写出快速排序法的一趟和二趟排序之 后的状态
49
49
38
66
38
10
90
75
10
20
90
75
66
20
10
38
20
90
75
66
49
2.序列是堆的是( C )。 A.{75, 65, 30, 15, 25, 45, 20, 10} B.{75, 65, 45, 10, 30, 25, 20, 15} C.{75, 45, 65, 30, 15, 25, 20, 10} D.{75, 45, 65, 10, 25, 30, 20, 15}
➢ 依靠“筛选”的过程
➢ 在线性时间复杂度下创建堆。具体分两步进行: 第一步,将N个元素按输入顺序存入二叉树中,这一步只要求满 足完全二叉树的结构特性,而不管其有序性。
第二步,按照完全二叉树的层次遍历的反序,找到第一个非叶子结点, 从该结点开始“筛选”,调整各结点元素,然后按照反序,依次做筛选,直到做 完根结点元素,此时即构成一个堆。

数据结构的查找算法

数据结构的查找算法

数据结构的查找算法在计算机科学中,数据结构是用于组织和存储数据的一种方式。

查找算法是数据结构中的重要部分,它用于在数据集合中搜索特定元素或信息。

本文将介绍几种常见的数据结构查找算法,包括线性查找、二分查找、哈希查找以及树结构的查找算法。

1. 线性查找线性查找是一种简单直观的查找方法,适用于无序的数据集合。

其基本思想是从数据集合的第一个元素开始逐个比较,直到找到目标元素或者遍历完整个数据集合。

由于线性查找需要遍历所有元素,所以时间复杂度为O(n),其中n为数据集合的大小。

2. 二分查找二分查找是一种高效的查找算法,但它要求数据集合中的元素必须有序。

具体实现方式是将数据集合分为两半,然后与目标元素进行比较,不断缩小查找范围,直到找到目标元素或者确定目标元素不存在。

由于每次都将查找范围减小一半,所以时间复杂度为O(log n),其中n为数据集合的大小。

3. 哈希查找哈希查找利用哈希函数将目标元素映射到哈希表中的特定位置,从而快速定位目标元素。

哈希表是一种以键-值对形式存储数据的数据结构,可以快速插入和删除元素,因此在查找时具有良好的性能。

哈希查找的时间复杂度为O(1),但在处理哈希冲突时可能会影响性能。

4. 树结构的查找算法树是一种常见的数据结构,其查找算法主要包括二叉搜索树、平衡二叉搜索树以及B树和B+树。

二叉搜索树是一种有序的二叉树,左子树的所有节点值都小于根节点,右子树的所有节点值都大于根节点。

通过比较目标元素与节点的值,可以快速定位目标元素。

平衡二叉搜索树是为了解决二叉搜索树在某些情况下可能出现的退化情况,通过旋转操作保持树的平衡性。

B树和B+树是一种多路搜索树,它们可以减少磁盘I/O操作,适用于大规模数据的查找。

综上所述,数据结构的查找算法是计算机科学中的重要内容。

不同的查找算法适用于不同的场景,选择合适的算法可以提高查找效率。

在实际应用中,需要根据数据集合的特点及查找需求来选择合适的算法。

查找-数据结构

查找-数据结构

平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称ASL。
对于含有n个记录的表,查找成功时的平 均查找长度为: n ASL PiCi i 1
其找到中表:中Pi为其查关找键表字中与第给i定个值记相录等的的概第率,i个C记i为 录时和给定值已进行过比较的关键字个数。
(1)若*p 为叶子结点,直接删除即可。
45
45
12
3
37
53
f
100
24
p
61
60
90
12
53
3
删除24
f->lchild = null; delete p;
37
100
61
60
90
78
78
(2)若*p结点只有左子树PL或只有右子树PR,此 时只要令PL或PR直接成为*f的左子树即可
f
F
f
F
p
P
p
二叉排序树的插入
基本思想:
若二叉排序树为空,则待插结点作为根结点插入 到空树中;
若待插结点的关键字值和根结点的关键字值相等, 则说明树中已有此结点,无需插入;
若待插结点的关键字值小于根结点的关键字值, 则将待插结点插入到根的左子树中;
若待插结点的关键字值大于根结点的关键字值, 则将待插结点插入到根的右子树中;
mid low
mid low
mid low
mid low
mid
mid
mid
mid
6
3
9
1
47
10
2
58
11
由此可见,二分查找过程恰好是走了一条从判 定树的根到被查结点的路径,比较的关键字个 数恰为该结点在判定树中的层数。

数据结构练习第八章查找

数据结构练习第八章查找

数据结构练习第⼋章查找数据结构练习第⼋章查找1.若有18个元素的有序表存放在⼀维数组A[19]中,第⼀个元素放A[1]中,现进⾏⼆分查找,则查找A[3]的⽐较序列的下标依次为( )A. 1,2,3B. 9,5,2,3C. 9,5,3D. 9,4,2,32.设⼆叉排序树中有n个结点,则在⼆叉排序树的平均平均查找长度为()。

A. O(1)B. O(log2n)C. O(n)D. O(n2)3.在⼆叉排序树中插⼊⼀个结点的时间复杂度为()。

A. O(1)B. O(n)C. O(log2n)D. O(n2)4.设有序顺序表中有n个数据元素,则利⽤⼆分查找法查找数据元素X的最多⽐较次数不超过()。

A. log2n+1B. log2n-1C. log2nD. log2(n+1) 5.设有序表中有1000个元素,则⽤⼆分查找查找元素X最多需要⽐较()次。

A. 25B. 10C. 7D. 16.顺序查找不论在顺序线性表中还是在链式线性表中的时间复杂度为()。

A. O(n)B. O(n2)C. O(n1/2)D. O(1og2n) 7.设⼆叉排序树上有n个结点,则在⼆叉排序树上查找结点的平均时间复杂度为()。

A. O(n)B. O(n2)C. O(nlog2n)D. O(1og2n) 8.()⼆叉排序树可以得到⼀个从⼩到⼤的有序序列。

A. 先序遍历B.中序遍历C. 后序遍历D. 层次遍历9.设⼀组初始记录关键字序列为(13,18,24,35,47,50,62,83,90,115,134),则利⽤⼆分法查找关键字90需要⽐较的关键字个数为()。

A. 1B. 2C. 3D. 410.设某散列表的长度为100,散列函数H(k)=k % P,则P通常情况下最好选择()。

A. 99B. 97C. 91D. 9311.在⼆叉排序树中插⼊⼀个关键字值的平均时间复杂度为()。

A. O(n)B. O(1og2n)C. O(nlog2n)D. O(n2)12.设⼀个顺序有序表A[1:14]中有14个元素,则采⽤⼆分法查找元素A[4]的过程中⽐较元素的顺序为( )。

数据结构 第九章查找

数据结构 第九章查找

第九章查找:习题习题一、选择题1.散列表查找中k个关键字具有同一散列值,若用线性探测法将这k个关键字对应的记录存入散列表中,至少要进行( )次探测。

A. kB.k+lC. k(k+l)/2D. l+k (k+l)/22.下述命题( )是不成立的。

A. m阶B-树中的每一个结点的子树个数都小于或等于mB. m阶B-树中的每一个结点的子树个数都大于或等于『m/2-1C. m阶B-树中的每一个结点的子树高度都相等D.m阶B-树具有k个子树的非叶子结点含有(k-l)个关键字3.如果要求一个基本线性表既能较快地查找,又能适应动态变化的要求,可以采用( ) 查找方法。

A.分块B. 顺序C. 二分D.散列4.设有100个元素,用折半查找法进行查找时,最大比较次数是( ),最小比较次数是( )。

A.7,1B.6,lC.5,1D. 8,15.散列表长m=15,散列表函数H(key)=key%13。

表中已有4个结点:addr(18)=5;addr(32)=6; addr(59)=7; addr(73)=8;其余地址为空,如果用二次探测再散列处理冲突,关键字为109的结点的地址是( )。

A. 8B. 3C. 5D. 46.用分块查找时,若线性表中共有729个元素,查找每个元素的概率相同,假设采用顺序查找来确定结点所在的块时,每块应分( )个结点最佳。

A. 15B. 27C. 25D. 307.散列函数有一个共同性质,即函数值应当以( )取其值域的每个值。

A.同等概率B. 最大概率C. 最小概率D.平均概率8.设散列地址空间为O..m-1,k为关键字,假定散列函数为h(k)=k%p,为了减少冲突,一般应取p为( )。

A.小于m的最大奇数B. 小于m的最大素数C.小于m的最大偶数D.小于m的最大合数9.当向一棵m阶的B-树做插入操作时,若使一个结点中的关键字个数等于( ),则必须分裂成两个结点。

A.mB. m-lC.m+lD.[m+1]10.当向一棵m阶的B壤f做删除操作时,若使一个结点中的关键字个数等于( ),则可能需要用它的左兄弟或右兄弟结点合并成一个结点。

数据结构 查找

数据结构 查找

生成二叉排序树过程。
10 3 2 7 8 18 12
注:二叉排序树与关键字排列顺序有关,排列顺 序不一样,得到的二叉排序树也不一样。
二叉排序树的建立的算法
反复调用二叉排序树的插入算法即可 Bitree Creat (int n) { //建立含有n个结点的二叉排序树
Bitree T= NULL;
for ( int i=1; i<=n; i++) {
else if LT(key,p->key) p->lchild=s;
else p->rchild=s
return TRUE; }
//被插结点*s为右孩子
else return FALSE;
}// Insert BST
//树中已有关键字相同的结点,不再插入
4)二叉排序树的建立
例:关键字序列{ 10、18、3、8、12、2、7、3 }
5)二叉排序树上的删除
对于二叉排序树,删去树上一个结点相当于删去有序 序列中的一个记录,在删除某个结点之后依旧要保持二叉 排序树的特性。
如何在二叉排序树上删去一个结点呢?
设在二叉排序树上被删结点为*p(指向结点的指针为 p),其双亲结点为*f,设*p是*f的左孩子。 f F p P c PR C q Q s CL S QL SL
low
( 08,
( 08,
mid
14,
14,
high
55, 68, 79,
79,
23,
23,
37,
37,
46,
46,
91 )
low
55,
mid
68,
high
91 )
low mid

数据结构-第9章 查找

数据结构-第9章 查找

静态查找表 对查找表的查找仅是以查询为 目的,不改动查找表中的数据。 动态查找表 在查找的过程中同时插入不存 在的记录,或删除某个已存在的记录。
查找成功 查找表中存在满足查找条件的记 录。 查找不成功 查找表中不存在满足查找条件 的记录。
内查找 整个查找过程都在内存中进行。 外查找 在查找过程中需要访问外存。 平均查找长度ASL——查找方法时效的度量 为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值。 n 查找成功时的ASL计算方法: ASL pici
3. 在二叉排序树上的操作
1)查找
[例] Key=28 f 24 12 T
45
53 28 90
Key=32 T 45 24 53 12 f 28 90 32
[算法描述]
2) 插入
[算法描述]
3) 生成
查找算法
返回
BiTree SearchBST(BiTree T,KeyType key){
//在根指针T所指二叉树中递归地查找某关键字等于 //key的数据元素,若查找成功,则返回指向该数据元 //素结点的指针,否则返回空指针
图9.1 用折半查找法查找12、50的过程 其中mid=(low+high)/2,当high<low时,表 示不存在这样的子表空间,查找失败。
成功! 位 置 1 2 3 4 5 6 7 8 9 10 11

6 12 15 18 22 25 28 35 45 58 60
low hign mid mid hign mid low mid (a) 用折半查找法查找12的过程
[性能分析] • 空间:一个辅助空间。 • 时间: 查找成功时的平均查找长度 设表中各记录查找概率相等 n ASLs(n)= PiCi =(1+2+ ... +n)/n =(n+1)/2 i 1 [算法特点] • 算法简单,对表结构无任何要求 • n很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。

数据结构查找总结

数据结构查找总结

数据结构查找总结
嘿,朋友们!今天咱来聊聊数据结构查找这档子事儿。

你说数据结构查找像不像在一个超级大的宝藏库里找宝贝呀?那宝藏库里的宝贝就是我们要的数据,而我们就是那个努力寻找的人。

有时候找起来可容易了,一下就找到了,那感觉,爽!可有时候呢,哎呀,就跟捉迷藏似的,半天都找不着,真让人着急上火啊!
比如说顺序查找,就像是一个一个地去翻找,虽然简单直接,但要是数据量大了,那可就有点费劲咯!二分查找呢,就厉害多了,就像一下子就把范围缩小了一半,效率高了不少呢!还有什么二叉树查找之类的,各有各的本事。

咱在生活中不也经常查找东西吗?找钥匙、找手机,跟在数据结构里找数据不是一个道理嘛!要是没个好方法,那不得急得团团转呀。

数据结构查找可不只是在电脑里有用哦,它在好多地方都能派上大用场呢!想想看,要是没有高效的查找方法,那我们上网搜索东西得等多久呀?我们的手机软件运行得该多卡呀!
所以啊,数据结构查找真的超级重要!它能让我们的生活和工作变得更高效、更便捷。

别小看了它,这可是个大学问呢!大家可得好好去了解了解呀!。

天大《数据结构》学习笔记六

天大《数据结构》学习笔记六

这就是“冲突”。 (a)设计一个“好的”哈希函数:“好的”标准:(I)计算简便。(II)冲突少。 (b)给出解决冲突的方法。
5.3 构造哈希函数的方法举例:
构造哈希函数时应考虑到实际问题的需要,即表的长度,和键值的范围。如表长为 M,则 0<=h(k)<M. (1)除留余数法: 已知表长为 M,令 P 为接近 M 的质数,a 为常数(表头地址),则造 h(k)=k MOD p +a. 如:键值的范围为 000001 到 859999,M=6000 表头地址为 1000000,选 P=5987。 H(k)=k MOD 5987+1000000 如 k=179148 则 h(k)=1005525 (2)移位法: 如键值 k=32834872, M=1000
}
三、索引顺序查找(分块查找):
索引表:
本块最大 起始:
22
48
86
1
7
13
[1]
[7][13]来自22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53
块内无序,但块间有序:
数据结构—学习笔记六
查找方法:
(I)先决定在哪一块内(在索引表内) (II)再从此块内查找。
六、键树 如键集为:{CAI,CAO,LI,LAN,CHA……} 6.1 存入如下:
将此树转换为二叉树: 查某键时,按每个字母去查。此字母与二叉树上的当前行字母不匹配,则横向移动, 查下一;如匹配,则竖向移动,查下一个。 6.2 算法:(K.ch[num-1]为结束符$) { p=t->first; I=0;
328 348 + 72 748
数据结构—学习笔记六

数据结构第九章--查找-习题及答案

数据结构第九章--查找-习题及答案

第九章查找一、选择题1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为( )。

A. (n-1)/2 B. n/2 C. (n+1)/2 D. n2. 下面关于二分查找的叙述正确的是 ( )A. 表必须有序,表可以顺序方式存储,也可以链表方式存储 C. 表必须有序,而且只能从小到大排列B. 表必须有序且表中数据必须是整型,实型或字符型 D. 表必须有序,且表只能以顺序方式存储3. 用二分(对半)查找表的元素的速度比用顺序法( )A.必然快 B. 必然慢 C. 相等 D. 不能确定4. 具有12个关键字的有序表,折半查找的平均查找长度()A. 3.1B. 4C. 2.5D. 55.当采用分块查找时,数据的组织方式为 ( )A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块C. 数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D. 数据分成若干块,每块(除最后一块外)中数据个数需相同6. 二叉查找树的查找效率与二叉树的( (1))有关, 在 ((2))时其查找效率最低(1): A. 高度 B. 结点的多少 C. 树型 D. 结点的位置(2): A. 结点太多 B. 完全二叉树 C. 呈单枝树 D. 结点太复杂。

7. 对大小均为n的有序表和无序表分别进行顺序查找,在等概率查找的情况下,对于查找失败,它们的平均查找长度是((1)) ,对于查找成功,他们的平均查找长度是((2))供选择的答案:A. 相同的B.不同的9.分别以下列序列构造二叉排序树,与用其它三个序列所构造的结果不同的是( ) 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)10. 在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结点为A,并已知A的左孩子的平衡因子为0右孩子的平衡因子为1,则应作( ) 型调整以使其平衡。

数据结构第9章 查找习题

数据结构第9章  查找习题

第9章查找一、单项选择题1.顺序查找法适合于存储结构为______的线性表。

A.哈希存储B.顺序存储或链式存储C.压缩存储D.索引存储2.对线性表进行二分查找时,要求线性表必须______。

A.以顺序方式存储B.以链式方式存储C.以顺序方式存储,且结点按关键字有序排序D.以链式方式存储,且结点按关键字有序排序3.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,则可采用______方法。

A.顺序查找B.二分查找C.分块查找D.以上都不对4.在含有27个结点的二叉树排序树上,查找关键字为35的结点,则依次比较的关键字有可能是______。

A.28,36,18,46,35 B.18,36,28,46,35C.46,28,18,36,35 D.46,36,18,28,355.在一棵平衡二叉树中,每个结点的平衡因子的取值范围是______。

A.-1~1 B.-2~2C.1~2 D.0~16.如图9-1所示的4棵二叉树A、B、C和D______是平衡二叉树。

A B.C D.图9-17.一棵深度为K的平衡二叉树,其每个非叶子结点的平衡因子均为0,则该树共有______个结点。

A.2k-1-1 B.2k-1C.2k-1+1 D.2k-18.查找效率最高的二叉树排序树是______。

A.所有结点的左子树都为空的二叉排序树B.所有结点的右子树都为空的二叉排序树C.平衡二叉树D.没有左子树的二叉排序树二、填空题1.长度为225的表,采用分块查找法,每块的最佳长度是_________________。

2.按13,24,37,90,53的次序形成平衡二叉树,则该平衡二叉树的高度是____________,其根为___________,左子树中的数据是____________,右子树中的数据是_____________。

三、判断题1.顺序查找法适用于存储结构为顺序或链式存储的线性表。

2.顺序查找法只能在顺序存储结构上进行。

数据结构顺序查找方法特点

数据结构顺序查找方法特点

数据结构顺序查找方法特点顺序查找(Sequential Search)是一种简单直观的查找方法,也是最基本的查找方法之一。

顾名思义,顺序查找是按照数据元素的顺序依次进行查找,直到找到目标元素或者查找结束为止。

在顺序查找中,数据元素之间没有任何特定的顺序要求,可以是有序的也可以是无序的。

顺序查找方法的特点如下:1. 简单直观:顺序查找是最简单的查找方法之一,其思想非常直观,容易理解和实现。

2. 适用性广泛:顺序查找适用于各种类型的数据结构,包括数组、链表等。

无论数据结构是有序还是无序,顺序查找都可以进行。

3. 查找效率低:由于顺序查找是按照元素的顺序依次进行查找,因此在最坏情况下需要遍历整个数据集合才能找到目标元素。

当数据集合较大时,顺序查找的效率较低。

4. 查找过程简单:顺序查找的过程非常简单,只需要从头到尾依次比较每个元素与目标元素的值即可。

无需进行任何额外的操作或计算。

5. 查找成功率高:由于顺序查找的过程是逐个比较元素的值,因此只要数据集合中存在目标元素,一定可以找到。

顺序查找方法的特点决定了它的应用场景和局限性。

由于顺序查找的效率较低,因此在数据量较大、查找频繁的情况下,不适合采用顺序查找。

而对于数据量较小、查找频率较低的情况,顺序查找是一种简单有效的查找方法。

在实际应用中,顺序查找可以用于以下场景:1. 数据量较小的线性表:当数据量较小的时候,顺序查找是一种简单高效的查找方法。

例如,在一个包含10个元素的数组中查找某个特定元素,顺序查找可以在较短的时间内完成。

2. 无序线性表:当数据元素之间没有特定的顺序要求时,顺序查找是一种简单可行的查找方法。

例如,在一个无序的链表中查找某个特定元素,顺序查找可以逐个比较链表中的元素,找到目标元素即可。

3. 数据量较大但查找频率较低的情况:当数据量较大、查找频率较低的时候,使用顺序查找虽然效率较低,但是可以满足需求。

在这种情况下,可以接受稍慢的查找速度以换取更简单的实现方式。

数据结构与算法(10):查找

数据结构与算法(10):查找
def binary_search(lis, key): low = 0 high = len(lis) - 1 time = 0 while low <= high: time += 1 # 计算mid值是插值算法的核心心代码 mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low])) print("mid=%s, low=%s, high=%s" % (mid, low, high)) if key < lis[mid]: high = mid - 1 elif key > lis[mid]: low = mid + 1 else: # 打印查找的次数 print("times: %s" % time) return mid print("times: %s" % time) return -1
× (high − low)
也就是将上述的比比例例参数1/2改进为自自适应的,根据关键字在整个有序表中所处的位置,让mid值 的变化更更靠近关键字key,这样也就间接地减少了了比比较次数。
基本思想:基于二二分查找算法,将查找点的选择改进为自自适应选择,可以提高高查找效率。当然, 插值查找也属于有序查找。
if __name__ == '__main__': LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444] result = binary_search(LIST, 444) print(result)
3.3 斐波那契查找
在介绍斐波那契查找算法之前,我们先介绍一一下和它很紧密相连并且大大家都熟知的一一个概念—— ⻩黄金金金分割。 ⻩黄金金金比比例例又又称为⻩黄金金金分割,是指事物各部分间一一定的数学比比例例关系,即将整体一一分为二二,较大大部 分与较小小部分之比比等于整体与较大大部分之比比,其比比值约为1:0.618。 0.618倍公认为是最具有审美意义的比比例例数字,这个数值的作用用不不仅仅体现在诸如绘画、雕塑、 音音乐、建筑等艺术领域,而而且在管理理、工工程设计等方方面面有着不不可忽视的作用用。因此被称为⻩黄金金金分 割。 大大家记不不记得斐波那契数列列:1,1,2,3,5,8,13,21,34,55,89......(从第三个数开 始,后面面每一一个数都是前两个数的和)。然后我们会发现,随着斐波那契数列列的递增,前后两个 数的比比值会越来越接近0.618,利利用用这个特性,我们就可以将⻩黄金金金比比例例运用用到查找技术中。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十数据结构查找一、实验目的1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。

2、掌握线性表中顺序查找和折半查找的方法。

3、学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。

二、实验预习说明以下概念1、顺序查找:2、折半查找:3、哈希函数:4、冲突及处理:三、实验内容和要求1. 静态查找表技术依据顺序查找算法和折半查找算法的特点,对下面的两个查找表选择一个合适的算法,设计出完整的C源程序。

并完成问题:查找表1 : { 8 ,15 ,19 ,26 ,33 ,41 ,47 ,52 ,64 ,90 } ,查找key = 41 查找表2 : {12 , 67 ,29 ,15 ,62 ,35 ,33 ,89 ,48 ,20 } ,查找key =35 查找key=41的算法:顺序查找比较次数:5查找key=35的算法:折半查找比较次数:5●顺序查找算法算法实现代码●#include<stdio.h>●#define N 10●int array[N]={12,76,29,15,62,35,33,89,48,20};●int search(int array[],int key)●{● for(int i=0;i<N;i++)● {● if(key==array[i])● return i;● }● return 0;● }●int main()●{● int a;● a=search(array,35);● if(a)●{● printf("查找的关键字35已经找到!它在表中的下标为:%d\n",a);●}● else● printf("该关键字不存在!\n");● return 0;●}●●折半查找算法算法实现代码●#include<stdio.h>●#define N 10●int array[N]={8,15,19,26,23,41,47,52,64,90};●int search(int key,int array[])●{●int low=0;●int mid;●int high=N-1;●int ley=41;●while(low<=high)●{●mid=(low+high)/2;●if(array[mid]==key)●{●return mid;●}●else if(array[mid]>key)●high=mid-1;●else●low=mid+1;●}●return 0;●}●int main()●{●int a;●a=search(41,array);●if(a)●{●printf("关键字:41已找到!该关键字在表中的下标为:%d\n",a);●}●else●printf("该关键字不存在!\n");●return 0;●}●●五、教师评语●2、哈希表的构造与查找/* 采用开放地址法构造哈希表*/#include<stdio.h>#include<malloc.h>#define MAXSIZE 25#define P 13#define OK 1#define ERROR 0#define DUPLICATE -1#define TRUE 1#define FALSE 0typedef struct{ /*哈希表元素结构*/int key; /*关键字值*/int flag; /*是否存放元素*/}ElemType;typedef struct {ElemType data[MAXSIZE];int count; /*元素个数*/int sizeindex; /*当前哈希表容量*/}HashTable;int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/int d2[15]={0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/void dataset(int ds[],int *len);int InsertHash(HashTable *H,int e,int d[]);int CreateHash(HashTable *H,int ds[],int len,int d[]);int SearchHash(HashTable *H, int e,int d[]);void menu();/*输入查找表*/void dataset(int ds[],int *len){int n,m;n=0;printf("\n查找表输入:");while(scanf("%d",&m)==1){ /*以输入一个非整数作为结束*/ds[n]=m;n++;}*len=n;}/*计算哈希地址,插入哈希表*/int InsertHash(HashTable *H,int e,int d[]){int k,i=1;k=e%P;while(H->data[k].flag==TRUE||k<0){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return ERROR;}H->data[k].key=e;H->data[k].flag=TRUE;H->count++;return OK;}/*构造哈希表*/int CreateHash(HashTable *H,int ds[],int len,int d[]){ int i;for(i=0;i<len;i++){if(SearchHash(H,ds[i],d)!=-1)return DUPLICATE;InsertHash(H,ds[i],d);if(H->count>=MAXSIZE)return ERROR;}return OK;}/*初始化哈希表*/void InitHash(HashTable *H){int i;for(i=0;i<MAXSIZE;i++){H->data[i].key=0;H->data[i].flag=FALSE;}}/*在哈希表中查找*/int SearchHash(HashTable *H, int e,int d[]){int k,i=1;k=e%P;while(H->data[k].key!=e){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return -1;}return k;}/*演示菜单*/void menu(){int choice;int *p;HashTable h;h.count=0;h.sizeindex=MAXSIZE;int a[MAXSIZE]={0};int i,n,e;dataset(a,&n); /*建立查找表*/getchar();printf("\n");do{printf("\n----哈希查找演示----\n");printf("\n1.线性探测构造哈希表\n");printf("\n2.二分探测构造哈希表\n");printf("\n3.退出\n");printf("\n输入选择:");scanf("%d",&choice);if(choice==1)p=d1;else if(choice==2)p=d2;elsereturn;InitHash(&h); /*初始化哈希表*/if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/printf("\n哈希表构造失败!\n");else if(i==DUPLICATE)printf("\n哈希表具有重复关键字!\n");else{printf("\n哈希表:\n");for(i=0;i<h.sizeindex;i++)printf("%3d",h.data[i].key);printf("\n\n哈希查找\n输入要查找的key值:"); getchar();scanf("%d",&e);if((i=SearchHash(&h,e,p))==-1)printf("\n%d未找到\n",e);elseprintf("\n%d在哈希表中下标为%d\n",e,i);}getchar();}while(1);}int main(){menu();return 0;}输入查找表为:19 14 23 1 68 20 84 27 55 11 10 79(注意以输入一个非整数结束)。

运行结果:1)线性探测散列:哈希表形态:84在哈希表中的位置:2)二次探测散列:哈希表形态:84在哈希表中的位置:四、实验小结实验顺序查找35:输入输出结果#include<stdio.h>定义函数库可以便于可以使用后面的函数语句;#define N 10定义大N为10代表数组的最大个数为10个数;int array[N]={12,76,29,15,62,35,33,89,48,20};int search(int array[],int key)定义搜索内容包括以查找的一维数组、关键字;{for(int i=0;i<N;i++)for()函数循环进对数组的所有数据进行查找,使得数组可以全部被查询;{if(key==array[i])判断如果查询的关键字是否等于一维数组中的值;return i;如果等于返回值i;}return 0;反之算法结束;}int main()函数调用定义以下的值使得以下的值可以执行以上的语句;{int a;定义一个整型值a;a=search(array,35);将a赋值于搜索对象35的下标;if(a)如果a满足上述i的判断条件;{printf("查找的关键字35已经找到!它在表中的下标为%d\n",a);输出查找成功提示语;}else否则;printf("该关键字不存在!\n");输出查找失败提示语return 0;并且算法结束;}实验半折查找41:输入输出结果#include<stdio.h>定义函数库以便于后面的函数语句可以使用;#define N 10定义一维数组的最大长度为N并且N的值为10;int array[N]={8,15,19,26,23,41,47,52,64,90};定义一维数组的10个数值;int search(int key,int array[])定义搜索查询的关键字和查询的一维数组;{int low=0;定义初始为0;int mid;定义中间值为整型;int high=N-1;定义数值高的值进行向前进一位;int ley=41;定义需要查找的值为41;while(low<=high)while()循环当low值小于high的值时进入循环条件直到所有数据都被查了一遍;{mid=(low+high)/2;将中间值赋值于低值加高值和除以2折半操作;if(array[mid]==key)如果一位数组所取得的中间值等于所要查询的关键字;{return mid;返回中间值;}else if(array[mid]>key)否则如果一维数组的中间值的大于所查询的关键字;high=mid-1;高的值赋值于中间值向前进一位;else否则;low=mid+1;将低值赋值于中间值前进一个值;}return 0;返回值0算法结束;}int main()函数调用使得下面定义的数值可以满足上面的判断语句;{int a;定义整型变量a;a=search(41,array);if(a)如果a满足上面的if语句中的条件则对应输出查询的结果;{printf("关键字:41已找到!该关键字在表中的下标为:%d\n",a);输出查询成功提示语并且还有结果a值;}else否则;printf("该关键字不存在!\n");输出查询失败的提示语;return 0;返回值0算法结束;五、教师评语。

相关文档
最新文档