数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx

上传人:b****1 文档编号:1557069 上传时间:2023-04-30 格式:DOCX 页数:18 大小:172.64KB
下载 相关 举报
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第1页
第1页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第2页
第2页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第3页
第3页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第4页
第4页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第5页
第5页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第6页
第6页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第7页
第7页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第8页
第8页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第9页
第9页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第10页
第10页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第11页
第11页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第12页
第12页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第13页
第13页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第14页
第14页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第15页
第15页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第16页
第16页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第17页
第17页 / 共18页
数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx

《数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx(18页珍藏版)》请在冰点文库上搜索。

数据结构课程设计两种常用查找算法的比较与实现Word文档格式.docx

《数据结构》课程设计作为独立的教学环节,是计算机相关专业集中实践环节系列之一,是学习完《数据结构》课程后进行的一次全面的综合练习。

所以需要我们了解并掌握数据结构与算法的设计方法,并且具备初步的独立分析和设计能力,同时要掌握软件开发过程的问题分析、系统设计、程序编码测试等基本方法和技能,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。

所以这次课程设计的目的在于:

加强学生对C语言的基本知识和技能;

加深对数据结构基础理论和基本知识的理解,提高解决实际问题的实践能力;

同时帮助调动学生的积极性和能动性,培养学生的自学、动手能力。

1.2课程设计目标

本次课程设计,我准备用不同的两种常见的查找方法:

针对顺序查找表中查找方法,如顺序查找、折半查找等。

并且通过用这些算法实现对某个“特定的”数据元素(关键字)的查找,分析这些操作的性能:

它们各自的时间复杂度、空间复杂度和其它的一些性能,同时记录每种查找方法的优缺点,比较得出它们的查找效率和查找范围。

2设计概要

2.1问题描述

对于不同的查找算法,它们各自的时间复杂度和空间复杂度不同,查找的思想和算法也明显不同,所以要分析它们的特点和效率,我们要多方面比较:

要比较时间复杂度,我们可以从它们的查找长度侧面比较出来;

而它们算法的实现就要熟悉它们的查找思想,熟练应用C语言编写合适的程序。

2.2设计思路

静态查找表有顺序表和链式表两种表示方法,在这次的课程设计里,我用顺序存储表来表示这两种查找算法的程序。

我的设计思路及步骤如下:

(1)熟悉两种算法的编程思想,画出流程图。

(2)先编写两种算法的子程序,再遍写主程序调用它们。

(3)分步调试子程序和主程序,直到不再出现错误,然后运行程序,检查是否和自己当初的设想一样,一直到结果能让自己满意。

(4)比较得出两种查找算法的优缺。

2.3相关的知识点

(1)C语言表示静态查找表的顺序存储结构

typedefstruct{

ElemType*elem;

//数据元素存储空间基址,建表时按实际长度分配,0号单元留空

intlength;

//表的长度

}SSTable;

(2)查找算法的衡量指标

查找可能产生“成功”与“不成功”两种结果,但在实际应用的大多数情况下,查找成功的可能性比不成功的可能性大得多,特别是在记录数中n很大时,查找不成功的概率可以忽略不计。

当查找不成功的情况不能忽视时,查找算法的平均长度应该是查找成功时的平均查找长度与查找不成功时的平均查找长度之和,平均查找长度为:

ASL=

其中,n为元素的个数;

ci是查找第i个记录需进行的比较次数;

pi是查找第i个记录的概率,一般可认为查找每个记录的概率是相等的,即p1=p2=…=pn=1/n【2】。

3算法分析及程序编写

3.1.顺序表的查找

(1)基本思想

从查找表的一端开始,逐个将记录的关键字值和给定值进行比较,如果某个记录的关键字值和给定值相等,则称查找成功;

否则,说明查找表中不存在关键字值为给定值的记录,则称查找失败。

(2)顺序查找算法流程图

算法流程图如图3-1所示:

图3-1:

顺序查找算法流程图

(3)顺序查找算法代码如下

intSearch_Seq(SSTable*table,ElemTypekey)

{/*在顺序表ST中顺序查找其关键字等于key的数据元素。

若找到,则函数值为该元素在表中的位置,否则为零。

*/

table->

elem[0]=key;

//设置哨兵

intresult=0;

//找不到时,返回0

inti;

for(i=table->

length;

i>

=1;

i--)

{//从后往前找

if(table->

elem[i]==key)

{

result=i;

//找到关键字的时候,该元素的位置

break;

}

}

returnresult;

//找不到时返回

}

