数据结构查找算法课程设计

合集下载

算法与数据结构课程设计

算法与数据结构课程设计

算法与数据结构课程设计一、课程目标知识目标:1. 让学生掌握基本的数据结构(线性表、树、图等)及其在实际问题中的应用。

2. 使学生了解并掌握常用的算法(排序、查找、递归等),并能够分析算法的效率。

3. 引导学生理解算法与数据结构之间的关系,以及它们在软件开发中的重要性。

技能目标:1. 培养学生能够运用所学数据结构和算法解决实际问题的能力。

2. 提高学生运用编程语言(如C++、Java等)实现算法和数据结构的能力。

3. 培养学生分析、设计、优化算法的能力,以及编写规范、高效的程序代码。

情感态度价值观目标:1. 培养学生积极主动地探索和解决问题,形成良好的学习习惯和团队合作精神。

2. 激发学生对计算机科学的兴趣,使其认识到算法与数据结构在实际应用中的价值。

3. 培养学生具备一定的抽象思维能力,敢于面对复杂问题,勇于克服困难。

课程性质:本课程为高中信息技术课程,旨在让学生掌握计算机科学的基本概念和方法,培养其逻辑思维能力和实际操作能力。

学生特点:高中学生具备一定的数学基础和逻辑思维能力,对新鲜事物充满好奇,但可能对复杂概念和抽象知识接受程度有限。

教学要求:结合学生特点,采用案例教学、任务驱动等教学方法,注重理论与实践相结合,让学生在动手实践中掌握知识,提高能力。

在教学过程中,关注学生的个体差异,给予个性化指导,确保课程目标的实现。

通过课程学习,使学生能够达到以上所述的具体学习成果,为后续学习和工作打下坚实基础。

二、教学内容1. 数据结构:- 线性表:数组、链表- 栈与队列- 树:二叉树、线索二叉树、树的应用- 图:图的表示、图的遍历、最短路径2. 算法:- 排序:冒泡排序、选择排序、插入排序、快速排序、归并排序- 查找:顺序查找、二分查找、哈希查找- 递归:递归算法的设计与实现- 算法效率分析:时间复杂度、空间复杂度3. 教学内容的安排与进度:- 数据结构(第一、二周):线性表、栈与队列、树- 算法(第三、四周):排序、查找、递归- 算法效率分析(第五周):时间复杂度、空间复杂度4. 教材章节:- 《算法与数据结构》第一章:数据结构基础- 《算法与数据结构》第二章:线性表- 《算法与数据结构》第三章:栈与队列- 《算法与数据结构》第四章:树和二叉树- 《算法与数据结构》第五章:图- 《算法与数据结构》第六章:排序- 《算法与数据结构》第七章:查找- 《算法与数据结构》第八章:算法效率分析教学内容注重科学性和系统性,按照由浅入深的顺序组织,确保学生在掌握基本概念和方法的基础上,逐步提高解决问题的能力。

数据结构 查找 课程设计最新

数据结构 查找 课程设计最新

数据结构课程设计课程名称:查找院系:信息工程学院年级专业:学号:学生姓名:指导教师:开题时间: 2010 年 12 月 11 日完成时间: 2010 年 12 月 19 日信息工程学院安徽新华学院课程设计成绩评定表数据结构课程设计查找第- 1 - 页共20 页【摘要】在日常生活中,人们几乎每天都要进行查找工作,例如,在通讯簿中查阅某人的通信地址;或在字典中查阅某字的读音等。

查找是一种在生活中大量使用的数据结构。

查找表是由同一类型的数据元素构成的集合。

在各种系统软件和应用软件中,查找表也是一种最常见的结构之一。

如编译程序中的符号表,信息处理系统中的信息表均是查找表。

查找表是一种非常灵便的数据结构。

采用何种查找方法,首先取决于使用那种数据结构来表示“表”,为了提高查找速度,我们常常用某些特殊的数据结构来组织表。

因此,在研究各种查找方法时,首先必须弄清楚这些方法所需的数据结构,特别是存储结构。

