数据结构和算法

2024-06-10 版权声明 我要投稿

数据结构和算法(精选8篇)

数据结构和算法 篇1

数据结构是指相互之间具有(存在)一定联系(关系)的数据元素的集合,元素之间的互相联系称为逻辑结构。数据元素的逻辑结构基本类型有四种:

集合:结构中的数据元素除了“同属于一个集合”外,没有其他关系。

线性结构:结构中的数据元素之间存在着一对一的关系

树型结构:结构中的数据元素之间存在着一对多的关系

图状结构或网状结构:机构中的数据元素之间存在着多对多的关系

2.数据结构的存储方式

数据结构在计算机内存中的存储包括数据元素的存储和元素之间的关系的表示。

元素之间的关系在计算机中有两种不同的表示方法:顺序表示和非顺序表示。由此得出两种不同的存储结构,即:顺序存储结构和链式存储结构。

顺序存储结构:用数据元素在存储器中的相对位置来表示数据元素的逻辑结构(关系)。

链式存储结构:在每一个数据元素中增加一个存放另一个元素地址的指针(pointer),用该指针来表示数据元素的逻辑结构(关系)。

3.逻辑结构和物理结构

逻辑结构 物理结构

线性表 线性存储结构

链式存储结构

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

树 线性存储结构

链式存储结构

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

图 复合存储结构

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

数据的逻辑结构

┌───────────┃──────────┐

线性结构 非线性结构

┏━━━━━━━━╋━━━━━━━━━┓┏━━━━━━━╋━━━━━━━━━┓

┃ 受限线性表 线性表推广 集合 树型结构 图状结构

┃ ┏╋┓ ┏╋┓ ┏━━╋━━┓ ┏━━╋━━┓

一般线性表 栈和队列 串 数组 广义表 一般树 二叉树 有向图 无向图

4.数据结构的运算

数据结构的主要运算包括:

1.建立一个(create)数据结构

2.消除(destroy)一个数据结构

3.从一个数据结构中删除(delete)一个数据元素

4.把一个数据元素插入(insert)到一个数据结构中

5.对一个数据结构进行访问(access)

6.对一个数据结构(中的数据元素)进行修改(modify)

7.对一个数据结构进行排序(sort)

8.对一个数据结构进行查找(search)

5.线性表(linear list)

是由n(n>=0)个类型相同的数据元素a1,a2....an组成的有限序列,

记作(a1,a2,...,ai-1,ai,ai+1,...,an)这里的数据元素ai(1<=i<=n)只是一个抽象的符号,其具体含义在不同情况下可以不同,它既可以是原子类型,也可也是结构类型,但同一线表中的数据元素必须属于同一数据对象。此外,线性表中相邻数据元素之间存在着序偶关系,即对于非空的线性

表(a1,a2,...,ai-1,ai,ai+1,...,an).表中ai-1,领先于ai,称ai-1是ai的直接前驱,而称ai,是ai-1的直接后续。除了第一个元素a1外,每个元素ai有且仅有一个被称为直接前驱的结点ai-1, 除了最后一个元素an外,每个元素ai有且仅有一个被称为直接后继的结点ai+1.线性表中元素的个数n被定义为线性表的长度,n=0时被称为空表。线性表的特点可以概况如下:

同一性:线性表由同类数据元素组成,每个ai必须属于同一个数据对象

有穷性:线性表由有限个数据元素组成。表长度就是表中数据元素的个数

有序性:线性表中表中相邻的数据元素之间存在着序偶关系(ai,ai+1)

数据结构和算法 篇2

一、数据结构的分析

对于一个家庭来说,不论是根据年龄关系还是父子、母子等关系,都可以在家庭成员之间得到一种线性结构。同样的,按照隶属关系,学校中的各部、系、院也能够得到一种层次结构。由此可见,所谓结构也就是一种用来对关系进行表现的形式[1]。当面对实际应用问题使用计算机来进行解决的时候,一般都有两种视图,分别是抽象视图与实现视图。其中,抽象视图重点关注的是已经在数据之间存在的某种特定关系,抽象视图本身是与计算机这个机器没有任何关联的,其所表现出来的结构也就是计算机领域中所说的数据的逻辑结构,这样一来,当算法设计者站在抽象视图这一层面进行算法设计的时候,所得到的也就是一种抽象算法。实现视图关注的是如何让计算机发掘数据以及存在在数据之间的逻辑关系,这样计算机才可以根据程序设计者所设计的程序来对发掘的数据进行处理。对于计算机来说,内存是其可视区,所以实现视图必须要把数据以及数据之间的逻辑关系完整地存储到计算机内存中。当数据之间的关系存储在计算机的时候,数据所对应的存储映像之间同样也会呈现出一种结构,这个结构也就是数据的存储结构。数据的逻辑结构体现的是数据之间的关系,是在分析阶段中得到的产物。而数据的存储结构回答的是如何在计算机空间中将这个产物存储进去的问题,所以也就出现了同一种逻辑结构能够映射成不同存储结构的现象。

二、算法与程序的分析

所谓算法,是在计算机中解决问题的一系列确定性的步骤过程,0个或多个输入、1个或多个输出、有效性、确定性、有穷性是算法必须要具备的五个要求,缺失了其中任何一个,算法便不能称之为算法。在描述算法的时候,一般都是通过自然语言或者是伪代码来对其进行描述。程序作为计算机算法的具体体现,其是计算机程序员使用一种能够被计算机识别的语言来对被实现算法的重新描述。在编译器的编译下,最终程序也就被转换成为了一系列指令,进而也就能够通过计算机来解决实际应用问题[2]。程序作为算法的实现,其与算法的设计既有可能是由同一个人负责完成的,也有可能是在不同的人的操作下完成的。

另外还有一点值得予以注意,在算法与程序之间还存在着一个最明显的不同之处,算法必须要具有有穷性这一特性,而程序则不用受到有穷性的限制。这是因为一旦算法失去了有穷性,其也就无法解决实际应用问题,算法也就不能称之为算法。换句话说,在算法中必然存在着触发条件使得求解结束。在执行程序的过程中,如果程序一直没有得到结束运行的指令,那么程序将会一直不停的运行下去[3]。

三、数据结构、算法与程序之间的关系

数据结构、算法与程序之间有着种种联系,在理清这三者之间所具有的关系的时候,必须要明确一点:与数据的逻辑结构相关的是算法的设计,与数据的存储结构相关的是算法的实现。当对某一个实际问题运用计算机来加以解决的时候,第一步要做的就是对实际问题进行建模,在得到了实际问题的抽象模型或数学模型之后才能够加以解决。因此从另一个角度来说,数据的逻辑结构就是抽象模型中的组成部分,计算机算法的设计者根据实际问题的相关信息来设计出解决该问题的具体算法。可见,对实际问题抽象化的好坏会直接决定建立在此基础之上的算法质量,也就是说,抽象模型决定了算法,而抽象模型中又包括了数据的逻辑结构。