<

4>

顺序查找算法性能分析

对于顺序查找,不论给定值key为何值,查找不成功时和给定值进行比较的关键字个数均为n+1.假设查找成功与不成功的可能性相同,对每个记录的查找概率也相等,则Pi=1/(2n),此时顺序查找的平均查找长度为[3]:

ASL=

+(1/2)(n+1)

=(3/4)(n+1)

5>

结论

顺序查找的优点是算法简单,且对表的结构没有任何要求。

它的缺点是查找效率低,因此,当表中元素个数比较多时,不宜采用顺序查找。

3.2.折半查找

(1)使用折半查找必须具备两个前提条件

a:

要求查找表中的记录按关键字有序(假设:

从小到大有序)

b:

只能适用于顺序存储结构

(2)基本思想

先取查找表的中间位置的关键字值与给定关键字值作比较,若它们的值相等,则查找成功;

如果给定值比该记录的关键字值大,说明要查找的记录一定在查找表的后半部分,则在查找表的后半部分继续使用折半查找;

若给定值比该记录的关键字值小,说明要查找的记录一定在查找表的前半部分,则在查找表的前半部分继续使用折半查找,直到查找成功,或者查找失败。

(3)查找流程图

流程图如图3-2所示:

图3-2:

折半查找算法流程图

(4)折半查找算法的代码

intSearch_Bin(SSTable*table,ElemTypekey)

{/*在有序表ST中折半查找其关键字等于key的数据元素。

若找到,则函数值为该元素在表中的位置,否则为0.*/

intlow=1;

inthigh=table->

//置区间初值

intresult=0;

//找不到时,返回0

while(low<

=high)

{

intmid=(low+high)/2;

//中间的数据元素

if(table->

elem[mid]==key)

{

result=mid;

break;

}//找到待查元素

elseif(key<

table->

elem[mid])

high=mid-1;

}//继续在前半区间进行查找

else

low=mid+1;

}//继续在后半区间进行查找

}

returnresult;

}[5]

(5)折半查找算法性能分析

在折半查找的过程中,每经过一次比较,查找范围都要缩小一半,所以折半查找的最大查找长度为

MSL=[log2n]+1

当n足够大时,可近似的表示为log2(n)。

(6)结论

折半查找要求查找表按关键字有序,而排序是一种很费时的运算;

另外,折半查找要求表是顺序存储的,为保持表的有序性,在进行插入和删除操作时,都必须移动大量记录。

因此,折半查找的高查找效率是以牺牲排序为代价的,它特别适合于一经建立就很少移动、而又经常需要查找的线性表。

可见在查找速度上,折半查找比顺序查找速度要快的多,这是它的主要优点[4]。

4测试分析

1.输入元素有误

(1):

若输入的元素个数不合理,元素个数少于n,这种输入造成的的结果是系统一直等待元素的输入,即得不到结果。

如图4-1所示:

图4-1:

输入元素个数少时的运行情况

(2)若输入元素个数大于n时,系统将从第一个元素起,自动选取前n个元素作为有效元素,进行程序的后续运行。

这种情况下的结果如图4-2所示:

图4-2:

输入元素个数多时的运行情况

2.查找失败

这种情况是指在n个元素中没有与关键字相同的元素存在,所以程序运行的结果是查找失败。

运行结果如图4-3所示:

图4-3:

查找失败时的运行情况

3.查找成功

若查找成功,即元素输入无误,且有关键字存在的情况,这个时候的运行结果如图4-4所示[5]:

图4-4:

查找成功时的运行情况

5总结和体会

5.1课程设计总结

“书到用时方恨少”。

在这次课程设计,我感触最深的当属查阅大量的设计资料了,为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,看着那么大叠的书籍、资料摆在自己的面前,有些时候还要上网查阅相关知识点,并且还要整理出有用的知识点,这对于我来说,是在是个不小的挑战。

所以,以后一定要多看自己专业方面的书籍,增长自己的知识。

而且,写程序是一件十分需要耐心的活,一个不小心,后果就可能是几个小时的思考和调试,幸好这次的课题我并不陌生,所以,并没有自己想象中的艰难。