下面分别就线性表、树表和哈希表三种数据结构的查找来讨论查找表的表示和操作实现的方法。

- 2 -数据结构课程设计查找目录一实践目的与要求 ................................................................... 错误!未定义书签。

1.1实践目的........................................................................... 错误!未定义书签。

1.2实践要求........................................................................... 错误!未定义书签。

二顺序查找的分析、程序、及运行结果 ............................. 错误!未定义书签。

2.1系统简介........................................................................... 错误!未定义书签。

数据结构教案第9章 查找

数据结构教案第9章 查找

●性能分析 定义:为了确定记录在查找表中的位置,需和给定值进行比 较的关键字个数的期望值称为查找算法在查找成功时的平均查找 长度。
ASL = ∑ Pi C i
i =1
n
其中:Pi为查找表中第i个记录的概率;Ci为找到第i个记 录的比较次数; 查找成功的平均查找长度:
1 n n +1 ASL = ∑ (n − i + 1) = 2 n i =1
索引表 最大关键字 起始地址
22 48 86 1 7 13
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53
9.2动态查找表 特点:表结构本身是在查找过程中动态生 成的,即对于给定值key,若表中存在其关键 字等于key的记录,则查找成功返回;否则插 入关键字等于key的记录。
10 10 9 15 9 17 17 15
a
16
作业:(P55)9.9, 9. 33
9.3哈希表 9.3.1什么是哈希表 哈希函数:在记录的关键字和它的存储位置之间建立 一个确定的对应关系f,使每个关键字和结构中一个 唯一的存储位置相对应,称对应关系f为哈希(Hash) 函数。 哈希表:按哈希函数建立的表称为哈希表。
void Delete(BiTree &p){ if(!p->rchild) { q=p; p=p->lchild; free(q); } else if(!p->lchild) { q=p; p=p->rchild; free(q); } else{ q=p; s=p->lchild; while(s->rchild) {q=s; s=s->rchild;} p->data=s->data; if(q!=p) q->rchild=s->lchild; \*q!=p正常情况 else q->lchile= s->lchild; \* q=p意外者,p的左子树的根没有右子树 free(s); }\\else }

数据结构与算法分析课程设计2024

数据结构与算法分析课程设计2024

引言概述:数据结构与算法分析是计算机科学中非常重要的一门课程,它涵盖了计算机程序的核心知识。

本文将介绍数据结构与算法分析课程设计的相关内容。

该课程设计以实践为主,旨在帮助学生巩固并应用所学的数据结构与算法知识,提升其解决实际问题的能力。

正文内容:一、设计项目的选题与要求1. 确定选题:在选题时,可以考虑实际生活中的问题,如根据用户的输入创建一个自动完成的搜索系统。

2. 确定需求:需要明确设计项目所需的功能和性能要求,如搜索系统需要支持快速的搜索和自动完成功能。

二、设计项目的整体架构1. 确定数据结构:根据项目需求,选择合适的数据结构来存储和处理数据,如哈希表、二叉树等。

2. 设计算法:根据数据结构的选择,设计相应的算法来实现项目功能,如搜索算法、排序算法等。

3. 确定模块划分:将项目整体划分为不同的模块,每个模块负责完成特定的功能,如输入模块、搜索模块等。

4. 设计接口:确定各个模块之间的接口,保证模块之间的数据传递和功能调用的顺利进行。

5. 进行测试:设计项目的测试用例,并对每个模块进行测试,确保项目的功能和性能满足需求。

三、具体设计与实现1. 数据结构的选择与实现:根据项目需求选择合适的数据结构,并实现相应的数据结构操作。

2. 算法的设计与实现:根据项目需求设计算法,并编写相应的代码实现。

3. 模块的实现与集成:按照设计的模块划分,分别实现每个模块,并进行模块的集成测试。

4. 优化与性能提升:对代码进行优化,提高项目的性能和效率。

5. 异常处理与容错机制:在项目实现过程中,考虑可能出现的异常情况,并设计相应的容错机制。

