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

合集下载

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

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

第九章查找一、选择题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. 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算法结束;五、教师评语。

相关文档
最新文档