在得到算法以后,接下来所要做的就是让算法被计算机读懂并且让计算机能够根据算法中制定的步骤与流程来处理并解决目标问题。在此过程中,需要将抽象模型映射到计算机的存储器中,同时也要将算法即将处理的数据以及数据之间的关系映射到该存储器中[4]。在将抽象模型映射到计算机存储器之后,计算机能够很直观的感知到这个抽象模型,然后便要将算法转换成为一种能够驱动计算机执行程序的一系列指令。

从上述可以得到,在得到了相应的计算机编译程序之后,计算机也就可以掌握并理解高级程序设计语言,但是必须要予以注意的是,计算机此时仍然无法理解伪代码或者自然语言[5]。因此,接下来要做的就是让计算机根据设计阶段中所得到的抽象算法来求解问题。而解决这一问题的关键就在于计算机程序员,这是因为程序员是既懂高级程序设计语言又懂伪代码或自然语言的计算机领域工作者。而程序指的就是程序员可以通过某种高级程序设计语言实现抽象算法后所得到的产物。计算机在理解了程度之后便能够执行程序,从而也能够根据相应的算法来求解问题[6]。

结语:

综上所述可知,数据结构、算法与程序都是计算机在解决实际问题的过程中所涉及到的三个关键内容,计算机产生的目的也就是为了方便实际问题的解决,因此,必须要正确认识数据结构、算法与程序之间的内在联系,保证能够合理运用好这三点来解决实际应用问题。

摘要:在社会发展的过程中,计算机行业的重要性十分突出,计算机水平更是衡量社会发展乃至国家综合实力的重要标准之一。而在计算机专业中,最重要的课程之一便是数据结构,数据结构作为计算机领域中的重要组成部分,关系到能否开发出可行性高且高效的计算机应用程序。在实际开发程序的过程中,处理好算法与数据结构之间的关系具有十分重要的意义,会对所开发的系统或程序的可行性、效率、稳定性等产生直接影响,因此这就要求必须要处理好数据结构、算法与程序之间的关系。本文主要就是对数据结构、算法与程序之间的关系进行研究,首先分别对数据结构、算法以及程序这三个内容进行了简要分析,并重点描述了这三者之间具有的关系,以期能够帮助人们更好的理清这三者之前所具有的关系与联系。

关键词:数据结构,算法,程序

参考文献

[1]刘晓静,王晓英,张玉安,黄建强,刘志强.以创新人才培养为目标的数据结构实验教学改革[J].实验技术与管理,2014,11:184-187.

[2]李文杰,姜淑娟,钱俊彦,王兴亚,鞠小林.基于对象引用关系的Java程序内存行为分析方法[J].电子学报,2015,07:1336-1343.

[3]李文明,叶笑春,张洋,宋风龙,王达,唐士斌,范东睿,谢向辉.BDSim:面向大数据应用的组件化高可配并行模拟框架[J].计算机学报,2015,10:1959-1975.

[4]徐慧,周建美,顾颀.强化课堂编程思维契合教学实践目标——《数据结构》教学方法探析[J].高教论坛,2013,01:24-28.

[5]S.Boccaletti,V.Latora,Y.Moreno,M.Chavezf,D.-U.Hwang,方爱丽,赵继军.复杂网络:结构和动力学[J].复杂系统与复杂性科学,2007,01:49-92.

数据结构中经典算法探讨 篇3

【关键词】数据结构;算法;软件设计

1.经典算法的选择

选择经典算法的重要性,PASCAL语言的创始人、著名的计算机科学家N.沃思说得好“程序=数据结构+算法”,足以见得算法在程序设计中的重要地位。在合理的数据结构基础上,算法是对数据结构的操作(运算),是数据处理的核心。在《数据结构》中介绍的基本数据结构有线性表、堆栈、队列、数组、树、二叉树、图以及相应的算法。一个算法是建立在某种数据结构的基础上,一个算法不可能脱离数据结构而孤立存在。只有通过学习算法,才能真正掌握某种数据结构。可以说学习《数据结构》的过程基本上是学习各种算法的过程。在众多的算法中有简单的、有复杂的、有容易的、有难度大的,在有限的学时情况下,不可能也没有必要逐一讲解每一个算法。大多数的算法,要靠学生自己理解消化。在这种情况下,如何选择少量的经典算法进行分析讲解,显得尤其重要。一个经典算法往往能起到以一当十、以点带面的关键作用。通过经典算法的分析,一方面让学生加深对数据结构基本理论的理解另一方面让学生学习程序设计方法。

选择好经典算法后下一步就是要对其展开综合分析,下面以具体的算法为例进行讨论。

2.利用经典算法说明基本原理

2.1 经典算法应能体现某个数据结构的基本特征

我们知道线性表顺序存储时其优点是能够对每个数据元素随机访问,存储密度高,其缺点是插入、删除操作时需要移动大量的数据元素,操作效率低。“向有序(由小到大或由大到小)的线性表(顺序存储)插入一个新的数据元素”,这一经典算法集中反映了线性表顺序存储的这些特点。

分析:将一个值为X的数据元素插入到有序(由小到大或由大到小)的线性表(顺序存储)中,可以分两步进行,首先查找到值为X的数据元素在线性表中应有的位置,采用从头到尾循环比较的方法确定其位置I,然后,将第I个以后的全部数据元素向后移动一个存储单元,最后将值为X的数据元素存放到第I个位置上,线性表元素个数增1。

【算法1】

PROCEDURE INSERT(V,m,n,X)

//将值为X的数据元素插入到V数组中,(线性表顺序存贮在V中)m为最多元素个数,n为当前实际元素个数

IF (m=n) THEN{“OVERFLOW”; RETURN}

FOR I=1 TO n DO

IF (X〈V(I))THEN BREAK

FOR J=n TO I BY -1 DO V(J+1)=V(J)

V(I)=X

n=n+1

RETURN

分析:【算法1】的优点是简单,便于理解,缺点是:

①循环体内有提前退出语句,不利于结构化程序设计;

②确定新数据元素位置和移动数据元素分两步进行,有重复操作,可以改进之,将两步合并一步完成,即将循环比较与移动数据元素同时进行。从线性表的尾部开始向前循环比较,比新数据元素大者后移,直到小于等于时停止。

【算法2】

PROCEDURE INSERT(V,m,n,X)

IF(m=n)THEN{“OVERFLOW”;RETURN}

I=n