四、项目实践中的问题与解决方案1. 数据结构选择问题:根据项目需求选择合适的数据结构时可能遇到困难,可以参考相关文献和资料,咨询老师或同学的意见。

2. 算法设计问题:针对具体的功能需求,可能需要设计复杂的算法,可以通过分析问题特性和借鉴经典算法来解决。

3. 模块集成问题:在不同的模块之间进行数据传递和功能调用时可能遇到困难,可以采用合适的设计模式和接口设计方法来解决。

数据结构课程设计——排序与查找

数据结构课程设计——排序与查找

北京信息科技大学课程设计报告课程名称数据结构课程设计题目排序与查找指导教师赵庆聪设计起止日期设计地点系别信息管理学院专业__信息管理与信息系统_姓名/学号______鲁丹2012012108__b=SelectSort(L);display(L);printf("此排序法关键字比较的次数为:%d\n",b);printf("\n快速排序输出的顺序表为:\n");c=QuickSort(L,1,20);display(L);printf("此排序法关键字比较的次数为:%d\n",c); printf("\n双向起泡法排序输出的顺序表为:\n");d=BubbleSort(L);display(L);printf("此排序法关键字比较的次数为:%d\n",d);}1.#include "stdio.h"2.#include "stdlib.h"3.#include "string.h"4.#include "time.h"5.#include "limits.h"6.#define MAXITEM 10007.typedef int KeyType,ElemType;8.int count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;9.int swap1=0,swap2=0,swap3=0,swap4=0,swap5=0,swap6=0;10.typedef struct rec11.{12. KeyType key;13. ElemType data;14.}sqlist[MAXITEM];15.16.void gennum(sqlist r,sqlist t,int n)17.{18.int i;19. srand((unsigned)time(NULL));20.for(i=1;i<=n;i++)21. { t[i].key=rand()%100;22. r[i].key=t[i].key;23. }24.}25.26.void ini(sqlist r,sqlist t,int n)27.{28.int i;29.for(i=1;i<=n;i++)30. r[i].key=t[i].key;31.}32.33.void BubbleSort(sqlist r,int n)//起泡法r[1]~r[n]34.{35.int i,j;36.struct rec w;37.for(i=1;i<=n-1;i++)38.for(j=n;j>=i+1;j--)39. {40.if(r[j].key<r[j-1].key)41. {42. w=r[j];43. r[j]=r[j-1];44. r[j-1]=w;45. swap1++;46. }47. count1++;48. }49.50.}51.52.53.void InsertSort(sqlist r,int n)//直接插入排序r[1]~r[n]54.{55.int i,j;56.for(i=2;i<=n;i++)57. {58. count2++;59. r[0]=r[i];60. j=i-1;61.while(r[0].key<r[j].key)62. {63. r[j+1]=r[j];64. j--;65. count2++;66. swap2++;67. }68. r[j+1]=r[0];69. swap2++;70. }71.}72.73.void SelectSort(sqlist r,int n)//简单选择排序r[1]~r[n]74.{75.int i,j,k;76.struct rec temp;77.for(i=1;i<=n-1;i++)78. {79. k=i;80.for(j=i+1;j<=n;j++)81.if(r[j].key<r[k].key){k=j;count3++;}82.if(i!=k)83. {84. temp=r[i];85. r[i]=r[k];86. r[k]=temp;87. swap3++;88. }89. }90.}91.92.void QuickSort(sqlist r,int s,int t)//快速排序r[s]~r[t],r[0]空出93.{94.int i=s,j=t;95.if(s<t)96. {97. r[0]=r[s];swap4++;98.do99. {100.while(j>i&&r[j].key>=r[0].key){j--;count4++;} 101.if(i<j)102. {103. r[i]=r[j];104. i++;105. swap4++;106. }107.while(i<j&&r[i].key<=r[0].key){i++;count4++;} 108.if(i<j)109. {110. r[j]=r[i];111. j--;112. swap4++;113. }114. }while(i<j);115. r[i]=r[0];116. swap4++;117. QuickSort(r,s,j-1);118. QuickSort(r,j+1,t);119. }120.}121.122.void ShellSort(sqlist r,int n)//希尔排序r[1]~r[n]123.{124.int i,j,gap;125.struct rec x;126. gap=n/2;127.while(gap>0)128. {129.for(i=gap+1;i<=n;i++)130. {131.132. j=i-gap;133.while(j>0)134.if(r[j].key>r[j+gap].key)135. {136. x=r[j];137. r[j]=r[j+gap];138. r[j+gap]=x;139. j=j-gap;140. count5++;141. swap5++;142. }143.else144. {145. j=0;count5++;146. }147. }148. gap=gap/2;149. }150.}151.152.void sift(sqlist r,int l,int m)153.{154.int i,j;155.struct rec x;156. i=l;157. j=2*i;158. x=r[i];159.while(j<=m)160. {161.if(j<m&&r[j].key<r[j+1].key){j++;count6++;} 162.if(x.key<r[j].key)163. {164. r[i]=r[j];165. i=j;166. j=2*i;167. count6++;168. swap6++;169. }170.else {j=m+1;count6++;}171. }172. r[i]=x;173.}174.void HeapSort(sqlist r,int n)//堆排序r[1]~r[n]175.{176.int i;177.struct rec m;178.for(i=n/2;i>=1;i--)sift(r,i,n);179.for(i=n;i>=2;i--)180. {181. m=r[i];182. r[i]=r[1];183. r[1]=m;184. swap6++;185. sift(r,1,i-1);186. }187.}188.189.void main()190.{191.192.int k,n,a;193. sqlist r,t;194. printf(" ***************************************\n");195. printf(" * *\n");196. printf(" * * 内部排序算法的性能分析 * *\n");197. printf(" * *\n");198. printf(" ***************************************\n\n");199.200. printf("-----------------*-------------------------------------*----------------\n"); 201. printf("**是否执行程序**\n");202. printf("(是) 按 1 键, (否) 按 0 键\n");203. printf(" 按键为:");204. scanf("%d",&a);205. printf("-----------------*-------------------------------------*----------------\n"); 206.207.while(a==1)208. {printf("**请输入要排序的数据的个数:");209. scanf("%d",&n);210.211. gennum(r,t,n);212. printf("\n");213.214. printf("**随机产生的最初顺序是:\n");215.for(k=1;k<=n;k++)216. { printf("%3d",t[k].key);217.if(k%20==0)218. printf("\n");219. }220. printf("\n");221. BubbleSort(r,n);222. printf("\n**排序之后的顺序是:\n");223.for(k=1;k<=n;k++)224. { printf("%3d",r[k].key);225.if(k%20==0)226. printf("\n");227. }228. printf("\n\n");229. printf("-------------------------------*分析结果*-------------------------------\n\n"); 230. printf(" **起泡排序**\n");231. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count1,swap1);232.233. ini(r,t,n);234. InsertSort(r,n);235. printf(" **直接插入**\n");236. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count2,swap2);237.238. ini(r,t,n);239. SelectSort(r, n);240. printf(" **简单选择排序**\n");241. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count3,swap3);242.243. ini(r,t,n);244. QuickSort(r,1,n);245. printf(" **快速排序**\n");246. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count4,swap4);247.248. ini(r,t,n);249. ShellSort(r,n);250. printf(" **希尔排序**\n");251. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count5,swap5);252.253. ini(r,t,n);254. HeapSort(r,n);255. printf(" **堆排序**\n");256. printf(" 比较的次数是: %d,移动的次数是: %d\n\n",count6,swap6);257.258. printf("-----------------*-------------------------------------*----------------\n"); 259. printf("**是否继续执行程序**\n");260. printf(" (是) 按 1 键, (否) 按 0 键\n");。

