顺序表的顺序查找算法SeqSearch1
第8章 查找(1)
17/62
假设所有不成功查找的情况为m种,它们的查找概率相同,即qi=0.5/m, 则不成功情况下的平均查找长度为:
合起来: 可以推出:顺序查找的时间复杂度为O(n)。
18/62
顺序查找总结 顺序查找的优点是算法简单,且对查找表的存储结构无特殊要求,无论 是用顺序表还是用链表来存放元素,也无论是元素之间是否按关键字有 序,它都同样适用。 顺序查找的缺点是查找效率低,因此,当n较大时不宜采用顺序查找。
19/62
1.折半查找算法
查找表R[0..n-1]为递增有序顺序表
简单比较方法
#顺序查找算法1
#从表头往后找 #未找到返回-1 #找到后返回其序号i
12/62
设置一个哨兵
关键字比较
def SeqSearch2(R,k): n=len(R) R.append(k) i=0 while R[i]!=k: i+=1
if i==n: return -1 else: return i
#顺序查找算法2
#末尾添加一个哨兵
#从表头往后找 #未找到返回-1 #找到后返回其序号i
说明 由于查找算法主要考虑关键字之间的比较,两个算法的效率差不多
13/62
2. 顺序查找算法分析
1)仅考虑查找成功的情况
第1个元素即R[0]=k,1次关键字比较。 第2个元素即R[1]=k,2次关键字比较。 以此类推,第n个元素即R[n-1]=k,n次关键字比较 共有n种查找成功的情况,在等概率时,pi=1/n。
6/62
查找表T:含有n个记录。
成功情况下(概率相等)的平均查找长度ASL成功是指找到T中任一记录平均 需要的关键字比较次数。
数据结构——查找,顺序查找,折半查找
实验五查找的应用一、实验目的: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的数据元素。
数据结构_查找原理及典型的查找算法
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)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储
计算机学科专业基础综合数据结构-7
计算机学科专业基础综合数据结构-7(总分:100.00,做题时间:90分钟)一、单项选择题(总题数:28,分数:74.00)1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为______。
(分数:2.00)A.(n-1)/2B.n/2C.(n+1)/2 √D..n解析:[解析] 此结论需要考生当作定理一样的牢记。
顺序查找法适用于查找顺序存储或链式存储的线性表,平均比较次数为______,二分法查找只适用于查找顺序存储的有序表,平均比较次数为______。
在此假定N为线性表中结点数,且每次查找都是成功的。
(分数:4.00)A.N+1B.2log2NC.log2ND.N/2 √E.Nlog2NF..N2解析:A.N+1B.2log2NC.log2N √D.N/2E.Nlog2NF..N2解析:2.下面关于二分查找的叙述正确的是______。
(分数:2.00)A.表必须有序,表可以顺序方式存储,也可以链表方式存储B.表必须有序且表中数据必须是整型、实型或字符型C.表必须有序,而且只能从小到大排列D.表必须有序,且表只能以顺序方式存储√解析:二叉查找树的查找效率与二叉树的______有天,在______时查找效率最低。
(分数:4.00)A.高度B.结点的多少C.树形√D.结点的位置解析:A.结点太多B.完全二叉树C.呈单枝树√D.结点太复杂解析:3.当采用分块查找时,数据的组织方式为______。
(分数:2.00)A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块√C.数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D.数据分成若干块,每块(除最后一块外)中数据个数需相同解析:[解析] 本题主要考查分块查找的相关概念。
4.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用下列哪一种查找方法?______ (分数:2.00)A.分块√B.顺序C.二分法D.哈希解析:[解析] 由于题目只说明是线性表,因此排除二分法。
数据结构(八)查找
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
基本查找方法
分块查找算法
int blksearch (sqlist r,index idx,int k,bn) /*bn为块的个数*/ {
int i,high=bn,low=1,mid,j,find=0; while (low<=high&& !find) { /*二分查找索引表*/
mid=(low+high)/2; if(k<idx[mid].key)
查找
图8.1 线性表与索引表
查找
索引表的定义
struct indexterm {
keytype key; int low,high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
查找
二分查找算法
int binsearch(sqlist r,int k,n) {
int i,low=1,high=n,m,find=0; /*low和high分别表示查找范围的起始单元下标和终止
单元下标,find为查找成功的标志变量*/ while (low<=high && !find) {
m=(low+high)/2; if(k<r[m].key)
数据结构
1.1 顺序查找
顺序查找(Sequential search)也称为线性查找, 是采用线性表作为数据的存储结构,对数据 在表中存放的先后次序没有任何要求。
顺序查找是最简单的查找方法,它的基本思 想是:查找从线性表的一端开始,顺序将各 单元的关键字与给定值k进行比较,直至找 到与k相等的关键字,则查找成功,返回该 单元的位置序号;如果进行到表的另一端, 仍未找到与k相等的关键字,则查找不成功, 返回0作为查找失败的信息。
数据结构-7顺序查找与二分查找
i=m+1=8,j=8, m=(i+j)/2=8。 r[m]>k : 在左半部分继续查找。
i=8, j=m-1=7 ,
i>j: 查找失败
存储结构
key info 0 1 k1 2 k2 3 k3
…………
n kn
typedef struct { keytype key; ………….
} elemtype;
分块有序表的结构可以分为两部分: 1、线性表本身是顺序存储结构 2、再建立一个索引表,线性表中每个子表建立一个索引节点
。索引节点包括两部分:一是数据域,一是指针域。数据域存 放对应子表中的最大元素值,指针域用于指示子表第一个元素 的在整个表中序号。
分块查找
template<class T> struct indnode {
key=32
d (1) 27
i=1
d (2) 36
i=2
d (3) 32i=3 Nhomakorabead (4) 18
此时d(i)=key,数组中的第3个位置
如果输入查找的元素值key=22
d (1) 27 i=1
d (2) 36 i=2
d (3) 32 i=3
d (4) 18
i=4 i=5 此时i等于5,超过数组中元素个数,找不到
T key; int k; };
上图查找过程:首先查找索引表,确定查找的子表,然后再相应的子表中 应顺序表查找法查找。
• int blksearch(record r[],index idx[],keytype key)
•{
• int i=0,j;
• while(i<idxN)
•{
• if(key<=idx[i].key){
各种查找算法的性能比较测试(顺序查找、二分查找)
算法设计与分析各种查找算法的性能测试目录摘要 (2)第一章:简介(Introduction) (3)1.1 算法背景 (3)第二章:算法定义(Algorithm Specification) (4)2.1 数据结构 (4)2.2顺序查找法的伪代码 (4)2.3 二分查找(递归)法的伪代码 (5)2.4 二分查找(非递归)法的伪代码 (6)第三章:测试结果(Testing Results) (8)3.1 测试案例表 (8)3.2 散点图 (9)第四章:分析和讨论 (11)4.1 顺序查找 (11)4.1.1 基本原理 (11)4.2.2 时间复杂度分析 (11)4.2.3优缺点 (11)4.2.4该进的方法 (12)4.2 二分查找(递归与非递归) (12)4.2.1 基本原理 (12)4.2.2 时间复杂度分析 (13)4.2.3优缺点 (13)4.2.4 改进的方法 (13)附录:源代码(基于C语言的) (15)摘要在计算机许多应用领域中,查找操作都是十分重要的研究技术。
查找效率的好坏直接影响应用软件的性能,而查找算法又分静态查找和动态查找。
我们设置待查找表的元素为整数,用不同的测试数据做测试比较,长度取固定的三种,对象由随机数生成,无需人工干预来选择或者输入数据。
比较的指标为关键字的查找次数。
经过比较可以看到,当规模不断增加时,各种算法之间的差别是很大的。
这三种查找方法中,顺序查找是一次从序列开始从头到尾逐个检查,是最简单的查找方法,但比较次数最多,虽说二分查找的效率比顺序查找高,但二分查找只适用于有序表,且限于顺序存储结构。
关键字:顺序查找、二分查找(递归与非递归)第一章:简介(Introduction)1.1 算法背景查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键。
对于查找问题来说,没有一种算法在任何情况下是都是最优的。
有些算法速度比其他算法快,但是需要较多的存储空间;有些算法速度非常快,但仅适用于有序数组。
计算机学科专业基础综合数据结构-7
计算机学科专业基础综合数据结构-7一、单项选择题(总题数:28,分数:74.00)1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度ASL为______。
A.(n-1)/2B.n/2C.(n+1)/2 √D..n此结论需要考生当作定理一样的牢记。
顺序查找法适用于查找顺序存储或链式存储的线性表,平均比较次数为______,二分法查找只适用于查找顺序存储的有序表,平均比较次数为______。
在此假定N为线性表中结点数,且每次查找都是成功的。
(分数:4.00)A.N+1B.2log2NC.log2ND.N/2 √E.Nlog2NF..N2A.N+1B.2log2NC.log2N √D.N/2E.Nlog2NF..N22.下面关于二分查找的叙述正确的是______。
A.表必须有序,表可以顺序方式存储,也可以链表方式存储B.表必须有序且表中数据必须是整型、实型或字符型C.表必须有序,而且只能从小到大排列D.表必须有序,且表只能以顺序方式存储√二叉查找树的查找效率与二叉树的______有天,在______时查找效率最低。
(分数:4.00)A.高度B.结点的多少C.树形√D.结点的位置A.结点太多B.完全二叉树C.呈单枝树√D.结点太复杂3.当采用分块查找时,数据的组织方式为______。
A.数据分成若干块,每块内数据有序B.数据分成若干块,每块内数据不必有序,但块间必须有序,每块内最大(或最小)的数据组成索引块√C.数据分成若干块,每块内数据有序,每块内最大(或最小)的数据组成索引块D.数据分成若干块,每块(除最后一块外)中数据个数需相同本题主要考查分块查找的相关概念。
4.如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用下列哪一种查找方法?______A.分块√B.顺序C.二分法D.哈希由于题目只说明是线性表,因此排除二分法。
哈希算法虽然有最快的查找效率,但建立哈希表无法适应动态变化的要求。
顺序表、链表题库
第三章顺序表一、填空1.若线性表最常用的操作是存取第i 个元素及其前驱元素的值,则采用()存储结构最节省运算时间。
2.顺序存储结构的线性表中所有元素的地址()连续。
3.顺序存储结构的线性表其物理结构与逻辑结构是()的。
4.在具有n个元素的顺序存储结构的线性表任意一个位置中插入一个元素,在等概率条件下,平均需要移动()个元素。
5.在具有n个元素的顺序存储结构的线性表任意一个位置中删除一个元素,在等概率条件下,平均需要移动()个元素。
6.在具有n个元素的顺序存储结构的线性表中查找某个元素,平均需要比较()次。
7.当线性表的元素基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中第i个元素时,应采用( )存储结构。
8.顺序存储结构的线性表中,插入或删除某个元素时,元素移动的次数与其位置()关。
(填有或无)。
9.顺序存储结构的线性表中,访问第i个元素与其位置()关。
(填有或无)。
10.在具有n个元素的顺序存储结构的线性表中要访问第i个元素的时间复杂度是()。
11.在顺序表L中的i个位置插入某个元素x,正常插入时,i位置以及i位置以后的元素需要后移,首先后移的是()个元素。
12.要删除顺序表L中的i位置的元素x,正常删除时,i位置以后的元素需要前移,首先前移的是()元素。
13.若顺序表中的元素是从1位置开始存放的,要在具有n个元素的顺序表中插入一个元素,合法的插入位置是()。
14.若顺序表中的元素是从1位置开始存放的,要删除具有n个元素的顺序表中某个元素,合法的删除位置是()。
15.在具有n个元素的顺序存储结构的线性表中删除某个元素的时间复杂度是()。
16.在具有n个元素的顺序存储结构的线性表中插入某个元素的时间复杂度是()。
17.在具有n个元素的顺序存储结构的线性表中要访问第i个元素的后继结点的时间复杂度是()。
18.在具有n个元素的顺序存储结构的线性表中,若给定的是某个元素的关键字值,要访问该元素的其它信息的时间复杂度是()。
《数据结构》实验报告三:几种查找算法的实现和比较
第三次实验报告:几种查找算法的实现和比较//2019-12-4//1.随机生成5万个整数,存入一个文件;//2.算法实现:(1)顺序查找:读入文件中的数据,查找一个key,统计时间;// (2)二分查找:读入文件,排序,二分查找key,统计时间;// (3)分块查找:读入文件,分100块,每块300+数字,查找key,统计时间// (4)二分查找树:读入文件,形成BST,查找key,统计时间//二叉排序树:建立,查找#include "stdio.h"#include "time.h"#include "stdlib.h"struct JD{//定义分块查找的链表结点结构int data;JD *next;};struct INDEX_T{//定义分块查找中,索引表结构int max;//这一块中最大的数字,<maxJD *block;//每一块都是一个单向链表,这是指向块的头指针};INDEX_T myBlock[100];//这是索引表的100项struct NODE{//定义的二分查找树结点结构int data;NODE *left;NODE *right;};const int COUNT=50000;//结点个数int key=666;//待查找的关键字int m=1;//int *array2;void createData(char strFileName[]){//产生随机整数,存入文件srand((unsigned int)time(0));FILE *fp=fopen(strFileName,"w");for(int i=1;i<=COUNT;i++)fprintf(fp,"%d,",rand());fclose(fp);}void createBST(NODE* &bst){//产生5万个随机整数,创建二叉排序树FILE *fp=fopen("data.txt","r");for(int i=1;i<=COUNT;i++){int num;fscanf(fp,"%d,",&num);//从文件中读取一个随机整数//若bst是空子树,第一个结点就是根结点//若bst不是空子树,从根结点开始左小右大,查找这个数字,找到了直接返回,//找不到,就插入到正确位置//创建一个结点NODE* p=new NODE;p->data=num;p->left=0;p->right=0;if(0==bst)//空子树{bst=p;continue;}//非空子树,//在bst中,查找给结点,NODE *q=bst;//总是从根结点开始查找while(1){if(p->data == q->data)//找到了,直接退出break;if(p->data < q->data && q->left==0){//小,往左找,且左边为空,直接挂在q之左q->left=p;break;}if(p->data < q->data && q->left!=0){//小,往左找,且左边非空,继续往左边找q=q->left;continue;}if(p->data > q->data && q->right==0){//大,往右找,且右边为空,直接挂在q之右q->right=p;break;}if(p->data > q->data && q->right!=0){//大,往右找,且右边非空,继续往右边找q=q->right;continue;}}}}int BST_Search(NODE *bst,int key){//在bst中找key,if(0==bst)return -1;//非空子树,//在bst中,查找给结点,NODE *q=bst;//总是从根结点开始查找while(1){if(key == q->data)//找到了,直接退出return 1;if(key < q->data && q->left==0)//小,往左找,且左边为空,找不到return -1;if(key < q->data && q->left!=0)//小,往左找,且左边非空,继续往左边找{q=q->left;continue;}if(key > q->data && q->right==0)//大,往右找,且右边为空,找不到return -1;if(key > q->data && q->right!=0){//大,往右找,且右边非空,继续往右边找q=q->right;continue;}}}void inOrder(NODE *bst){if(bst!=0){inOrder(bst->left);array2[m]=bst->data;//反写回array数组,使数组有序// printf("%7d",array2[m]);m++;inOrder(bst->right);}}int getBSTHeight(NODE *bst){if(bst==0)return 0;else{int hl=getBSTHeight(bst->left);int hr=getBSTHeight(bst->right);int h=hl>hr?hl:hr;return h+1;}}void makeArray(int array[],char strFileName[]) {//生成5万个随机整数FILE *fp=fopen(strFileName,"r");int i=1;while(!feof(fp)){fscanf(fp,"%d,",&array[i]);// printf("%6d",array[i]);i++;}}int Seq_Search(int array[],int key){//在无序顺序数组中,找data是否存在,-1=不存在,存在返回位置下标//监视哨:把要找的那个数放到首部array[0]=key;//for(int i=COUNT;array[i]!=key;i--);if(i>0)//找到了,返回下标return i;return -1;//查找不成功,返回-1}int Bin_Search(int array[],int key){//在有序存储的数组中查找key,找到返回位置,找不到返回-1 int low=1,high=COUNT,mid;while(1){if(low>high)//找不到return -1;mid=(low+high)/2;if(key == array[mid])return mid;else if(key<array[mid])high=mid-1;elselow=mid+1;}}void makeBlock(INDEX_T myBlock[],char strFileName[]) {//从文件中读取整数,分配到块中去//1.初始化块索引表,分100块,400,800,1200,for(int i=0;i<=99;i++){myBlock[i].max=400+400*i;//400,800,1200, (40000)myBlock[i].block=0;}//2.打开文件,读取整数,把每一个整数分配到相应的块中去FILE *fp=fopen(strFileName,"r");while(!feof(fp)){int num=0;fscanf(fp,"%d,",&num);//把num分配到num/400块中,挂到该块链表第一个int blockID=num/400;//求出应该挂在的块号//生成一个新节点,把num放进去,挂上JD *p=new JD;p->data=num;p->next=myBlock[blockID].block;myBlock[blockID].block=p;}fclose(fp);}int Block_Search(INDEX_T myBlock[],int key){int blockID=key/400;//找到块号JD* p=myBlock[blockID].block;while(p!=0){if(p->data==key)return blockID;//能找到p=p->next;}return -1;//找不到}void main(){clock_t begin,end;int pos=-1;//1.生成文件,存入5万个随机整数createData("data.txt");//2.顺序查找int *array=new int[COUNT+1];makeArray(array,"data.txt");//从文件中读取数据begin=clock();for(int k=1;k<=10000;k++)pos=Seq_Search(array,key);end=clock();printf("顺序查找:%d所在的位置=%d.时间=%d毫秒\n",key,pos,end-begin);//3.二分查找树NODE *bst=0;createBST(bst);//产生5万个随机数字,建立一个二叉排序树begin=clock();for(k=1;k<=10000;k++)pos=BST_Search(bst,key);//在bst中找key,找到返回1,找不到返回-1end=clock();printf("二叉排序树查找:%d所在的位置=%d.时间=%d毫秒\n",key,pos,end-begin);array2=new int[COUNT+1];inOrder(bst);//中序输出bst// int height=getBSTHeight(bst);//求出bst的高度// printf("BST高度=%d.\n\n",height);//4.二分查找,利用前面二叉排序树产生的array2,查找key begin=clock();for(k=1;k<=10000;k++)pos=Bin_Search(array2,key);end=clock();printf("二分查找:%d所在的位置=%d.时间=%d毫秒\n",key,pos,end-begin);//5.分块查找,关键字范围[0,32767],分配到100块中去,每一块中存400个数字makeBlock(myBlock,"data.txt");//从文件中读取数据,产生块begin=clock();for(k=1;k<=10000;k++)pos=Block_Search(myBlock,key);//在block中查找key,找到返回块号,找不到返回-1end=clock();printf("分块查找:%d所在的块=%d.时间=%d毫秒\n",key,pos,end-begin);/*for(k=0;k<=99;k++){printf("\n\n\n第%d块<%d:\n",k,myBlock[k].max);JD *q=myBlock[k].block;//让q指向第k块的第一个结点while(q!=0){//输出第k块中所有数字printf("%7d ",q->data);q=q->next;}}*/}。
数据结构期末考试试题和标准答案及评分标准
数据结构期末考试试题和标准答案及评分标准《数据结构》试题(A卷)(考试时间: 90分钟)一、单项选择题(本大题共15小题,每小题2分,共30分)(每题只有一个选项是正确的,将答案填写在括号内,错选、多选不得分)1.()是组成数据的基本单位,是一个数据整体中相对独立的单元。
A.数据 B.数据元素 C.数据对象 D.数据结构2.算法计算量的大小称为算法的()。
A.效率B.复杂度C.数据元素之间的关系??? ?D.数据的存储方法3.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入或删除运算,则采用以下()方式最节省时间。
A.链式存储B. 索引存储C.顺序存储D.散列存储4.下述哪一条是顺序存储结构的优点?()A.存储密度大?B.插入运算方便?C.删除运算方便?D.可方便地用于各种逻辑结构的存储表示5.在一个单链表中,若删除p所指结点的后续结点,则执行()。
>next=p->next->next >next=p->next=p->next;p->next=p->next->next =p->next->next6.带头结点的单链表head为空的判定条件是()。
==NULL >next==NULL >next==head !==NULL7.非空的循环单链表head的尾结点(由p所指向)满足()。
>head==NULL ==NULL >next==head ==head8.下面关于线性表的叙述中,错误的是哪一个?()A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链式存储,不必占用一片连续的存储单元。
D.线性表采用链式存储,便于插入和删除操作。
9.队列操作的原则是()。
A.后进先出B.先进先出C.只能进行插入D.只能进行删除10.栈中允许进行插入和删除的一端称为()。
第七章复习题
第二十三讲
8.下列哪一种图的邻接矩阵一定是对称矩阵?( B ) A.有向图 B.无向图 C.AOV网 D.AOE网 9. 下列说法不正确的是( C )。 A.图的遍历是从给定的源点出发每一个顶点仅被访问 一次 B.遍历的基本算法有两种:深度遍历和广度遍历 C.图的深度遍历不适用于有向图 D.图的深度遍历是一个递归过程
第二十三讲
3.一个n个顶点的连通无向图,其边的个数至 少为( A )。 A.n-1 B.n C.n+1 D.nlogn
4.要连通具有n个顶点的有向图,至少需要 ( B )条边。 A.n-l B.n C.n+l D.2n
第二十三讲
5.n个结点的完全有向图含有边的数目( D )。 A.n*n B.n(n+1) C.n/2 D.n*(n-l) 6.一个有n个结点的图,最少有( B )个连通分量,最 多有( D )个连通分量。 A.0 B.1 C.n-1 D.N 7.在一个无向图中,所有顶点的度数之和等于所有边数 (B )倍,在一个有向图中,所有顶点的入度之和等 于所有顶点出度之和的( C )倍。 A.1/2 B.2 C.1 D.4
2
3
4
5
6
7
8
9
10 11
12 15 18 22 25 28 35 46 58 60
12 15 18 22 25 28 35 46 58 60 low=1 0 h ig h=1 1 mid =1 0
low=1 h ig h=2 mid =1 1 6 2 3 4 5 6 7 8 9 10 11 1 6 2 3 4 5 6 7 8
第二十三讲
12. 在有向图G的拓扑序列中,若顶点Vi在顶点Vj之前, 则下列情形不可能出现的是( D )。 A.G中有弧<Vi,Vj> B.G中有一条从Vi到Vj的路径 C.G中没有弧<Vi,Vj> D.G中有一条从Vj到Vi的路径
数据结构 第九章 查找
S P Q
PL
S Q
PL 中序遍历:PL P S Q
(1)
6
中序遍历:PL S Q
3 2 4 15
18
S Q P
S Q PL
PL 中序遍历:Q S PL P
1)分块有序(升序或降序) ——第I块中的最大(小)值小(大)于第i+1块中的最(大)小值
2)查找 (1)先查索引表——折半查找 (2)再查顺序表——顺序查找 块间有序,块内无序
typedef struct { int key;} Eletype; typedef struct { Elemtype *elem; int length; } SSTable; # define BLOCK_NUM 3
DeleteDSTable(&DT,key);
TraverseDSTable(DT,visit()); //遍历查找表
9.2.1二叉排序树 ( Binary Sort Tree )
定义 二叉排序树(二叉查找树) 或者是一棵空树, 或者是具有下列性质的二叉树: 每个结点都有一个作为查找依据的关键字 (key),所有结点的关键字互不相同。 左子树(若非空)上所有结点的关键字都小于 根结点的关键字。 右子树(若非空)上所有结点的关键字都大于 根结点的关键字。 左子树和右子树也是二叉排序树。
关键字:数据元素中某个数据项的值,用以 标识一个数据元素。 主关键字:可唯一地标识一个数据元素的关 键字。 次关键字:用以识别若干记录的关键字。 使用基于主关键字的查找,查找结果应是 唯一的。
静态查找表(p214) 动态查找表
关键字惟一确定一条记录
属性名 (字段名)
查找实验报告
查找实验报告第一篇:查找实验报告实验六查找实验目的:掌握几种查找的思想及算法问题分析:(一)顺序查找 1.查找思想从表的一端开始逐个将记录的关键字和给定K值进行比较,若某个记录的关键字和给定K值相等,查找成功;否则,若扫描完整个表,仍然没有找到相应的记录,则查找失败。
2.算法实现int Seq_Search(SST able ST,int key){int p;} ST.data[0].key=key;/* 设置监视哨兵,失败返回0 */ for(p=ST.length;ST.data[p].key!=key;p--);return(p);3.算法分析设查找每个记录成功的概率相等,即Pi=1/n;查找第i个元素成功的比较次数Ci=n-i+1 ;◆ 查找成功时的平均查找长度ASL:◆包含查找不成功时:查找失败的比较次数为n+1,若成功与不成功的概率相等,对每个记录的查找概率为Pi=1/(2n),则平均查找长度ASL:(二)折半查找前提条件:查找表中的所有记录是按关键字有序(升序或降序)。
查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围(每次将待查记录所在区间缩小一半),直到找到或找不到记录为止。
1.查找思想用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。
⑴取中间位置Mid:Mid=⎣(Low+High)/2⎦;⑵比较中间位置记录的关键字与给定的K值:①相等:查找成功;②大于:待查记录在区间的前半段,修改上界指针:High=Mid-1,转⑴ ;③小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1,转⑴ ;直到越界(Low>High),查找失败。
2.算法实现int Bin_Search(SST able ST , KeyType k){int low=1,high=ST.length, mid;while(low<=high){mid=(low+high)/2;if(EQ(ST.data[mid].key, k))return(mid);else if(LT(ST.dat[mid].key, k))low=mid+1;else high=mid-1;}return(0);/*查找失败*/ } 3.算法分析①查找时每经过一次比较,查找范围就缩小一半,该过程可用一棵二叉树表示:◆根结点就是第一次进行比较的中间位置的记录;◆ 排在中间位置前面的作为左子树的结点;◆ 排在中间位置后面的作为右子树的结点;对各子树来说都是相同的。
《数据结构_课程设计》航班查询系统实验报告
目录一、概述 (1)二、系统分析 (1)1.航班信息的查询与检索 (1)2.航班信息查询与检索数据结构理论 (1)三、概要设计 (2)1.系统的功能 (2)2.系统模块分析及其流程图 (3)四、详细设计 (6)1.各函数说明 (6)2.定义相关数据类型 (8)3.航班信息的查询 (9)五、运行由于测试 (11)六、总结与心得 (16)参考文献 (16)附录 (16)一、概述随着信息产业的飞速发展, 信息化管理及查询已经进入并应用到各行各业, 影响着人们的价值观念和生活方式。
因此, 要提高企业信息化建设, 利用先进的办公自动化系统来实现企业内部信息管理、共享及交流, 从而提高企业综合实力。
本次设计是针对航班的查询系统, 该设计要求对飞机航班信息进行排序和查询。
可按航班的航班号、起点站、终点站等信息进行航班信息的查询。
二、系统分析1.航班信息的查询与检索进入系统后, 首先提示输入航班的信息, 包括: 航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号及票价等, 票价为整型, 其他为字符型。
当输入完一个信息后会提示是否继续输入, 重复以上步骤输入全部的信息。
进入主菜单后会给出用户操作的界面, 根据提示进行航班信息的查询。
2.航班信息查询与检索数据结构理论针对在本该类系统中的数据的处理情况, 本系统采用二分查找法、基数排序法、最高位优先法。
二分查找法也称为折半查找法, 它充分利用了元素间的次序关系, 采用分治策略, 可在最坏的情况下用O(log n)完成搜索任务。
它的基本思想是, 将n 个元素分成个数大致相同的两半, 取a[n/2]与欲查找的x作比较, 如果x=a[n/2]则找到x, 算法终止。
如果x<a[n/2], 则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。
如果x>a[n/2], 则我们只要在数组a的右半部继续搜索x。
对航班号的排序是采用的基数排序法。
基数排序法又称“桶子法”(bucket sort)或bin sort, 顾名思义, 它是透过键值的部份资讯, 将要排序的元素分配至某些“桶”中, 藉以达到排序的作用, 基数排序法是属于稳定性的排序, 其时间复杂度为O (nlog(r)m), 其中r为所采取的基数, 而m为堆数, 在某些时候, 基数排序法的效率高于其它的比较性排序法。