WHILE (I〉=1)AND (V(I)〉X)DO {V(I+1)=V(I);I=I-1}

V(I+1)=X

n=n+1

RETURN

分析:注意【算法2】中循环条件,当循环结束后I=0或V(I)〈=X,新数据元素的位置为I+1,【算法1】的时间复杂度为0(2n),而【算法2】的时间复杂度为0(n),效率提高一倍。循环结构是结构化程序设计中最基本最核心的部分,归纳循环条件是关键。【算法2】能进一步推广。

2.2 利用经典算法学习算法设计

经典算法能给学习者以启示、示范作用。

分析:可以将【算法2】用于对线性表(顺序存储)排序算法中。在直接插入排序算法中,其算法思想是从第2个数据元素开始直到第n个数据元素,逐一插入到已有序的子线性表中。

【算法3】

PROCEDURE SORT(V,n)

FOR I=2 TO n DO

{ Y=V(I)

J=I-1

WHILE (J〉=1) AND (V(J)〉Y) DO {V(J+1)=V(J);J=J-1}

V(J+1)=Y }

RETURN

分析:【算示3】其结构分为双重循环,外循环完成逐一取数据元素,即取第I个数据元素,内循环完成将第I个数据元素插入到前I-1个已有序的子线性表中。内循环完成的功能可以独立成为一个子函数(子过程),可以借用【算法2】。这正是结构化程序设计思想的体现,即主程序完成任务的划分,说明“做什么”,子函数(子过程)完成任务的具体实现,说明“如何做”。结构化程序设计方法采取“分解”的手段来控制系统的复杂性,将大系统划分为若干个相对独立的、功能单一的子模块。一方面子函数(子过程)可以实现软件的重用性,在不同的程序段有相同的处理过程时调用子函数(子过程),减少软件开发的工作量;另一方面子函数(子过程)对具体的实现技术细节进行隐藏,便于开发人员集中精力把握软件开发的核心和主要问题,降低了软件开发难度,从而保证软件质量。在利用【算法2】时要稍加修改,见【算法4】。

【算法4】

PROCEDURE INSERT(V,I,X)

//将值为X的数据元素插入到已有序的前I-1个数据元素中

J=I-1

Y=X

WHILE (J〉=1) AND (V(J)〉X) DO {V(J+1)=V(J);J=J-1}

V(J+1)=Y

RETURN

相应的主程序也要作修改,见【算法5】

【算法5】

PROCEDURE SORT(V,n)

FOR I=2 TO n DO

INSERT(V,I,V(I))

RETURN

3.结束语

在众多的算法中选择好少量的经典算法对于教好、学好《数据结构》至关重要;经典算法要有助于学生理解对应的数据结构,经典算法的分析要侧重于程序设计能力的提高。

参考文献

[1]欧建圣.数据结构教学研究——经典算法的综合分析[J].武汉工程职业技术学院学报,2004,16(1):58-60.

[2]范德宝,于晓聪,丁伟祥.提高数据结构课程教学效果的探讨[J].黑龙江科技信息,2007(9):194-194.

数据结构算法设计与分析 篇4

网页制作、程序设计Java、JSP程序设计、Oracle、XML程序设计、计算机网络、SSH(Struts+Spring+Hibernate)框架、Java EE程序设计、Ajax程序设计、Linux+PHP+MySQL程序设计、Android手机开发、UML系统分析与设计、性能测试、自动化软件测试、软件质量保证、毕业设计及项目综合实训等。

数据结构、计算机网络、计算机组成原理、操作系统原理、编译原理、数据库原理及应用、金融学概论、西方经济学等基础理论课程;

网页制作、程序设计Java、JSP程序设计、J2EE程序设计、SQL Server数据库、Oracle数据库、Linux操作系统、UML系统分析与设计、软件工程、XML程序设计、SSH框架、金融市场学、ERP财务管理、管理信息系统、投资银行学、商业银行学、国际金融管理、毕业设计及项目综合实训等专业课程。

数据结构、计算机网络、计算机组成原理、操作系统原理、数据库原理及应用、软件工程、软件测试等计算机基础理论课程;

数据结构-实验8查找的算法 篇5

一,实验目的

1.熟悉掌握各种查找方法,深刻理解各种查找算法及其执行的过程; 2.学会分析各种查找算法的性能。

二,实验内容

8.1 实现顺序查找的算法

编写一个程序,输出在顺序表{3,6,2,10,1,8,5,7,4,9}中采用顺序查找法查找关键字5的结果。

8.2 实现折半查找算法

编写一个程序,输出在顺序表{1,2,3,4,5,6,7,8,9,10}中采用折半查找方法查找关键字9的结果。要求:(1)用非递归方法;(2)用递归方法。8.3 实现二叉排序树的基本运算

编写一个程序实现二叉排序树的基本运算,并在此基础上完成如下功能:(1)由{4,9,0,1,8,6,3,5,2,7}创建一个二叉排序树bt;

(2)判断bt是否为一棵二叉排序树(提示:在遍历过程中检查是否符合二叉排序树定义);

(3)采用非递归方法查找关键字为6的结点,并输出其查找路径(提示:查找过程中保留经过的结点信息,找到后顺序输出之)。8.4 实现哈希表的相关运算

编写一个程序,实现哈希表的相关运算,并在此基础上完成如下功能:

(1)建立{16,74,60,43,54,90,46,31,29,88,77}哈希表A[0…12],哈希函数为H(k)=key % 11,并采用线性探测法解决冲突。输出哈希表;(2)在上述哈希表中查找关键字为29的记录;

(3)在上述哈希表中删除关键字为77的记录,再将其插入,然后输出哈希表。要求:输出格式

哈希地址:0 1 2 ………..12 关键字值:……………………

三,源代码及结果截图

8.1 //实现顺序查找的算法 #include #define MAXL 100

//定义表中最多记录个数 typedef int KeyType;typedef int InfoType;typedef struct {

KeyType key;//KeyType为关键字的数据类型 InfoType data;//其他数据 } NodeType;

typedef NodeType SeqList[MAXL];

//顺序表类型 int Search(SeqList R,int n,KeyType k)//顺序查找算法