数据结构与算法课程设计

数据结构与算法课程设计

数据结构与算法课程设计一、课程目标知识目标:1. 理解并掌握常见的数据结构(如线性表、树、图等)的基本概念和应用场景;2. 学习并掌握基本算法设计与分析技巧,包括排序、查找、递归等;3. 了解不同数据结构和算法在实际问题中的应用和性能分析。

技能目标:1. 能够运用所学数据结构设计简单的程序,解决实际问题;2. 能够运用算法分析技巧,评价算法的性能,并进行优化;3. 培养学生的编程能力、逻辑思维能力和问题解决能力。

情感态度价值观目标:1. 激发学生对数据结构与算法的兴趣,培养其主动探究和钻研的精神;2. 培养学生的团队合作意识,使其学会在团队中协作解决问题;3. 培养学生严谨、踏实的学术态度,认识到数据结构与算法在计算机科学中的重要性。

课程性质:本课程为高中信息技术课程,旨在帮助学生掌握数据结构与算法的基本知识,提高编程能力和问题解决能力。

学生特点:高中学生已具备一定的编程基础和逻辑思维能力,对新鲜事物充满好奇心,但需加强对数据结构与算法的实践操作和深入理解。

教学要求:结合学生特点,注重理论与实践相结合,通过案例教学和任务驱动,让学生在实际操作中掌握数据结构与算法的知识,提高其编程能力和问题解决能力。