但是,用的时间和精力却绝对也不少。

5.2心得与体会

这次课程设计,使我对《数据结构》这门课程有了更深入的了解。

《数据结构》是一门实践性较强的课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践。

一个人的力量是有限的,要想把课程设计做的更好,就要学会参考一定的资料,吸取别人的经验,让自己和别人的思想有机的结合起来,得出属于你自己的灵感。

在本课程设计中,我明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大型程序的能力。

培养了基本的、良好的程序设计技能以及合作能力。

这次课程设计同样提高了我的综合运用所学知识的能力。

程序的编写需要有耐心,有些事情看起来很复杂,但问题需要一点一点去解决,分析问题,把问题一个一个划分,划分成小块以后就逐个去解决。

再总体解决大的问题。

这样做起来不仅有条理也使问题得到了轻松的解决。

通过这两周的课程设计,我认识到数据结构是一门比较难的课程。

需要多花时间上机练习。

这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的基本技能,提高了我适应实际,实践编程的能力。

参考文献:

[1]严蔚敏,吴伟民.《数据结构:

C语言版》清华大学出版社,2012.5

[2]Mark 

Allen 

Weiss.数据结构与算法分析——C语言描述(英文版第二版).北京:

人民邮电出版社,2005

[3]李峰,谢中科.C语言程序设计.上海:

复旦大学出版社,2011

[4]Baloukas,C.,Risco-Martin,J.L.,Atienza,D.,etal.Optimizationmethodologyofdynamicdatastructuresbasedongeneticalgorithmsformultimediaembeddedsystems[J].JournalofSystemsandSoftware,2009,82(4):

590-602.

[5]李春葆,尹为民.数据结构教程上机指导(第三版).北京:

清华大学出版社,2008

附录:

程序源代码:

#include<

iostream>

stdlib.h>

stdio.h>

usingnamespacestd;

typedefintElemType;

//用C语言定义顺序存储结构

ElemType*elem;

//表的长度

voidCreate(SSTable*table,intlength);

//构建顺序表

voidDestroy(SSTable*table);

intSearch_Seq(SSTable*table,ElemTypekey);

voidTraverse(SSTable*table,void(*visit)(ElemTypeelem));

voidCreate(SSTable**table,intlength)

{//构建顺序表

SSTable*t=(SSTable*)malloc(sizeof(SSTable));

t->

elem=(ElemType*)malloc(sizeof(ElemType)*(length+1));

length=length;

*table=t;

voidFillTable(SSTable*table)

{//无序表的输入

ElemType*t=table->

elem;

for(inti=0;

i<

i++)

t++;

scanf("

%d"

t);

getchar();

voidDestroy(SSTable*table)

{//销毁表

free(table->

elem);

free(table);

voidPrintTable(SSTable*table)

{//打印查找表中的元素

inti;

for(i=0;

t++;

printf("

%d"

*t);

//顺序(哨兵)查找算法

{/*在顺序表ST中顺序查找其关键字等于key的数据元素。

table->

for(i=table->

{//从后往前找

if(table->

result=i;

}

}

voidSort(SSTable*table)

{//排序算法

inti,j;

ElemTypetemp;

=1;

i--)//从前往后找

for(j=1;

j<

i;

j++)

{

if(table->

elem[j]>

elem[j+1])

{//从小到大排列

temp=table->

elem[j];

table->

elem[j]=table->

elem[j+1];

//元素后移

elem[j+1]=temp;

//主函数

intmain(intargc,char*argv[])

{

SSTable*table;

intr;

//元素的位置

intn;

ElemTypekey;

printf("

输入n:

"

);

scanf("

&

n);

Create(&

table,n);

//建立表

cout<

<

请输入"

n<

个值"

endl;

FillTable(table);

//输入无序表的值

您输入的%d个值是:

\n"

n);

PrintTable(table);

//打印无序表

请输入关键字的值:

key);

顺序法查找运行结果如下:

\n"

Search_Seq(table,key);

r=Search_Seq(table,key);

if(r>

0)

关键字%d在表中的位置是:

%d\n"

key,r);

else

printf("

查找失败,表中无此数据。

Sort(table);

//对无序表进行排序

数据排序后的顺序如下:

//打印有序表

折半查找法运行结果如下:

r=Search_Bin(table,key);

//折半查找算法

0)

else{

printf("

return0;

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2