{ int i=0;while(i

printf(“%d ”,R[i].key);

i++;

//从表头往后找

} if(i>=n)

return-1;else {

printf(“%d”,R[i].key);

return i;} } void main(){ SeqList R;int n=10;KeyType k=5;InfoType a[]={3,6,2,10,1,8,5,7,4,9};int i;for(i=0;i

//建立顺序表

R[i].key=a[i];printf(“查找结果:n”);if((i=Search(R,n,k))!=-1)

printf(“n元素%d的位置是:%d”,k,i);else

printf(“n元素%d不在表中n”,k);printf(“n”);}

8.2

//实现折半查找算法 #include #define MAXL 100

//定义表中最多记录个数

typedef int KeyType;typedef char InfoType[10];typedef struct { KeyType key;

//KeyType为关键字的数据类型

InfoType data;

//其他数据 } NodeType;typedef NodeType SeqList[MAXL];

//顺序表类型

int BinSearch1(SeqList R,int n,KeyType k)//非递归二分查找算法 { int low=0,high=n-1,mid,count=0;while(low<=high)

{ mid=(low+high)/2;printf(“第%d

:

在[%d,%d]

到R[%d]:%dn”,++count,low,high,mid,R[mid].key);

if(R[mid].key==k)

//查找成功返回

return mid;if(R[mid].key>k)

//继续在R[low..mid-1]中查找

}

} high=mid-1;else low=mid+1;

//继续在R[mid+1..high]中查找

return-1;int BinSearch2(SeqList R,KeyType k,int low,int high,int count)//递归二分查找算法 {

int mid;if(low<=high){ mid=(low+high)/2;第%d

:

在[%d,%d]

素printf(“R[%d]:%dn”,++count,low,high,mid,R[mid].key);

if(R[mid].key==k)

//查找成功返回

return mid;else if(R[mid].key>k)

//继续在R[low..mid-1]中查找

BinSearch2(R, k,low,mid-1,count);else BinSearch2(R, k,mid+1,high,count);

//继续在R[mid+1..high]中查找

}

else return-1;} void main(){

} SeqList R;KeyType k=9;int a[]={1,2,3,4,5,6,7,8,9,10},i,n=10;for(i=0;i

//建立顺序表

printf(“用非递归方法:n”);if((i=BinSearch1(R,n,k))!=-1)printf(“元素%d的位置是%dn”,k,i);else printf(“元素%d不在表中n”,k);printf(“用递归方法:n”);if((i=BinSearch2(R,k,0,9,0))!=-1)printf(“元素%d的位置是%dn”,k,i);else printf(“元素%d不在表中n”,k);

8.3 //实现二叉排序树的基本运算 #include //EOF,NULL #include //atoi()#include //cout,cin typedef int Status;typedef struct BTNode {

int key;

struct BTNode *lchild;

struct BTNode *rchild;}BTNode;//定义二叉排序树插入结点的算法 int BSTInsert(BTNode *&T,int k){

if(T==NULL)

{

T=(BTNode *)malloc(sizeof(BTNode));

T->lchild=T->rchild=NULL;

T->key=k;

return 1;

}

else

{

if(k==T->key)

return 0;

else if(kkey)

return BSTInsert(T->lchild, k);

else

return BSTInsert(T->rchild, k);

} } //定义二叉排序树的创建算法 BTNode *createBST(int k[],int n){

BTNode *T;

T=NULL;

for(int i=0;i<=n-1;i++){

BSTInsert(T,k[i]);

}

return T;} //判断是否为二叉排序树 Status Judge(BTNode *&T){

} //定义二叉排序树的查找算法

BTNode *BSTSearch(BTNode *&T,int k){

if(T==NULL)

return NULL;

else if(T==NULL)return 1;else if((T>T->lchild)&&(Trchild)){

} else return 0;Judge(T->lchild);Judge(T->rchild);

{

printf(“%d ”,T->key);

if(T->key==k)

return T;

else if(kkey)

{

return BSTSearch(T->lchild, k);

}

else

{

return BSTSearch(T->rchild, k);

}

} } void main(){

int a[50]={4,9,0,1,8,6,3,5,2,7};

BTNode *bt=createBST(a,10);

if(Judge(bt)==0)cout<<“bt不是二叉排序树”<

}

8.4 //实现哈希表的相关运算 #include #define MaxSize 100

//定义最大哈希表长度 #define NULLKEY 0

//定义空关键字值

#define DELKEY-1

//定义被删关键字值

typedef int KeyType;

//关键字类型

typedef char * InfoType;//其他数据类型 typedef struct { KeyType key;//关键字域

InfoType data;

//其他数据域 int count;

//探查次数域

} HashTable[MaxSize];

//哈希表类型