同时,关注学生的情感态度价值观培养,使其形成良好的学习习惯和团队合作意识。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 数据结构部分:- 线性表:定义、顺序存储、链式存储;- 栈和队列:基本概念、应用场景、实现方法;- 树:二叉树、遍历方法、线索二叉树;- 图:图的表示方法、遍历算法、最小生成树、最短路径。

2. 算法部分:- 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序;- 查找算法:顺序查找、二分查找、哈希查找;- 递归算法:递归概念、应用实例、递归与栈的关系;- 算法分析:时间复杂度、空间复杂度、算法优化。

3. 教学大纲:- 第一周:数据结构概述,线性表的概念及存储;- 第二周:栈和队列,树的基本概念;- 第三周:二叉树及遍历方法,线索二叉树;- 第四周:图的表示和遍历,最小生成树和最短路径;- 第五周:排序算法,查找算法;- 第六周:递归算法,算法分析。

数据结构与算法课程设计(方案)

数据结构与算法课程设计(方案)

数据结构与算法课程设计方案书软件工程系2016年6月20日1、课程名称:数据结构与算法课程设计2、授课时间:2015-2016学年第二学期,教学周17、18周3、授课班级:2015级软件工程专业(移动方向)1班,春1、2班4、课程意义:数据结构与算法课程设计既是一门基础课程,又是一门实践性课程。

通过本实训课程的学习和训练,使同学学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算(操作),把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。

在整个教学或学习过程中,解题能力和技巧的训练是一个重要的环节。

旨在弥补课堂教学和实验中的不足,帮助学生充分理解和巩固所学的基本概念、原理和方法,达到融会贯通、举一反三的目的。

5、授课内容:1 学生成绩管理项目简介学生成绩管理是学校教务部门日常工作的重要组成部分,其处理信息量很大。

本项目是对学生成绩管理的简单模拟,用菜单选择方式完成下列功能:输入学生数据;输出学生数据;学生数据查询;添加学生数据;修改学生数据;删除学生数据。

设计思路本项目的实质是完成对学生成绩信息的建立、查找、插入、修改、删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结果。

数据结构本项目的数据是一组学生的成绩信息,每条学生的成绩信息由学号、姓名和成绩组成,这组学生的成绩信息具有相同特性,属于同一数据对象,相邻数据元素之间存在序偶关系。

由此可以看出,这些数据具有线性表中数据元素的性质,所以该系统的数据采用线性表来存储。

顺序表是线性表的顺序存储结构,是指用一组连续的内存单元依次存放线性表的数据元素。

在顺序存储结构下,逻辑关系相邻的两个元素在物理位置上也相邻,这是顺序表的特点。

本项目可以采用顺序表的线性表顺序存储结构。

