数据结构:查找子系统

合集下载

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

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

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

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

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

数据结构中的查找算法总结静态查找是数据集合稳定不需要添加删除元素的查找包括: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; 折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向⼀个实际上不存在的结点——外结点,所有外界点都是查找不成功的情况,如图所⽰。

数据结构-查找

数据结构-查找

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

这篇关于查找的博客也只是⽤来记录以便于后续复习的,所以很多地⽅只是浅谈,并没有代码的实现如果有缘发现这篇⽂章想要深⼊了解或者因为作者表达能⼒差⽽看不懂以及有错的地⽅,欢迎留⾔指出来,我会尽快去完善的,期待有缘⼈内容多和杂,如果有机会我进⼀步进⾏梳理,将其重新梳理⼀⽚⽂章(会更注重于代码)本来只是想简单写⼀下的,但是不⼩⼼就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树):一种通过字符串的前缀来组织和查找数据的树形数据结构。

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

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

数据结构的查找算法

数据结构的查找算法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**题目:编写循序查找程序* 编写二分查找程序* 编写建立二叉排序树的程序* 编写在二叉排序树上的查找、输入、删除结点的程序* 编写二叉排序树的中序输出的程序* 设计一个选择式菜单,一级菜单形式如下:* 查找子系统* ********************************** * 1------顺序查找** * 2------二分查找** * 3------二叉排序树** * 0------返回** ********************************** 请选择菜单号(0--3):* 二叉排序树的二级菜单如下:* 二叉排序树* ************************************* * 1------更新二叉排序树** * 2------查找结点** * 3------插入结点** * 4------删除结点** * 5------中序输出排序树** * 0------返回** ************************************* 请选择菜单号(0--5):*/#include <stdio.h>#include <string.h>#include <stdlib.h>#define SEARCHMAX 30typedef struct node{int trData; //根节点struct node *lchild; //左子树struct node *rchild; //右子树}BtNode, *pBtNode;void seqSearch();void binSearch();void btSearch();pBtNode createBT();void searchBT(pBtNode T, int k);void insBT(pBtNode *T, int k);void delBT(pBtNode *T, int k);void inorderBT(pBtNode T);void main(){int choice, k = 1;while (k){printf("\n 查找子系统\n");printf("*********************************\n");printf("* 1------顺序查找*\n");printf("* 2------二分查找*\n");printf("* 3------二叉排序树*\n");printf("* 0------返回*\n");printf("*********************************\n");printf("请选择菜单号(0--3):");fflush(stdin);scanf("%d", &choice);switch(choice){case 1:seqSearch();break;case 2:binSearch();break;case 3:btSearch();break;case 0:k = 0;break;default:printf("输入错误,请重新输入。

");getchar();k = 1;break;}}}void seqSearch() //顺序查找{int a[SEARCHMAX], x, y, i;char ch;printf("建立一个整数的顺序表(以-1结束):");for (i = 0; i<SEARCHMAX; i++){scanf("%d", &a[i]);getchar();if (a[i] == -1) //记录结束位置,结束循环{y = i;break;}}printf("是否需要查找(Y/N):");scanf("%c", &ch);while (ch == 'y'||ch == 'Y'){printf("请输入要查找的数据:\n");scanf("%d", &x);getchar();i = 0; //找到数组的结束位置。

while (i < y-1&&a[i] != x) //找到要查找的数据的位置{i++;}if (i == -1) //没找到{printf("对不起,没有找到。

\n");}else{printf("该数据在第%d个位置上。

\n", i+1);}printf("是否继续查找(Y/N):");scanf("%c", &ch);}}void binSearch() //二分查找{int b[SEARCHMAX], i, y, x, low, mid, high, n;char ch;printf("建立递增有序的查找顺序表(以-1结束):\n");for (i = 0; i<SEARCHMAX; i++){scanf("%d", &b[i]);getchar();if (b[i] == -1) //记录结束位置,结束循环{y = i;break;}}printf("是否需要查找(Y/N):");scanf("%c", &ch);while (ch == 'y'||ch == 'Y'){printf("请输入要查找的数据:");scanf("%d", &x);getchar();low = 0; //低high = y-1; //高n = 0; //记录次数while (low <= high){mid = (low+high)/2;n++;if (b[mid] > x) //在左边{high = mid-1;}else if (b[mid] < x) //在右边{low = mid+1;}else //找到{break;}}if (low > high){printf("对不起,没有找到该数据。

\n");printf("共进行%d次比较。

\n", n);if (b[mid] < x) //查找最后小于该数据的位置{mid++;}printf("可将此数据插入第个%d位置", mid+1);}else{printf("找到该数据在第%d个位置。

\n", mid+1);printf("共进行%d次比较。

\n", n);}printf("是否需要查找(Y/N):");scanf("%c", &ch);}}void btSearch() //二叉排序树{int choice, x, l = 1;pBtNode T;printf("建立一棵二叉排序树存储\n");T = createBT();getchar();while (l){printf("\n 二叉排序树\n");printf("***********************************\n");printf("* 1------更新二叉排序树*\n");printf("* 2------查找结点*\n");printf("* 3------插入结点*\n");printf("* 4------删除结点*\n");printf("* 5------中序输出排序树*\n");printf("* 0------返回*\n");printf("************************************\n");printf("请选择菜单号(0--5):");fflush(stdin);scanf("%d", &choice);switch(choice){case 1:T = createBT();break;case 2:printf("请输入要查找的数据:");scanf("%d", &x);getchar();searchBT(T, x);break;case 3:printf("请输入要插入的数据:");scanf("%d", &x);insBT(&T, x);break;case 4:printf("请输入要删除的数据:");scanf("%d", &x);delBT(&T, x);break;case 5:inorderBT(T);break;case 0:l = 0;break;default:printf("输入错误,请重新输入。

");getchar();l = 1;break;}}}pBtNode createBT() //建立二叉树{pBtNode T; //声明指针int x;T = NULL;printf("请输入一个整数(输入0结束):");fflush(stdin);scanf("%d", &x);getchar();while (x) //输入的数据非零时{insBT(&T, x); //二叉树中插入数据printf("请输入下一个整数(输入0结束):");fflush(stdin);scanf("%d", &x);getchar();}return T; //返回指针}void searchBT(pBtNode T, int k) //查找二叉树结点{pBtNode f = T;while (f){if(f->trData == k) //判断是否找到该数据{printf("已找到数据。

相关文档
最新文档