void InsertHT(HashTable ha,int *n,KeyType k,int p)中 {

//将关键字k插入到哈希表

int i,adr;adr=k % p;if(ha[adr].key==NULLKEY || ha[adr].key==DELKEY)//x[j]可以直接放在哈希表中

} void CreateHT(HashTable ha,KeyType x[],int n,int m,int p)//创建哈希表 {

} else {

} n++;i=1;do { adr=(adr+1)% p;i++;

//i记录x[j]发生冲突的次数

//发生冲突时采用线性探查法解决冲突 ha[adr].key=k;ha[adr].count=1;} while(ha[adr].key!=NULLKEY && ha[adr].key!=DELKEY);ha[adr].key=k;ha[adr].count=i;

{ int i,n1=0;for(i=0;i

//哈希表置初值

{

ha[i].key=NULLKEY;

ha[i].count=0;

}

} int SearchHT(HashTable ha,int p,KeyType k){

int i=0,adr;adr=k % p;while(ha[adr].key!=NULLKEY && ha[adr].key!=k){

} if(ha[adr].key==k)return adr;

//查找失败

//查找成功 i++;

//采用线性探查法找下一个地址

//在哈希表中查找关键字k for(i=0;i

} return-1;int DeleteHT(HashTable ha,int p,int k,int *n)//删除哈希表中关键字k {

} void DispHT(HashTable ha,int n,int m)

//输出哈希表 {

float avg=0;int i;printf(“ 哈希表地址:t”);for(i=0;i

} else

//在哈希表中未找到该关键字 ha[adr].key=DELKEY;n--;

//哈希表长度减1

//在哈希表中找到该关键字

return 1;return 0;

printf(“ n”);

printf(“ 哈希表关键字:t”);

for(i=0;i

if(ha[i].key==NULLKEY || ha[i].key==DELKEY)printf(“

”);

//输出3个空格

else printf(“ %3d”,ha[i].key);printf(“ n”);printf(“ 搜索次数:t”);for(i=0;i

if(ha[i].key==NULLKEY || ha[i].key==DELKEY)printf(“

”);

//输出3个空格

else printf(“ %3d”,ha[i].count);printf(“ n”);

for(i=0;i

} if(ha[i].key!=NULLKEY && ha[i].key!=DELKEY)avg=avg+ha[i].count;avg=avg/n;printf(“平均搜索长度ASL(%d)=%gn”,n,avg);

void main(){

int x[]={16,74,60,43,54,90,46,31,29,88,77};int n=11,m=13,p=13,i,k=29;HashTable ha;CreateHT(ha,x,n,m,p);printf(“n”);DispHT(ha,n,m);printf(“ 查找关键字29:n”);i=SearchHT(ha,p,k);if(i!=-1)printf(“ ha[%d].key=%dn”,i,k);else printf(“ 未找到%dn”,k);k=77;printf(“ 删除关键字%dn”,k);DeleteHT(ha,p,k,&n);DispHT(ha,n,m);i=SearchHT(ha,p,k);if(i!=-1)printf(“ ha[%d].key=%dn”,i,k);else printf(“ 未找到%dn”,k);

} printf(“ 插入关键字%dn”,k);InsertHT(ha,&n,k,p);DispHT(ha,n,m);printf(“n”);

四,实验小结

1、通过本次实验,加深了我对查找表的认识。

2、有序表的查找之折半查找:前提必须是有序表,性能只有在均匀分布的时候才是最优的。

数据结构与算法课程学习总结报告 篇6

数据结构与算法是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且也已经成为其他理工专业的热门选修课。随着高级语言的发展,数据结构在计算机的研究和应用中已展现出强大的生命力,它兼顾了诸多高级语言的特点,是一种典型的结构化程序设计语言,它处理能力强,使用灵活方便,应用面广,具有良好的可移植性。通过学习,先报告如下:

一、数据结构与算法知识点

本学期学的《数据结构与算法》这本书共有十一个章节:

第一章的内容主要包括有关数据、数据类型、数据结构、算法、算法实现、C语言使用中相关问题和算法分析等基本概念和相关知识。其中重点式数据、数据类型、数据结构、算法等概念;C语言中则介绍了指针、结构变量、函数、递归、动态存储分配、文件操作、程序测试与调试问题等内容。

第二章主要介绍的是线性逻辑结构的数据在顺序存储方法下的数据结构顺序表(包括顺序串)的概念、数据类型、数据结构、基本运算及其相关应用。其中重点一是顺序表的定义、数据类型、数据结构、基本运算和性能分析等概念和相关知识。二是顺序表的应用、包括查找问题(简单顺序查找、二分查找、分块查找)、排序问题(直接插入排序、希尔排序、冒泡排序、快速排序、直接选择排序、归并排序)、字符处理问题(模式匹配)等内容。本章重点和难点在查找和排序问题的算法思想上,6种排序方法的性能比较。

第三章主要介绍的是线性逻辑结构的数据在链接存储方法下数据结构链表的相关知识。主要是单链表、循环链表的数据类型结构、数据结构、基本运算及其实现以及链表的相关应用问题,在此基础上介绍了链串的相关知识。在应用方面有多项式的相加问题、归并问题、箱子排序问题和链表在字符处理方面的应用问题等。本章未完全掌握的是循环链表的算法问题和C的描述。

第四章介绍在两种不同的存储结构下设计的堆栈,即顺序栈和链栈的相关知识,了解堆栈的相关应用,掌握应用堆栈来解决实际问题的思想及方法。本章主要内容是顺序栈和链栈的概念、数据类型、数据结构定义和基本运算算法及其性能分析。本章堆栈算法思想较为简单,所以能较好掌握。

第五章主要介绍顺序存储和链接存储方法下的两种队列、顺序(循环)队列和链队列的数据结构、基本运算及其性能分析以及应用。顺序队列(重点是循环队列)和链队列的概念、数据类型描述、数据结构和基本运算算法及其性能分析等。本章同堆栈有点类似,算法思想较为简单,所以能较好掌握;但难点重在循环队列队空、队满的判断条件问题。第六章“特殊矩阵、广义表及其应用”将学习数组、稀疏矩阵和广义表的基本概念,几种特殊矩阵的存储结构及其基本运算,在此基础上学习特殊矩阵的计算算法与广义表应用等相关问题。本章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。

第七章“二叉树及其应用”的知识结构主要是:非线性结构数据二叉树的定义、性质、逻辑结构、存储结构及其各种基本运算算法,包括二叉树的建立、遍历、线索化等算法。在此基础上,介绍二叉树的一些应用问题,包括哈夫曼编码问题、(平衡)二叉排序树问题和堆排序问题等。

第八章“树和森林及其应用”介绍树和森林的数据结构、基本算法及其性能分析,树和森林与二叉树之间的转换算法等,在此基础上介绍树的应用---B-树,应用B-树来实现数据元素的动态查找。本章基本掌握树和森林的概念和性质、数据结构、树的基本算法及性能分析,树和二叉树间的转换及其算法,并用应用B-树来实现数据元素的动态查找未能掌握好。

第九章“散列结构及其应用”是逻辑结构“集合型”的数据元素在散列存储方法下的数据结构及其应用知识内容。主要介绍散列函数的概念、散列结构的概念、散列存储结构的概念---散列表、散列函数和散列表中解决冲突的处理方法---开放定址法、链地址法以及散列表的基本算法及其性能分析。本章概念较为多,所以掌握不太好。

第十章“图及其应用”是逻辑结构为“图形”的数据结构及其应用知识内容,主要介绍图的定义和基础知识,图的2种存储结构。图的基本算法以及图的典型应用问题(最小生成树、最短路径、拓扑排序和关键路径等)。

二、对各知识点的掌握情况

我对各知识点的掌握情况总结如下:

第一章不太难,能基本掌握。但关系全书的时间性能分析有些未能全部掌握。第二章本章重点和难点在查找和排序问题的算法思想上,6种排序方法的性能比较。本章未掌握的为希尔排序、快速排序、归并排序的时间复杂度分析。第三章,对链表掌握还好,对其数据结构进行了分析,有循环链表,掌握的不是很好,对其中一些用法不熟练。第四章堆栈,本章堆栈算法思想较为简单,所以能较好掌握,但表达式计算问题未掌握好的。第五章的循环队列队空、队满的判断条件问题掌握的不是很好。第六章的重点是相关数据结构的存储结构及其基本运算算法。掌握了特殊矩阵的压缩存储结构,在该存储结构下元素的定位方法,理解了稀疏矩阵的计算和广义表的存储结构。第七章对二叉树掌握较好,其概念,存储,遍历有很好的掌握。就是对二叉排序树有点生疏,它的生成算法不是很会。第八章树树与二叉树之间的转换,森林与二叉树的转换算法思想基本掌握。第九章散列的一些知识,没有深入学习,大概了解了散列存储结构散列表,散列函数,冲突的处理方法。第十章了解了图的逆邻接表的存储结构,关键路径求解算法未能掌握好,不能灵活运用图的不同数据结构和遍历算法解决复杂的应用问题。

三、学习体会

通过学习数据结构与算法,让我对程序有了新的认识,也有了更深的理解。同时,也让我认识到,不管学习什么,概念是基础,所有的知识框架都是建立在基础概念之上的,所以,第一遍看课本要将概念熟记于心,然后构建知识框架。并且,对算法的学习是学习数据结构的关键。在第二遍看课本的过程中,要注重对算法的掌握。对于一个算法,读一遍可能能读懂,但不可能完全领会其中的思想。掌握一个算法,并不是说将算法背过,而是掌握算法的思想。我们需要的是耐心。每看一遍就会有这一遍的收获。读懂算法之后,自己再默写算法,写到不会的地方,看看课本想想自己为什么没有想到。对算法的应用上,学习算法的目的是利用算法解决实际问题。会写课本上已有的算法之后,可以借其思想进行扩展,逐步提高编程能力。

四、对课程教学的建议

1、感觉上课时的气氛不是很好,虽然大部分人都在听,可是效果不是很好。所以希望老师能在授课中间能穿插一些活跃课堂氛围的话题,可以是大家都非常关心的一些内容,这样既让大家能在思考之余有一个放松,也能够提高学生的学习积极性和学习效率。

2、学习的积极性很重要,有时候我们花了很长时间去写实验报告,也很认真的去理解去掌握,可是最后实验报告可能就只得了一个C,抄的人反而得A,这样的话很容易打击学生的积极性,在后面的实验报告中没动力再去认真写。所以希望老师能在这方面有所调整。

基于数据库的算法管理和选择 篇7

数据处理是对数字、文字、图像或声音等进行加工和分析的技术过程,数据处理技术贯穿于各个领域,对社会发展的进程有着极其深远的影响。随着数据处理技术的不断发展,大量的应用不同场合的算法应运而生。而随着应用场合的不断变化与发展,单一的算法已经无法满足普适性的要求。因此,在数据处理过程中,需要花费很大的精力去发展新的算法或修改原有的算法。数据处理经过长期的发展,在各个领域都涌现出了大量的算法,其中不乏经典算法;但不可否认的是,这些算法并不是完全不同的,它们往往是在一些经典算法的基础上做出一定修正后得到的,具有很大的相似性甚至可能完全相同。同时,每年都不断的有很多新的算法被提出。面对不同的需求,重新设计或修改算法总是能达到目的。当算法比较简单的时候,这项工作是比较简单的;但是当算法非常复杂时,这项工作往往需要花费大量的时间和精力。虽然各个领域里都有着大量的算法,但是这些算法缺乏统一有序的管理,一个必然的结果就是造成大量的重复设计工作;而随着算法数量的进一步增加,这一问题会更加严重,将造成极大的时间和人力浪费。

针对上述问题,本文提出了一种新的解决问题的思路。当掌握足够的算法时,绝大多数的需求是可以被满足的;而对于具有某些特定特征的数据是可以采用同一种算法得到比其它算法更加令人满意的处理结果。而如何有序地管理及建立基于大量数据的算法分析对比系统则成为亟待解决的问题,而数据库管理系统则解决了这一问题。数据库作为当今最有效的大型数据的组织管理方式,数据库管理系统则提供一种可以方便、高效地存取数据库信息的途径[1],因此建立基于数据库的高效算法管理及分析系统是可行的。

1 系统模型

本文提出的系统是一种基于数据库的算法管理及优化选择的系统,其底层核心是数据库,通过一系列的辅助模块与数据库间的通信完成数据的匹配、算法的选择、算法的调度以及数据的更新等。整个系统的工作如图1所示。

本文提出模型的整体工作思想为:当获取新的数据之后,通过对数据某些特征的提取使得数据得以量化描述;然后搜索数据库中的历史数据找到匹配数据;搜素对匹配数据进行处理的算法及其结果对比得到最优算法,此时即可认为该算法对新数据具有最优的处理效果,采用该算法对新数据进行处理即可而不必重新设计新的算法;最终更新数据库保存该数据、处理算法及处理结果。

为得到本文所提出的系统,设计了如图2的系统模型。

整个系统的底层核心是数据库,在数据库中存储着算法、关于算法的描述、数据的描述、实验组和(数据、算法及参数的组和)的描述、以及实验结果的描述等。

其中各个辅助模块的功能说明如下:

数据预处理:提取数据的某些特定参数(数据库中需要存储的用于数据描述的属性,如在一个简单的图像去噪模型中关于噪声的描述)。

数据匹配:依据确定的模型进行数据相似度的计算及匹配,数据匹配算法的确定依赖于应用层面(如在一个简单的图像去噪模型中可以将噪声的类型作为匹配依据)。

处理结果评价:该模块的标准依赖于具体的应用(如图像去噪中的信噪比、图像检测中的虚警与漏警、以及复杂应用中的一系列参数的加权组和等)。

算法选择:此模块根据匹配数据所有实验组和中结果的比较选出预期的最佳处理算法。

算法调度:根据算法选择模块所选出的实验组和调用算法对新数据进行处理。

处理结果:返回处理结果(可能还包含不同算法调用实验结果的比较)。

结果反馈:将处理结果反馈给数据库(可能包含对某些模块的调整,如数据匹配等)。

整个系统的模型及各模块的功能描述如上,当然要完成整个系统需要解决以下的一些问题与难点:

(1)数据的描述:在特定的应用中采用数据的那些特征来准确的描述数据是需要审慎确定的,这关系到数据的区别与匹配。

(2)数据的匹配:在特定的应用中确立如何的标准以决定不同的数据是相似的或不同的,这关系到算法的选取以及最终的实验结果。一个基本的思路是通过反复的实验提取影响实验结果的因子以及各因子的比重,根据这些因子的加权组和确立数据匹配的依据。越简单的应用数据的匹配越简单,复杂的应用由于要考虑到多方面的因素可能数据的匹配将是一件比较耗时的工作。

(3)处理结果的评价:如何评价处理结果关系到算法选取的依据,应该审慎的确立和验证。在不同的应用中评价的标准是不同的,甚至同一应用的不同场合其评价标准也是可能有差异的。如图像去噪有时仅考虑信噪比,有时却需要同时考虑到边缘效应等;在图像检测中也存在漏警和虚警之间的取舍问题。

2 系统实现

整个系统的实现依赖于底层数据库的设计实现以及各个模块的实现。要完成底层数据库的设计,首先需要确定如何数据描述、如何描述实验(数据、算法、参数的组和)以及如何描述实验结果(对一个实验需要将那些参数作为最终决定实验结果的元素)。

整个系统的实现可以分为两个阶段:数据累积阶段及规则建立阶段和系统验证及调整阶段。

(1)数据累积阶段及规则建立阶段主要工作是实验素材的收集、实验数据的累积以及实验数据的分析和整理。

①数据累积包括素材的收集、实验及记录两个步骤。

素材的收集:包括数据的收集以及算法的收集,在收集素材时需要注意如下问题:一是素材的代表性;二是素材的广度。简而言之,在收集算法和数据时可以有一定的针对性。在确定好系统针对的应用领域之后,可以根据该应用领域的实际情况收集各类具有代表性的算法,以及能体现这些算法差异性的数据。

实验及记录:在此阶段对算法(可能还包含各参数的不同组和)及数据的不同组和进行大量的实验并记录实验结果。

②数据的分析和整理通过对已经记录的实验组合进行分析,比较实验结果的差异,寻找造成结果差异的原因,提取描述数据、算法以及结果的初步方法,并根据实验结果确定评价结果的标准。同时,建立测试数据库,记录相关条目,初步确定各模块算法,初步建立可供测试的系统。

(2)系统验证及调整阶段,该阶段的工作如图3所示。

在此阶段可以分为两个步骤:

①验证、调整及最终模型确立:获取一些额外的数据,对已经建立起来的系统进行测试,利用测试系统选取的算法进行处理。同时,还需要对数据用其它算法进行处理,比较各算法处理得到的结果。并将比较结果反馈给测试系统,用于系统的调整(涉及的各个模块的调整)。通过反复的验证、调整不断的对系统进行优化,最终建立稳定可用的系统。

②系统的建立与测试:建立最终的数据库及各个模块,并投入使用。

3 系统可行性验证

为验证本文所提出的系统的可行性,选取图像去噪进行了一个简单的小实验,因此图像的描述以及结果的评价等方面都显得非常粗略,实际应用中应该综合考虑更多的因素。本文实验主要针对不同的噪声,选取了PSNR作为评价去噪效果的客观标准[2],即在本实验中认定噪声相同的图像为匹配图像,而最优算法为获得最大PSNR的算法,选取的算法主要有中值滤波[3]、均值滤波[4]、Wiener滤波[5]和小波变换[6]。经过取部分图片实验,得到结论如表1所示。

选取一幅新的图片实验,得到数据如表2所示,结果对比如图4所示。

从表2可以看出,最终实验结果与预期相同,即可以根据以往的实验数据得到最优的算法。

4 结束语

本文提出一种基于数据库的算法管理及最优算法的选择的思想,并阐述系统模型及系统实现的步骤,最后通过一个简单的实验验证所提思想的可行性及正确性。至于本文所提思想在更加复杂领域的应用还有待进一步的实验与验证。

参考文献

[1]希尔伯沙茨,等.数据库系统概念[M].机械出版社,2012:1.

[2]刘涛.小波域中的非局部平均去噪算法研究[D].西安电子科技大学,2010:13-15.

[3]龚声蓉,刘纯平,王强.数字图像处理与分析[M].北京:清华大学出版社,2006.

[4]冈萨雷斯,等.数字图像处理[M].电子工业出版社,2009:183-185.

[5]冈萨雷斯,等.数字图像处理(MATLAB版)[M].电子工业出版社,2009:126-128.

数据结构和算法 篇8

【摘 要】针对在数据结构与算法实验教学中如何提高学生的编程和算法设计能力,分析并指出了在实验教学中普遍存在的问题,结合实验课的教学改革,开发实验平台,以期有效激发学生的学习兴趣和积极性,培养动手和创新能力。

【关键词】数据结构与算法 实验改革 平台建设

【中图分类号】 G 【文献标识码】A

【文章编号】0450-9889(2014)07C-0132-03

数据结构与算法实验是计算机专业学生必修基础课数据结构与算法的配套实验课程,是培养学生程序设计技能必不可少的重要环节。其目标之一是培养学生能运用理论知识与算法技术分析解决实际问题,能运用高级程序设计语言编程实现算法。从近年实验情况来看,在上机编写程序实现具体算法时遇到的种种问题,效果不容乐观,学生很难按时完成实验所要求的内容。

一、实验教学存在的问题与分析

数据结构与算法实验是一门实践性很强的技术基础课,经过多年实验教学分析,发现普遍存在如下主要问题:

(一)课程抽象,实验难度大

数据结构具有一定的抽象性,学生面对抽象概念在学习过程中常会遇到困难,基本每本理论教材在呈现概念时都会受到多方面限制,比如篇幅的限制,省略了算法细节部分或只给出伪代码,由学生自己补充,学生需要将算法用程序设计方法实现,完成有一定难度和技巧的程序设计并上机调试运行。对编程基础稍微薄弱的学生来说,就会出现不小的困难。

(二)实验相关资料偏少

由于学生基础薄弱,实验前又没有更多的相关实验资料进行预习,仅靠看课本理论和实验时的几个学时难以完成实验所要求的任务,也就谈不上创新人才的培养。

(三)学生程序设计语言课程基础薄弱

数据结构与算法课程是第四学期开设,对于很多先修课程要求高,高级程序设计语言是大学生进校第一、二学期学习,第一学期学习过程序设计思想,第二学期学习面向对象程序设计思想,由于大部分同学高中没接触过计算机语言学习,对过程程序设计思想还没掌握透,第二学期的面向对象程序设计学习又开始,学习非常吃力;导致常用的一些语法结构,如指针和结构体等内容难于理解。而这些语法恰恰是程序设计语言教学时的难点,也正好是学生完成数据结构实验必须掌握的内容,这给部分学生学习带来了一定困难。

(四)编程语言难

数据结构与算法编程语言描述主要用到C++语言,并大量用到了指针、链表和结构体等运算,这部分内容正好是大多数学生掌握知识点薄弱的环节,导致学生很难用高级语言将教材中的算法描述出来,由于问题的堆积、实验的欠账,容易使学生丧失学习兴趣和信心,导致学生间抄袭程序或实验报告的现象。

(五)编程技巧差

普通学生在低年级只编写过功能单一、结构简单的程序;而从功能单一的简单程序向涉及算法和稍复杂程序的数据结构编写过渡学习时,需循序渐进的方式和细致的引导,紧密结合理论教学。学生一下从简单编程直接到复杂的程序设计,不仅不适应,且设计技巧性较差。

二、实验教学改革目标的提出

根据以上学生实验时出现的诸多问题,特提出该课程的实验改革目标:

一是紧密配合理论教学,通过相关实验,帮助学生加深对数据的逻辑结构、存储结构、算法思想和具体实现等各个环节的整体理解,强化学生“结构——算法——编程”三者密切相关的意识,让学生思考和发现利用数据结构解决实际应用问题的有效方法,从而使学生分析和解决问题的能力得到锻炼和提高。

二是因材施教,让原本不同水平和能力起点的学生通过数据结构实验,能力和水平都有所提高,并且有兴趣有信心学好数据结构课程。

三是培养学生多方面能力,比如团队精神,口头表达能力,对学生全方面发展起到较好的推动作用。

三、调整实验项目内容,使其更加符合学生的认知规律

数据结构与算法实验内容主要是编程实验,提高学生的实践编程能力,巩固和强化理论课的教学效果。为了保证和提高实验教学质量,加深对课堂知识的理解,培养学生动手能力和思维能力,尝试对数据结构与算法实验项目进行重新设计,主要内容有:

针对编程基础较薄弱的学生,我们开发了数据结构与算法实验教学平台,学生在该平台上可获知实验相关的更多内容,通过平台引导学生重点回顾程序设计语言的基础知识,特别是数组和指针等有关操作。通过这些辅助手段,使学生对将要编写程序的一些语法和程序规则有所复习和掌握。还可通过平台对实验原理的动画演示,得到帮助和启发,从而更好更快地完成实验内容。

每个实验内容以章节为单位安排,依据实验教学目的,针对计算机相关专业所要达到的不同实验教学目标,以及考虑学生个体差异,每个实验项目都设置基础必做题和附加选做题两部分内容。这两类实验都需要紧密结合理论教学。必做题相对简单,目的在于帮助学生掌握基础知识。对于该部分题目,学生容易完成,能提高学生学习积极性并增强学习信心;选做题针对学有余力的学生,各个实验项目中的必做题均设计详细的实验准备内容,用于引导学生更好地进行实验前预习准备工作;主要在于培养和鼓励学生的学习兴趣和扩大知识面,进一步培养学生应用能力和创新意识,保证基础弱的同学学习兴趣,也提高了编程能力强的同学动手能力。例如,与线性表一章理论教学相配合的实验项目是多项式加减法,这个实验是对线性链表的建立、插入、删除、遍历等进行综合运算,对数据结构与算法第一实验内容来说稍有难度,可作为选作题或增加实验学时。在与栈一章理论教学相配合的实验项目是迷宫,这部分实验内容要求掌握回溯法和栈的基本运算等知识,有一定难度;用括号匹配作为必做题,能培养学生独立钻研,有助于学生解决问题能力的训练。

四、实验教学方法探究

实验前学生必须先预习和熟悉实验教学平台,了解实验内容的目的和要求,理解算法,描述语言的语法,查看相关资料,写预习报告。

通过多年实验教学中实验完成情况分析,软件工程专业的学生语言掌握较好,大部分学生能按时完成实验项目,其它专业的学生实验完成情况较差;由此,实验编程语言可以因学生而异,除软件工程专业的学生采用面向对象程序设计C++外,其它专业主要采用C语言描述,并且可增加前期语言学习时间。只有编程语言掌握扎实,数据结构与算法实验才能很好地完成。

开发数据结构与算法实验网络教学平台系统,该平台主要包含有课程介绍、在线课程、互动学习、下载资料等模块。有针对性地对每一个实验项目进行详细讲解和实验原理分析的动画演示,将抽象的数据结构问题制作为教学动画,借助形象的案例理解抽象的概念。教学内容利用Web页面为基本元素出现在站点中,学生通过访问站点来进行交互式学习。以辅助学生自主学习为主要目的,解决学生实验时无从下手的局面,启发学生思维,促进学生程序设计能力的提高。平台系统流程图如图1所示。

在线课程是教学平台核心部分,也是学生对数据结构与算法实验加深理解的重要环节,该平台从实验预习,到实验原理算法的演示,再通过在线课堂的视频教学、在线测试题训练及各种原理进行拓展教学。为了方便学生学习较抽象的数据结构与算法,能顺利进行程序编写,该教学平台还包含有18个flash动画用于原理算法演示,主要包括栈和队列、线性表、递归、查找与排序、树、图等内容,每个flash动画都有实验原理及主要代码实现过程,能更加形象展示数据结构的原理。例如:栈是一种先进后出的数据结构,在对栈原理进行动画设计时,根据用数组实现栈的特点,采取对栈先进行初始化的代码模块来对栈进行初始化,之后运行相应代码模块观察压栈出栈过程,同时还能观察到栈中数据的变化。在大部分flash动画演示过程中,flash页面左侧是代码部分,能体现当前执行的代码,并与右侧的动画演示及讲解分析一一对应。演示过程中如用户需要重新开始,还可点击“重新开始”按钮。这些flash动画演示将代码与动画有机的结合在一起,将抽象的代码转换为有形的动画,大大方便学生学习和对实验内容的理解。

如对栈原理进行动画演示的flash点击界面中压栈代码动画效果,该动画效果包括等待入栈的数字入栈的动画效果和位于等待区域的数字前移的动画效果。等待入栈的数字、入栈的动画效果和位于等待区域的数字前移的动画效果如图3所示。

图3 压栈的动画效果图

该平台互动学习是一个教师和学生互动的场所,实现动态交互的功能,教师能添加、更改、删除各种资源,学生、教师可以查看各种资源库里的资源。同时,学生可从平台上下载练习题和测试练习题资料,练习题有主要算法描述,可帮助学生进一步理解每个章节的算法原理,测试练习题有自动报错功能。

五、改革数据结构实验考核方式

让学生对以前所做实验作一个分析和总结。具体操作方案如下:首先将学生自由分组,小组成员共同从以前做过的实验项目选做题中选择一个进行程序的分析设计和编码实现,要求考虑程序的编写规范,程序的执行效率等方面。考核时,由实验教师从该小组随机抽取学生到讲台进行讲解和演示,根据程序完成情况和学生演示情况,决定该小组成员的平均得分,而每位学生的具体得分由小组成员内部根据该学生在该程序实现中的工作情况决定。通过这种方式,能培养学生的团队意识,达到互学互助的效果,同时也锻炼了学生的表达能力。

数据结构与算法实验环节教学改革的创新之处在于依托一门编程语言以及所开发的实验教学平台,因材施教,根据不同专业实际情况,综合考虑进行实验项目、实验内容和实验准备的合理设置,帮助学生在实验课上找到自己的最好学习方式,提高实验教学质量。

【参考文献】

[1]吴兵.高校计算机文化基础课程网络学习题库的研发[J].实验技术与管理,2011(2)

[2]朱洪浩.数据结构课程“工程化”实践教学模式研究[J].赤峰学院学报(自然科学),2013(15)

[3]马晓波,王翠茹.《数据结构》实践教学改革探讨[J].内蒙古农业大学学报(社会科学版),2010(02)

[4]赵耀红,孙宇.数据结构实验教学的实践与探索[J].长春大学学报,2012(04)

上一篇:采面过地质构造带措施下一篇:初三化学月考总结