用结构体类型定义每个学生数据,故该数组中的每个数据的结构可描述为:typedef struct STU{ char stuno[10]; //学号char name[10]; //姓名float score; //成绩} ElemType;2 停车场管理项目简介设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出。

数据结构检索课程设计

数据结构检索课程设计

数据结构检索课程设计一、课程目标知识目标:1. 让学生掌握数据结构中常见检索算法的基本原理和实现方法,如顺序检索、二分检索等。

2. 使学生了解不同检索算法的优缺点及适用场景,能够根据实际问题选择合适的检索方法。

3. 帮助学生理解检索算法在解决实际问题时的重要性,培养他们在编程实践中运用数据结构进行问题求解的能力。

技能目标:1. 培养学生运用所学检索算法编写程序解决问题的能力,能够针对实际问题设计合适的检索方法并进行代码实现。

2. 提高学生在编程过程中对算法复杂度的分析能力,使其能够评估检索算法的效率并进行优化。

3. 培养学生通过团队协作和沟通交流,共同解决问题,提高团队协作能力。

情感态度价值观目标:1. 培养学生对数据结构检索算法的兴趣,激发他们主动探索和学习相关知识的热情。

2. 培养学生在面对问题时具备积极思考、勇于尝试的精神,使其在解决复杂问题时保持耐心和毅力。

3. 培养学生具备良好的编程习惯和诚信意识,在编程实践中遵循学术道德,尊重他人成果。

本课程针对高年级学生,课程性质为理论与实践相结合。

在教学过程中,注重培养学生的实际操作能力和团队协作精神,使他们在掌握检索算法知识的同时,能够将其应用于实际问题解决。

课程目标明确、具体,可衡量,便于教学设计和评估。

二、教学内容1. 数据结构基础回顾:简要介绍线性表、树等基本数据结构,为学生学习检索算法打下基础。

2. 顺序检索法:讲解顺序检索法的原理、实现方法及应用场景,结合实例进行分析。

3. 二分检索法:介绍二分检索法的原理、实现方法以及适用条件,通过实例演示提高学生理解。

4. 效率分析:分析比较顺序检索和二分检索的算法复杂度,讨论如何优化检索算法。

5. 应用案例:结合实际问题,设计检索算法的应用案例,指导学生进行编程实践。

6. 检索算法拓展:介绍其他检索算法,如哈希检索、索引检索等,拓展学生知识面。

教学内容参考教材以下章节:1. 第三章 数据结构基础2. 第四章 线性表3. 第五章 树4. 第七章 检索算法教学进度安排:1. 第1周:数据结构基础回顾,顺序检索法讲解及实践2. 第2周:二分检索法讲解及实践,效率分析3. 第3周:应用案例分析与编程实践,检索算法拓展教学内容科学、系统,紧密结合教材,注重理论与实践相结合,旨在提高学生对检索算法的理解和应用能力。

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

存档编号:西安********课程设计说明书设计题目:查找算法性能分析系别:计算机学院专业:计算机科学班级:计科***姓名:王***(共页)2015年01月07 日*****计算机科学专业课程设计任务书姓名:*** 班级:计科**** 学号:****指导教师:**** 发题日期:2015-01-05完成日期:2015-01-09一需求分析1.1问题描述查找又称检索,是指在某种数据结构中找出满足给定条件的元素。

查找是一种十分有用的操作。

而查找也有内外之分,若整个查找过程只在内存中进行称为内查找;若查找过程中需要访问外存,则称为外查找,若在查找的同时对表做修改运算(插入或删除),则相应的表成为动态查找表,反之称为静态查找表。

由于查找运算的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(也叫平均查找长度)作为一个查找算法效率优劣的标准。

平均查找程度ASL定义为:ASL=∑PiCi(i从1到n)其中Pi代表查找第i个元素的概率,一般认为每个元素的查找概率相等,Ci代表找到第i个元素所需要比较的次数。

查找算法有顺序查找、折半查找、索引查找、二叉树查找和散列查找(又叫哈希查找),它们的性能各有千秋,对数据的存储结构要求也不同,譬如在顺序查找中对表的结果没有严格的要求,无论用顺序表或链式表存储元素都可以查找成功;折半查找要求则是需要顺序表;索引表则需要建立索引表;动态查找需要的树表查找则需要建立建立相应的二叉树链表;哈希查找相应的需要建立一个哈希表。

1.2基本要求(1)输入的形式和输入值的范围;在设计查找算法性能分析的过程中,我们调用产生随机数函数:srand((int)time(0));产生N个随机数。

注:折半查找中需要对产生的随机数进行排序,需要进行排序后再进行输入,N<50; (2)输出形式;查找算法分析过程中,只要对查找算法稍作修改就可以利用平均查找长度的公式:ASL=∑PiCi(i从1到n)输出各种查找算法的平均查找长度。

注:平均查找长度=总的平均查找长度/N;(3)程序所能达到的功能通过输出几种查找算法的ASL,我们很显然能得在数据量较小时(N<100)我们在实现静态查找时应该选择如何调用哪种查找算法。

二概要设计说明本程序中用到的所有抽象数据类型的定义。

主程序的流程以及各程序模块之间的层次(调用)关系。

1、数据结构顺序查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType;顺序表类型为SeqList类型。

typedef NodeType SeqList【MaxSize】;/ 它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,查找成功。

折半查找:在进行顺序查找顺序表类型定时需要定义typedef int KeyType,并且需要调用排序函数对其进行排序。

折半查找类型为SeqList类型。

typedef NodeType SeqList【MaxSize】;折半查找又叫二分查找,效率较高,但折半查找要求被查找的表示顺序表,它的基本思路是:设R【low…..high】是当前的查找区间,首先确定该区间的中点位置mid=┖(low+high)/2 ┘,然后将待查的k值与R【mid】.key。

①如果中点值的值是k,返回该元素的逻辑符号;②如果中点值>k,则中点值之后的数都大于k,所以k值在该表的左边,所以确定一个新的查找区间;③如果中点值<k,则中点值之后的数都小于k,k值在该表的右边,再在该表的右边确定一个新的查找区间;④依次循环。

索引查找:/索引存储结构是在存储数据的同时还建立附加的索引表,索引表包括关键字和地址。

索引表的数据类型KeyType key、int link,link代表对应块的起始下标。

typedef IdxType IDX[MaxSize] //索引表的类型分块查找又称索引顺序查找,它的性能介于顺序查找和折半查找之间的一种算法,它的分块的思想是:①将表均分成b块,前b-1块中的关键字个数为s=┏n/b┐;②每一块的关键字不一定有序,但前一块中的最大关键字必须小于后一块中的最小关键字;③取各块中最大的关键字及该块在R中的起始位置。

注:索引表是一个递增有序表分块查找的基本思路是:①首先查找索引表,因为索引表是有序表,所以可以采用折半查找或者顺序查找,来确定待查元素在哪一块;②再已确定的块中进行顺序查找(因为块内元素无序,所以只能用顺序查找)列:设有一个线性表采用顺序存储,有20个元素,将其分成4(b=4)部分,每部分有5个元素(s=5),该索引表的存储结构如下图所示:在如图所示的存储结构中,查找关键字k=80时,首先将k和索引表中个关键字比较,直到找到大于等于k的值,因此若关键字k=80存在则必定在第四块中,由IDX[3].link找到起始地址15,从该地址开始在R【15…19】中进行查找,直到找到关R【8】.key=k为止,如果查找不成功说明不存在关键字k=80。

二叉树查找:线性表可以有三种查找法,其中折半查找的效率最高,但是折半查找要求元素时顺序表,而且不能用链式存储结构,因此有表的插入或删除操作时,需要移动大量元素,这时候二叉树查找的优势就体现出来了。

即动态查找时就需要用到链式存储结构。

二叉排序树(BST)又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足如下性质的二叉树:①若它的左孩子非空,则左子树上的所有元素的值均小于根元素的值;②若它的右孩子非空,则左子树上的所有元素的值均大于根元素的值;③左右子树本身是一颗二叉树。

重要性质:中序遍历二叉排序树所得到中序序列是以一个递增有序序列。

二叉排序树算法思想:它可以看做是一个有序表,所以在二叉树上查找,和折半查找类似,也是一个逐步缩小查找范围的过程,运用递归查找算法SearchBST()。

哈希表查找:在用哈希表查找时先建立一个哈希表,哈希表主要用于快速查找,哈希表的查找过程和建表过程类似。

它的算法是:①设给定的值为k,根据建表时设定的散列函数h(k)计算哈希地址;②存储的个数为n,设置一个长度为M(M>n)的连续内存单元,以线性表中的每个对象Ki为自变量,通过h(k)把Ki映射为内存单元的地址,并把该对象存储字这个内存单元中。

哈希函数的构造有直接定址法、除留余数法和数字分析法,常用的是除留余数法,它是用关键字k除以某个不大于哈希表长度m的数p,将所得到的余数作为哈希地址。

除留余数法的哈希函数h(k):H(k)=K mod P(mod为取余运算,p<=m)2、程序模块顺序查找:int SeqSearch(SeqList R,int n,KeyType k) /*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字k*/{int i=0;while (i<n && R[i].key!=k) /*从表头开始找*/i++;if(i>=n) /*未找到返回0/*return 0;elsereturn i+1; /*找到时返回逻辑符号i+1*/}折半查找:int BinSearch(SeqList R,int n,KeyType k)/*函数的返回值是整型,有三个参数分别是顺序表SeqList、元素个数n和需要查找的关键字*/{int low=0,high=n-1,mid;int count=0;while(low<=high) /*当前区域存在元素时循环*/{count++; /*每循环一次count++*/mid=(low+high)/2;if(R[mid].key==k) /*如果查找成功返回其逻辑序号mid+1*/return mid+1;if(R[mid].key>k) /*继续在R【low…mid-1】中查找*/high=mid-1;else /* 继续在R【mid+1…high】中查找*/return count+1; /*返回的是总的平均查找长度*/}}索引查找:int IdxSearch(IDX I,int b,SeqList R,int n,KeyType k) /*索引查找函数值返回的是整型,函数有五个参数,分别是索引表I、分的块数b、顺序表R、关键字个数和关键字*/{int low=0,high=b-1,mid,i,count=0;int s=n/b; /*s为每块的元素个数,应为n/b的向上取整*/while(low<=high) /*索引表中进行折半查找、找到的位置为high+1*/{count++;mid=(low+high)/2;if(I[mid].key>=k)high=mid-1;elselow=mid+1;}/* 应在索引表的high+1中,再在对应的线性表中进行顺序查找*/i=I[high+1].link;while(i<=I[high+1].link+s-1&&R[i].key!=k)if(i<=I[high+1].link+s-1) /* 查找成功*/{i++;count++;}return count+1;}int SearchBST(BSTNode *bt,KeyType k) /*二叉排序树查找函数的返回值是BSTNode类型,函数有两个参数分别是二叉排序树bt和关键字k*/{ if(bt==NULL||bt->key==k) /*递归的终结条件*/return 1;if(k < bt->key){ return SearchBST(bt->lchild ,k) + 1; /*在左子树中的递归查找*/ }else{ return SearchBST(bt->rchild ,k) + 1; /*在右子树中的递归查找*/ }}int SearchHT(HashTable ha,int p,KeyType k) /*哈希查找的返回值是整型有三个参数,分别是哈希表ha、小于哈希表长度的最小素数p和关键字k*/{int i=0,adr=0;int m=50;adr =k%p;while (ha[adr].key!=NULLKEY && ha[adr].key!=k) /*采用线性探查法查找下一个地址*/{i++;adr =(adr+1)%m; /*adr=(adr+1)mod m*/}if(ha[adr].key==k)return i+1; /*查找成功*/elsereturn -1; /*查找失败*/}3、各模块之间的调用关系以及算法设计函数的调用关系图:在主函数中需要定义一个SeqList R的顺序表;HashTable ha 哈希表;索引表IDX I。

相关文档
最新文档