当前位置:文档之家› 数据结构与算法实验学期总结

数据结构与算法实验学期总结

数据结构与算法实验学期总结
数据结构与算法实验学期总结

数据结构与算法实验学期总结

我的数据结构

班级:09计本一班学号:2009810020 姓名:吴伟

摘要

数据结构实验的目的是为了加深对课堂知识的理解,培养实验者的动手能力和思维能力。实验中,能体会到了算法和源程序之间的区别,理解到要实现算法要做的事情,解决编写源程序时遇到的各类问题。

关键字:算法、源程序、算法实现、解决问题

一、数据结构与算法课程实验的主要意义的目的

数据结构课程的实践性很强,许多内容如果只进行单纯的课堂讲授是根本不能够深刻认识的。例如,第二章线性表的多种存储结构的对比分析,如不上机练习,就只能靠自己背,但这样就不能有更直观、形象的认识了。因此,实验是数据结构课程的一个重要环节。

首先,在实验的过程中,可以会体会到源程序与算法的区别。

算法是一种算法描述语言。它不是一种现实存在的编程语言。使用算法的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal, C, Java, etc)实现。它可能综合使用多种编程语言中语法、保留字,甚至会用到自然语言。因此,算法必须结构清晰,代码简单,可读性好,并且类似自然语言。

源程序(source code)是指未编译的按照一定的程序设计语言规范书写的,一系列人类可读的计算机语言指令。其实现起来,有时并不像算法那样看起来那么简单。例如,希尔排序的算法:

void ShellSort(SSTable &L, int dlta[], int t) {

// 按增量序列dlta[0...t-1]对顺序表L做希尔排序

for (int k=0; k

ShellInsert(L, dlta[k]); // 一趟增量为dlta[k]的插入排序

} // ShellSort

看到该算法,基本都会明白:对L执行t次ShellInsert(L,dlat[k])操作就能完成希尔排序。然而,要真正的实现该功能,必须有完整的代码:

bool LT(char a,char b){

return a

}

// 重建静态查找表为按关键字非降序排序。

void ShellInsert(SSTable &L, int dk) {

int i,j;

for (i=dk+1; i<=L.length; ++i)

if (LT(L.elem[i].key, L.elem[i-dk].key)) { // 需将L.r[i]插入有序增量子表

L.elem[0] = L.elem[i]; // 暂存在L.r[0] for (j=i-dk; j>0 && LT(L.elem[0].key, L.elem[j].key); j-=dk)

L.elem[j+dk] = L.elem[j]; // 记录后移,查找插入位置

L.elem[j+dk] = L.elem[0]; // 插入

}

} // ShellIn

void ShellSort(SSTable &L, int dlta[], int t) {

for (int k=0; k

ShellInsert(L, dlta[k]); // 一趟增量为dlta[k]的插入排序

} // ShellSort

所以,算法只用来说明复杂的问题,并不一定可以执行。

再次,实验会增强你的算法实现能力,锻炼你的思维和解决问题的能力。

在我们的数据结构课上,能学到的都是各种功能算法,没有源代码。所以,如果要做实验,你就必须思考,想各种方法来实现算法。在此过程中需要解决各类问题,使源代码尽可能正确的达到算法的思想。

实验中,算法的实现会让我更容易的记住所学的知识,用一个开玩笑的引用:“一朝被蛇咬,十年怕井绳”。

二、概述本学期的实验内容和目的

实验一

实验名称:

《对比算法的时空效率》

实验目的及要求:

1.熟悉开发工具的编程环境。

2.熟悉算法语言并完成简单的算法。

3.熟悉C语言的语法,将算法上机编程实现。

4.区别算法和源程序。

5.体会用不同算法解决同一个问题,体会存储结构不同对实现算法的影

响。

6.学习对算法进行时空分析的基本方法。

7.了解评价一个算法的基本准则。

实验主要内容:

试编写求k阶(k>=2)裴波那契序列的第m项值的不同算法,并编程

实现。k和m均以值调用的形式在函数参数中表现。要求:至少用两种不

同的算法(如,递推、递归等等)。

实验中涉及的主要实验原理:

k=1时,

fac(0)=0,fac(1)=1

fac(n)=fac(n-1)+fac(n-2) n=2,3,4,5......

k=2时,

fac(0)=0,fac(1)=0,fac(2)=1

fac(n)=fac(n-1)+fac(n-2) n=3,4,5,6......

......

概要设计和存储结构:

首先向内存申请大小为k+1的空间,第0号空间用来做辅存。第k号空间放1,其他放0。然后按照斐波那契序列的计算方法计算下一项,再把整个数组左移,最后把计算出来的数放在最大位。一直循环直到算出你要的答案。

存储结构为:一维数组(int *a=new int[k+1];)

主要算法:

void fac(int k,int m,int a[]){

//k是斐波那契序列的阶数,m是要输出的项数,a是进行排列操作的数组

int *a=new int[k+1];

for(i=0;i<=k;i++)

a[i]=0;

a[k]=1;

//进行阶斐波那契序列的输出,如果要输出的项m不大于阶数k,则直接

//输出数组的第m+1项

if(m<=k)

fac(m)=a[m];

else{ //如果项大于阶数,则先进行递推计算,再输出

for(int l=1;l<=m-k;l++){ //因为序列的前k项已经给出,所以要输出第m项只用循环m-k次for(i=0;i

a[i]=a[i+1];

}

for(t=0,j=0;j

t+=a[j];

fac(m)=t;

}

}

}

实验结果和结论:

根据2斐波那契序列的推导公式:

fac(0)=0,fac(1)=1,fac(2)=1,fac(3)=2,fac(4)=3,......

则上面的结果正确。

同理,该结果也正确。

根据5斐波那契序列的推导公式:

fac(0)=0,fac(1)=0,fac(2)=0,fac(3)=0,fac(4)=1,fac(5)=1,fac(6)=2,fac(7) =4,......

由此,上面结果正确。

实验分析:

我的算法用的是顺序存储结构,并采用递推的计算法。我感觉好处是,

代码不算太多,不是太累赘;坏处是,for循环比较多,容易混淆。

一开始,程序能运行,但输出的数不对,经过查找发现是第四个for

语句中的t做完一次后没有初始化(开始的程序t是在定义时初始化的)。

接着,再运行,发现输出错位,经检查,第二个for循环次数不对,应该

是m-k次,开始是m次,改过之后输出正确。

虽然,该算法有的地方做的还算可以,但是现在看来在实验的其他方

面做的不是很好,还有待改进,例如:没有考虑到斐波那契序列数据的数据类型,我用的是int这样要输出很大项的时候,int型的数据不够。

实验二

实验名称:

《线性表》

实验目的及要求:

熟悉如何使用单链表,掌握单链表的基本操作,巩固对单链表知识的认识。

实验主要内容:

约瑟夫环。假设有n个编号为1,2,3,…,n的人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,并将其密码值作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,以此类推下去,直到所有的人全部出列为止。试设计一个程序,可以在用户确定了人数和密码的情况下,求出对应的出列顺序。

实验中涉及的主要实验原理:

有n个编号为1,2,3,…,n的人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,并将其密码值作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,以此类推下去,直到所有的人全部出列为止。

概要设计和存储结构:

该算法的实现用循环链表:

struct LNode{

int data1; //data1存储参加游戏者的编号

int data2; //data2存储参加游戏者的密码

struct LNode *next; //next为结点指针

};

主要算法:

void BuildGame(LinkList &L,int m,int k){//执行游戏规则p=(LinkList)malloc(sizeof(LNode));

p->next=L;

for(i=0;i

for(j=1;j

p=p->next; //并将他的密码作为下一个m值,依次循环,直到游戏结束

r=p->next;

cout<data1<<' ';

m=r->data2;

p->next=r->next;

p=r;

}

}

实验结果和结论:

根据约瑟夫环的游戏规则,上述三个结果都正确。

实验分析:

算法用到的是循环链表。在进行链表数据输入的时候由于有两个数据,所以要循环两次,这样辅助指针就比较多,后面执行游戏规则的函数里也用到了比较多的辅助指针,用起来比较复杂,这个算法我感觉在这方面不太好,容易搞混淆。

但是,当时能做到这里我感觉已经不错了。

实验三

实验名称:

《栈和队》

实验目的及要求:

熟悉对栈和队的应用,熟悉其基本操作。增强自己的动手能力和实验能力。

实验主要内容:

输入一个十进制数(整数和小数)和进制数,要求程序输出转换后的数。例如,输入5,再输入进制数为2,则应该输出101。

实验中涉及的主要实验原理:

十进制数和其他进制数之间的转换。整数部分为除进制数(如除2)取余最后逆置,小数部分为乘进制数取整,最后顺序放置。

概要设计和存储结构:

本算法用了栈和队两类存储结构。其中,栈:

typedef struct {

int *base;

int *top;

int size;

}sqstack;

用来存储整数部分;队:

struct QNode{

double data;

struct QNode *next;};

typedef QNode *QueuePtr;

typedef struct{

QueuePtr front;

QueuePtr rear;

}Linkqueue;

用来存储小数部分。

主要算法:

Status jzzh(sqstack &s,Linkqueue &Q, SElemType m, SElemType n){

//进制转换,包含整数部分和小数部分的转换

while(m1!=0){

// m1=int(m-modf(m,&p))

push(s,m1%n);

m1=m1/n;

}

while(modf(m,&p)){

m=modf(m,&p)*n;

enqueue(Q,m-modf(m,&p));

}

return OK;

}

实验四

实验名称:

《二叉树》

实验目的及要求:

熟悉对二叉树的应用,熟悉其各种遍历的基本规则,了解树的创建的基本原理。增强自己的动手能力和实验能力。

实验主要内容:

创建一颗二叉树,对其进行先序、中序、后序遍历以及其他操作。

概要设计和存储结构:

typedef struct BiTNode{

TElemType data; //数据域

struct BiTNode *lchild,*rchild;//指向左右孩子的指针lchild,rchild }BiTNode,*BiTr

主要算法:

Status PreOrderTraverse(BiTree T){ //先序遍历if(T){ //判断二叉树是否为空cout<data; //访问Data

PreOrderTraverse(T->lchild); //递归遍历左子树

PreOrderTraverse(T->rchild); //递归遍历右子树}

return OK;

}

Status InOrderTraverse(BiTree T){ //中序遍历if(T){ //判断二叉树是否为空InOrderTraverse(T->lchild); //递归遍历左子树

cout<data;

InOrderTraverse(T->rchild); //递归遍历右子树}

return OK;

}

Status PostOrderTraverse(BiTree T){ //后序遍历if(T){ //非空二叉树

PostOrderTraverse(T->lchild); //递归遍历左子树

PostOrderTraverse(T->rchild); //递归遍历右子树

cout<data;

}

return OK;

}

int CountNode (BiTree T){ //统计结点总数

if(T)

return1+CountNode (T->lchild)+CountNode (T->rchild);//递归遍历左右子树,每过一个结点

else//加,最后加上根结点

return 0;

}

int CountLeaf (BiTree T){ //统计叶子总数

if (T){

if (!T->lchild && !T->rchild)

return 1;

else

return CountLeaf(T->lchild) + CountLeaf(T->rchild);

}

else

return 0;

}

Status Exchange(BiTree &T){ //交换左右子树

if(T){

temp=T->lchild;

T->lchild=T->rchild;

T->rchild=temp;

if(T->lchild)

Exchange(T->lchild);

if(T->rchild)

Exchange(T->rchild);

}

return OK;

}

实验结果和结论:

由于在该程序中,加了一个可选择菜单,因此,该程序的执行是一直

连续的,如上图,执行顺序是从左到右,从上到下。

首先,先序创建二叉树为:ABC $$D $$EF $G $$$($代表空格),由于是先序

创建,所以先序遍历的结果也是ABCDEFG ,因此第一个结果正确;打一键继续后选择后序遍历,如图所示二叉树,后序遍历的结果为CDBGFEA,因此第二个结果正确;由输入的字母数可知第三个结果也是正确的;后面两个结果都是判断输入的合法性,并且都判断正确。

A

B E

C D F

G

实验分析:

本次所做的实验难度不是很高,同时我认为该实验的创建二叉树算法

并不是很好,因为只有保证输入空格的数量和位置绝对正确才能保证创建

函数的结束,否则将无法继续。而且这里无法判断输入的合法性。

实验五

实验名称:

《查找和排序》

实验目的及要求:

学习和掌握排序和查找这两个计算机程序设计中的重要操作。加强自

己的动手能力和错误分析能力。

实验主要内容:

选择一种查找和排序算法,实现查找造和排序。

概要设计和存储结构:

本程序中用到了顺序表存储结构和儿茶链表存储结构,两种结构的作用为:

顺序表用来存储顺序查找表;二叉链表用来存储次优查找树。

// 顺序表的顺序存储表示

typedef struct{

char key;

int weight;

}ElemType;

typedef struct{

ElemType *elem;

int length;

}SSTable;

// 二叉树的二叉链表存储表示

typedef struct BiTNode{

ElemType data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

主要算法:

// 重建静态查找表为按关键字非降序排序。

void ShellInsert(SSTable &L, int dk) {

for (i=dk+1; i<=L.length; ++i)

if (LT(L.elem[i].key, L.elem[i-dk].key)) { // 需将L.r[i]插入有序增量子表

L.elem[0] = L.elem[i]; // 暂存在L.r[0] for (j=i-dk; j>0 && LT(L.elem[0].key, L.elem[j].key); j-=dk) L.elem[j+dk] = L.elem[j]; // 记录后移,查找插入位置

L.elem[j+dk] = L.elem[0]; // 插入

}

} // ShellIn

// 由有序表R[low..high]及其累计权值表sw(其中sw[0]==0)递归构造

// 次优查找树T。

int SecondOptimal(BiTree &T,ElemType R[],int sw[],int low,int high){ min=abs(sw[high]-sw[low]); //fabs函数是求绝对值的

dw=sw[high]+sw[low-1];

for(j=low+1;j<=high;++j) // 选择最小的△Pi值

if(fabs(dw-sw[j]-sw[j-1])

i=j;

min=fabs(dw-sw[j]-sw[j-1]);

}

T=(BiTree)malloc(sizeof(BiTNode));

if(!T)

return 0;

T->data = R[i]; // 生成结点

if(i==low)

T->lchild=NULL; // 左子树空

else

SecondOptimal(T->lchild,R,sw,low,i-1); // 构造左子树if(i==high)

T->rchild=NULL; // 右子树空

else

SecondOptimal(T->rchild,R,sw,i+1,high); // 构造右子树return 1;

}

// 在次优查找树T中查找关键字等于key的元素。找到则返回,否则返回

int Search_SOSTree(SOSTree &T,char key){

while(T) // T非空

if(T->data.key==key)

return 1;

else if(T->data.key>key)

T=T->lchild;

else

T=T->rchild;

return 0; // 顺序表中不存在待查元素

}

实验结果和结论:

测试方案:随机输入查找表,权值有随机函数产生。则随后将输出查

找表的非降序排列。接着输入要查找的关键字,接着应该输出和该关键字

相匹配的权值;如果该表中没有要查找的关键字则应该报错。

根据测试方案,该结果正确。

该结果和测试方案一致。

该结果正确。

实验分析:

该选题相对比较容易,因此实现起来感觉不是很困难。由于至此已经做过很多实验,实验经验已经积累不少,所以本次实验过程中没有出现很大错误。

三、总结

该学期的五个实验我都圆满完成了,虽然有的实验拖得时间较长,但总体结果我自己还是比较满意的。

在这么多次试验中遇到的最主要问题是有的时候不能很好的把算法的思想很好融合到源程序中。这类问题的解决只有一遍一遍的实验才能解决,因为只有在实验中才能体会到源程序的欠缺。

在本学期的这些实验中,最合理的是可以选题,这就意味着实验难度对于每个人来说都适中,因为对于每一类实验,总会有能做的。大体来说,我对实验有点小小的建议,就是实验时间问题。本学期的实验时间没有限制,这对我们学生的独立思考不利,我认为想法是逼出来的,如果给太多时间,会让同学们产生这种想法:今天这个问题就是想不明白,哎,算了,明天再想吧,反正还有时间。有的同学,甚至会这样想:等吧,等他们会做的人做好了,我再看看他们怎么做

的,这样最不好,尽管有的人会很认真的看别人写的东西,但终究没有自己想出来的好。所以我认为如果时间留得相对较少,就会让他们不得不自己想想该怎么写这个程序。

四、附录

参考资料:《数据结构(C语言版)》、《数据结构实验与算法》

数据结构与算法设计实验

《数据结构与算法设计》 实验报告 ——实验二 学院:自动化学院 班级: 学号: : 一、实验目的

按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。 二、实验容 简单计算器。 请按照四则运算加、减、乘、除、幂(^)和括号的优先关系和惯例,编写计算器程序。要求: ①从键盘输入一个完整的表达式,以回车作为表达式输入结束的标志。 ②输入表达式中的数值均为大于等于零的整数。中间的计算过程如果出现小数也只取 整。 例如,输入:4+2*5= 输出:14 输入:(4+2)*(2-10)= 输出:-48 三、程序设计 概要设计 1、宏定义 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 2、基本函数: (1)void InitStack_char(SqStack *S) //char型栈初始化 (2)void InitStack_int(sqStack *S) //int型栈初始化 (3)void Push_char(SqStack *S,char ch) //char型元素进栈 (4)void Push_int(sqStack *S,int num) //int型元素进栈 (5)char GetTop_char(SqStack *S) //取char型栈顶元素 (6)int GetTop_int(sqStack *S) //取int型栈顶元素 (7)Status In(char c) //判断是否为运算符,若是运算符则返回,否则返回 (8)char Precede(char a,char b) //判断两运算符的先后次序 (9)Status Pop_char(SqStack *S,char &x) //char型栈出栈 (10)Status Pop_int(sqStack *S,int &x) //int型栈出栈 (11)int Operate(int a,char theta,int b) //计算a和b运算结果 3、流程图

数据结构与算法基础知识总结

数据结构与算法基础知识总结 1 算法 算法:是指解题方案的准确而完整的描述。 算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。 算法的基本特征:是一组严谨地定义运算顺序的规则,每一个规则都是有效的,是明确的,此顺序将在有限的次数下终止。特征包括: (1)可行性; (2)确定性,算法中每一步骤都必须有明确定义,不充许有模棱两可的解释,不允许有多义性; (3)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止,包括合理的执行时间的含义; (4)拥有足够的情报。 算法的基本要素:一是对数据对象的运算和操作;二是算法的控制结构。 指令系统:一个计算机系统能执行的所有指令的集合。 基本运算和操作包括:算术运算、逻辑运算、关系运算、数据传输。 算法的控制结构:顺序结构、选择结构、循环结构。 算法基本设计方法:列举法、归纳法、递推、递归、减斗递推技术、回溯法。 算法复杂度:算法时间复杂度和算法空间复杂度。 算法时间复杂度是指执行算法所需要的计算工作量。 算法空间复杂度是指执行这个算法所需要的内存空间。 2 数据结构的基本基本概念 数据结构研究的三个方面: (1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构; (2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构;(3)对各种数据结构进行的运算。 数据结构是指相互有关联的数据元素的集合。 数据的逻辑结构包含: (1)表示数据元素的信息; (2)表示各数据元素之间的前后件关系。 数据的存储结构有顺序、链接、索引等。 线性结构条件:

(1)有且只有一个根结点; (2)每一个结点最多有一个前件,也最多有一个后件。 非线性结构:不满足线性结构条件的数据结构。 3 线性表及其顺序存储结构 线性表由一组数据元素构成,数据元素的位置只取决于自己的序号,元素之间的相对位置是线性的。 在复杂线性表中,由若干项数据元素组成的数据元素称为记录,而由多个记录构成的线性表又称为文件。 非空线性表的结构特征: (1)且只有一个根结点a1,它无前件; (2)有且只有一个终端结点an,它无后件; (3)除根结点与终端结点外,其他所有结点有且只有一个前件,也有且只有一个后件。结点个数n称为线性表的长度,当n=0时,称为空表。 线性表的顺序存储结构具有以下两个基本特点: (1)线性表中所有元素的所占的存储空间是连续的; (2)线性表中各数据元素在存储空间中是按逻辑顺序依次存放的。 ai的存储地址为:adr(ai)=adr(a1)+(i-1)k,,adr(a1)为第一个元素的地址,k代表每个元素占的字节数。 顺序表的运算:插入、删除。(详见14--16页) 4 栈和队列 栈是限定在一端进行插入与删除的线性表,允许插入与删除的一端称为栈顶,不允许插入与删除的另一端称为栈底。 栈按照“先进后出”(filo)或“后进先出”(lifo)组织数据,栈具有记忆作用。用top表示栈顶位置,用bottom表示栈底。 栈的基本运算:(1)插入元素称为入栈运算;(2)删除元素称为退栈运算;(3)读栈顶元素是将栈顶元素赋给一个指定的变量,此时指针无变化。 队列是指允许在一端(队尾)进入插入,而在另一端(队头)进行删除的线性表。rear指针指向队尾,front指针指向队头。 队列是“先进行出”(fifo)或“后进后出”(lilo)的线性表。 队列运算包括(1)入队运算:从队尾插入一个元素;(2)退队运算:从队头删除一个元素。循环队列:s=0表示队列空,s=1且front=rear表示队列满

数据结构与算法C语言版期末复习题

《数据结构与算法》期末复习题 一、选择题。 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构B.紧凑结构和非紧凑结构 C.线性结构和非线性结构D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构B.数据结构C.数据的逻辑结构D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑B.存储C.逻辑和存储D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。 A.数据的处理方法B.数据元素的类型 C.数据元素之间的关系D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位 C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。 (1)A.找出数据结构的合理性B.研究算法中的输入和输出的关系C.分析算法的效率以求改进C.分析算法的易读性和文档性 (2)A.空间复杂度和时间复杂度B.正确性和简明性 C.可读性和文档性D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是O(n2) 。 s =0; for( I =0; i

数据结构 习题 第一章 绪论

第1章绪论 一、选择题 1. 算法的计算量的大小称为计算的()。 A.效率 B. 复杂性 C. 现实性 D. 难度 2. 算法的时间复杂度取决于() A.问题的规模 B. 待处理数据的初态 C. A和B 3.计算机算法指的是(1),它必须具备(2)这三个特性。 (1) A.计算方法 B. 排序方法 C. 解决问题的步骤序列 D. 调度方法 (2) A.可执行性、可移植性、可扩充性 B. 可执行性、确定性、有穷性 C. 确定性、有穷性、稳定性 D. 易读性、稳定性、安全性 4.一个算法应该是() A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C. 5. 下面关于算法说法错误的是() A.算法最终必须由计算机程序实现 B.为解决某问题的算法同为该问题编写的程序含义是相同的 C. 算法的可行性是指指令不能有二义性 D. 以上几个都是错误的 6. 下面说法错误的是()【南京理工大学 2000 一、2 (1.5分)】 (1)算法原地工作的含义是指不需要任何额外的辅助空间 (2)在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法 (3)所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界 (4)同一个算法,实现语言的级别越高,执行效率就越低 A.(1) B.(1),(2) C.(1),(4) D.(3) 7.从逻辑上可以把数据结构分为()两大类。【武汉交通科技大学 1996 一、4(2分)】A.动态结构、静态结构 B.顺序结构、链式结构 C.线性结构、非线性结构 D.初等结构、构造型结构 8.以下与数据的存储结构无关的术语是()。【北方交通大学 2000 二、1(2分)】A.循环队列 B. 链表 C. 哈希表 D. 栈 9.以下数据结构中,哪一个是线性结构()?【北方交通大学 2001 一、1(2分)】A.广义表 B. 二叉树 C. 稀疏矩阵 D. 串 10.以下那一个术语与数据的存储结构无关?()【北方交通大学 2001 一、2(2分)】A.栈 B. 哈希表 C. 线索树 D. 双向链表 11.在下面的程序段中,对x的赋值语句的频度为()【北京工商大学 2001 一、10(3分)】 FOR i:=1 TO n DO FOR j:=1 TO n DO x:=x+1; A. O(2n) B.O(n) C.O(n2) D.O(log2n) 12.程序段 FOR i:=n-1 DOWNTO 1 DO FOR j:=1 TO i DO IF A[j]>A[j+1] THEN A[j]与A[j+1]对换; 其中 n为正整数,则最后一行的语句频度在最坏情况下是()

力 扣 数 据 结 构 与 算 法

前端如何搞定数据结构与算法(先导篇) 「观感度:?」 「口味:锅包肉」 「烹饪时间:20min」 本文已收录在Github? 为什么要学习数据结构与算法? 在0202年的今天,由于每天被无数的信息轰炸,大多数人已经变得越来越浮躁了,并且丧失了独立思考的能力。 你可能会经常听到这样的感慨: 技术人究竟能走多远?我遇到了天花板 35岁的程序员要如何面对中年危机? 技术更新太快,好累,学不动了 然后,你也变得焦虑起来。那你有没有静下心来想过,如何才能抵御年龄增长并且使自己增值呢? 无非是终身学习,持续修炼自己的内功。内功也就是基础知识和核心概念,这些轰轰烈烈发展的技术本质,其实都是基础知识,也就是我们在大学里学过的基础课-程。 操作系统 计算机组成原理 计算机网络 编译原理

设计模式 数据结构与算法 这也就是为什么越靠谱的面试官越注重你基础知识的掌握程度,为什么越牛的的企业越重视你的算法能力。因为当你拥有了这些,你已经比大多数人优秀了。你的天花板由你自己来决定,大家口中的中年危机可能并不会成为你的危机。新技术来临时,你对它的本质会看得更加透彻,学起来会一通百通。这样的人才,公司培养你也会花费更少的成本。 (不过,一辈子做个开开心心的 CRUD Boy 也是一种选择。) 数据结构与算法之间的关系 Rob Pikes 5 Rules of Programming中的第五条是这样说的: Data dominates. If youve chosen the right data structures and organized things well, the algorithms will almost always be self-evident. Data structures, not algorithms, are central to programming. 数据占主导。如果您选择了正确的数据结构并组织得当,那么这些算法几乎总是不言而喻的。数据结构而非算法是编程的核心。 瑞士计算机科学家,Algol W,Modula,Oberon 和 Pascal 语言的设计师 Niklaus Emil Wirth 写过一本非常经典的书《Algorithms + Data Structures = Programs》,即算法 + 数据结构 = 程序。 我们可以得出结论,数据结构与算法之间是相辅相成的关系。数据结构服务于算法,算法作用于特定的数据结构之上。 数据结构与算法好难,怎么学?

计算机学院数据结构与算法分析期末试题(2007级B)_无答案

四川大学期末考试试题 (2008-2009学年第1学期) 课程号:课程名称:数据结构与算法分析(B卷)任课教师: 1.数据类型为()。 A)数据项的集合B)值的集合及定义在其上的一组操作的总称 C)数据元素的集合D)关键字的集合 2.链表不具有的特点是()。 A)可随机直接访问任一元素B)插入删除不需要移动元素 C)不必事先估计元素个数D)所需空间与线性表长度成正比 3.设一个栈的入栈序列是ABCD,则借助于一个栈所得到的出栈序列不可能是()。 A)ABCD B)DCBA C)ABCD D)DABC 4.将对称矩阵A nxn压缩存储在一维数组B[m]中,则m的值至少为()。 A)n(n+1)/2 B)n(n-1)/2 C)n(n+1) D)n2 5.设二叉树中有n2个度为2的结点,n1个度为1的结点,n0个叶子结点,则此二叉树中空指针域个数为()。 A)n0+n1+n2 B)n2+n1+2n0 C)2n2+n1D)2n0+n1 6.对于具有n个顶点的强连图,其弧条数的最小值为()。 A)n+1 B)n C)n-1 D)n-2 7.一棵深度为k的平衡二叉树,其每个非终端结点的平衡因子均为0,则该树共有()个结点。 A)2k-1-1 B)2k-1C)2k-1+1 D)2k-1 8.归并排序的时间复杂度是()。 A)O(1) B)O(n) C)O(n2) D)O(nlogn) 9.每一趟都能选出一个元素放在其最终位置上,并且不稳定的排序算法是()。 A)冒泡排序B)简单选择排序C)希尔排序D)直接插入排序10.按照二叉树的定义,具有3个结点的不同形态(相似)的二叉树有()种。 A)3 B)4 C)5 D)6 二、(本题10分) 利用两个栈S1、S2模拟一个队列(如客户队列)时,如何用栈的运算实现队列的插入、删除运算,请简述算法思想。 三、(本题10分) 已知一棵二叉树的先序序列与中序序列分别如下,试画出此二叉树。 先序序列:ABCDEFGH IJ 中序序列:CBEDAGHFJI 注:试题字迹务必清晰,书写工整。本题2页,本页为第1页 教务处试题编号:

数据结构学习总结

数据结构与算法课程学习总结 2010年 5月 17日 班级:08计本(2)班姓名:谷敏敏学号:0804012023 时光飞逝,转眼之间,经过十几周的学习,“数据结构与算法”这门课程也已经接近尾声。通过学习、实验,我们明白“数据结构与算法”这门课是我们计算机专业人才培养计划中的一门必修的核心课程,同时也是计算机科学与技术专业同学的一门重要的基础专业课,重要之处不言而喻,所以,对于这门课大家也是比较认真投入的,学的也是比较尽心。当然这还与老师独特的教学风格以及不少的实验训练是密不可分的。 对于本学科的知识内容的概括、总结可如下所示: 1.第一章中是介绍的本学科的的一些基础、相关概念,如数据、数据元素、数据类型 以及数据结构的定义。其中,数据结构包括逻辑结构、存储结构和运算集合。逻辑 结构分为四类:集合型、线性、树形和图形结构,数据元素的存储结构分为:顺序 存储、链接存储、索引存储和散列存储四类。紧接着介绍了一些常用的数据运算。 最后着重介绍算法性能分析,包括算法的时间性能分析以及算法的空间性能分析。 2.第二章具体地介绍了顺序表的概念、基本运算及其应用。基本运算有:初始化表、 求表长、排序、元素的查找、插入及删除等。而关于元素查找方法课本例举了多种 方法,有:简单顺序查找、二分查找和分块查找。排序方法有:直接插入排序、希 尔排序、冒泡排序、快速排序、直接选择排序及归并排序等。最后介绍了顺序串的 概念以及字符处理问题,其重点核心内容在于串的模式匹配。 3.第三章介绍的是链表及其应用,链表中数据元素的存储不一定是连续的,还可以占 用任意的、不连续的物理存储区域。与顺序表相比,链表的插入、删除等功能是不 需要移动元素的,只需变化指针的取向即可,算法简单快捷,。链表这一章中介绍 了链表的节点结构、静态与动态链表的概念、链表的基本运算(如求表长、插入、 查找、删除等)、单链表的建立(头插法和尾插法)以及双向循环链表的定义、结 构、功能和基本算法。 4.第四章和第五章是关于堆栈和队列的介绍与应用。堆栈与队列是两种运算受限制的 线性结构。其基本运算方法与顺序表和链表运算方法基本相同,不同的是堆栈须遵 循“先进后出”的规则,对堆栈的操作只能在栈顶进行;而队列要遵循“先进先 出”的规则,课本中列出了两种结构的相应的基本算法,如入栈、出栈、入队、出 队等。在介绍队列时,提出了循环队列的概念,以避免“假溢出”的现象。同时, 对于其应用也分别讲述了如括号匹配问题等。 5.第六章介绍了特殊矩阵和广义表的概念与应用。其中,特殊矩阵包括对称矩阵、三 角矩阵、对角矩阵和稀疏矩阵等,课本中分别详细介绍了它们的存储结构。稀疏矩 阵的应用包括转置和加法运算等。最后介绍了广义表的相关概念及存储结构,关于 关于广义表的应用有:m元多项式的表示问题。 6.第七章是关于二叉树及其应用。在介绍有关概念时,提到了二叉树的性质以及两种 特殊的二叉树:完全二叉树和满二叉树。接着介绍二叉树的顺序存储和链接存储以 及生成算法。重点介绍二叉树的遍历算法(递归算法、先序、中序和后序遍历非递 归算法)和线索二叉树。二叉树的应用:基本算法、哈弗曼树、二叉排序树和堆与 堆排序。本章为本课程重点内容,需要重点掌握。

北京交通大学数据结构与算法期末测验考试参考答案

北京交通大学考试试题(A卷) 课程名称:数据结构与算法2011-2012学年第一学期出题教师:张勇 (请考生注意:(1)本试卷共有六道大题,(2)答案一律写在答题纸上,(3)试卷不得带出考场) 1. 在顺序表中访问任意一个元素的时间复杂度均为,因此顺序表也称为 的数据结构。 2.三维数组a[4][3][2](下标从0开始),假设a[0][0][0]的地址为50,数据以行序优先方式存储,每个元素的长度为2字节,则a[2][1][1]的地址是。 3. 直接插入排序用监视哨的作用是。 4. 已知广义表Ls=(a, (b, c), (d, e)), 运用head和tail函数取出Ls中的原子d的运算 是。 5.对有14个元素的有序表A[1..14]进行折半查找,当比较到A[4]时算法结束。被比较元素除A[4]外,还有。 6. 在AOV网中,顶点表示,边表示。 7. 有向图G可进行拓扑排序的判别条件是。 8. 若串S1=‘ABCDEFGHIJK’,S2=‘451223’,S3=‘####’,则执行 Substring(S1,Strlength(S3),Index(S2,‘12’,1))的结果是。 二、选择题(每空2分,共20分) 1.在下列存储形式中,哪一个不是树的存储形式?() A.双亲表示法B.孩子链表表示法 C.孩子兄弟表示法D.顺序存储表示法 2.查找n个元素的有序表时,最有效的查找方法是()。 A.顺序查找B.分块查找 C.折半查找D.二叉查找 3.将所示的s所指结点加到p所指结点之后,其语句应为()。 p (A) s->next=p+1 ; p->next=s;

(B) (*p).next=s; (*s).next=(*p).next; (C) s->next=p->next ; p->next=s->next; (D) s->next=p->next ; p->next=s; 4. 在有向图的邻接表存储结构中,顶点v 在链表中出现的次数是( )。 A. 顶点v 的度 B. 顶点v 的出度 C. 顶点v 的入度 D. 依附于顶点v 的边数 5. 算法的时间复杂度为O (nlog 2n )、空间复杂度为O(1)的排序算法是( )。 A. 堆排序 B. 快速排序 C. 归并排序 D.直接选择 6. 设矩阵A 是一个对称矩阵,为了节省存储,将其 下三角部分(如右图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素ai,j(i ≤j), 在一维数组B 中下标k 的值是( ): A.i(i-1)/2+j-1 B.i(i-1)/2+j C.i(i+1)/2+j-1 D.i(i+1)/2+j 7. 由一个长度为11的有序表,按二分查找法对该表进行查找,在表内各元素等概率情 况下,查找成功的平均查找长度是( )。 A .29/11 B. 31/11 C. 33/11 D.35/11 8. AVL 树是一种平衡的二叉排序树,树中任一结点的( )。 A. 左、右子树的高度均相同 B. 左、右子树高度差的绝对值不超过1 C. 左子树的高度均大于右子树的高度 D. 左子树的高度均小于右子树的高度 9. 下列四种排序方法中,不稳定的方法是( )。 A. 直接插入排序 B. 冒泡排序 C. 归并排序 D. 堆排序 10. 设树的度为4,其中度为1,2,3,4的结点个数分别为4, 2, ,1, 1, 则T 中的叶子数为 ( )。 A .5 B .6 C .7 D .8 三、 判断题(10分,每小题1分) 1. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( ) 2. 数组不适合作任何二叉树的存储结构。( ) 3. 广义表的取表尾运算,其结果通常是个表,但有时也可是个原子。( ) 4. 在含有n 个结点的树中,边数只能是n-1条。( ) 5. 所谓一个排序算法是否稳定,是指该算法在各种情况下的效率是否相差不大。( ) 6. 简单选择排序在最好情况下的时间复杂度为O(n)。( ) 7. 在二叉排序树中插入一个新结点,总是插入到叶结点下面。( ) 8. 采用线性探测处理冲突,当从哈希表中删除一个记录时,不应将该记录所在位置置 空,因为这会影响以后的查找。( ) 9. 有n 个数存放在一维数组A[1..n]中,在进行顺序查找时,这n 个数的排列有序或无 ?????? ? ???? ? ??=n n n n a a a a a a A ,2,1,2 ,21,21 ,1Λ Λ

数据结构与算法实验报告

竭诚为您提供优质文档/双击可除数据结构与算法实验报告 篇一:数据结构与算法实验报告-图 沈阳工程学院 学生实验报告 (课程名称:数据结构与算法) 实验题目: 班级网络本112学号27姓名郑乐乐地点F606指导教师吕海华祝世东实验日期:20XX年11月13日 1 2 3 4 篇二:《数据结构与算法》实验报告模板 软件工程系实验报告封面 课程名称:数据结构与算法 课程代码:ss1005 实验指导老师:钟迅科

实验报告名称: 本实验报告包括以下几个内容: 一、实验(实践)目的 二、实验(实践)环境 三、实验(实践)实现过程 四、实验(实践)分析与总结 五、指导教师评语与评分 我申明,本报告内的实验已按要求完成,报告完全是由我个人完成,并没有抄袭行为。我已经保留了这份实验报告的副本。 申明人(签名): 学生姓名:张三学号:1140888888教学班:FJ01递交日期:20XX年10月11日 篇三:数据结构与算法实验报告c++版 算法与数据结构 实验报告 实验一:栈与队列 一、实验目的 1、掌握栈和队列特点、逻辑结构和存储结构 2、熟悉对栈和队列的一些基本操作和具体的函数定义。 3、利用栈和队列的基本操作完成一定功能的程序。 二、实验任务

1.出顺序栈的类定义和函数实现,利用栈的基本操作完成十进制数n与其它d进制数 的转换。(如n=1357,d=8) 2.给出顺序队列的类定义和函数实现,并利用队列计算并打印杨辉三角的前n行的内 容。(n=8) 3.给出链栈的类定义和函数实现,并设计程序完成如下功能:读入一个有限大小的整 数n,并读入n个数,然后按照与输入次序相反的次序输出各元素的值。 三、实验原理 1、将十进制数n转化为d进制时,用除去余数法,用d 除n所得余数作为d进制当前个位,将相除所得的商的整数部分作为新的n值重复上述计算,直到n为0为止。将前所得到的各余数反过来连接便得到最终结果。将每次求出的余数入栈,求解结束后,再依次出栈。 2、在杨辉三角中可用上一行的数来求出对应位置的下一行的内容。用队列保存上行内容,每当由上行的两个数求出下行的一个数时,其中的前一个便需要删除,而求出的数就 入队。为便于求解,在每行的第一个位置添加一个0作为辅助。 3、输出操作应在读入所有输入的整数后才能进行,用

数据结构与算法的实验报告

数据结构与算法第二次实验报告 电子105班 赵萌 2010021526

实验二:栈和队列的定义及基本操作 一、实验目的: . 熟练掌握栈和队列的特点 . 掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用 . 掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用, 掌握环形队列的入队和出队等基本操作 . 加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力 二、实验内容: 定义顺序栈,完成栈的基本操作:空栈、入栈、出栈、取栈顶元素; 实现十进制数与八进制数的转换; 定义链式队列,完成队列的基本操作:入队和出队; 1.问题描述: (1)利用栈的顺序存储结构,设计一组输入数据(假定为一组整数),能够对顺序栈进行如下操作: . 初始化一个空栈,分配一段连续的存储空间,且设定好栈顶和栈底; . 完成一个元素的入栈操作,修改栈顶指针; . 完成一个元素的出栈操作,修改栈顶指针; . 读取栈顶指针所指向的元素的值; . 将十进制数N 和其它d 进制数的转换是计算机实现计算的基本问题,其解决方案很多,其中最简单方法基于下列原理:即除 d 取余法。例如:(1348)10=(2504)8 N N div 8 N mod 8 1348 168 4 168 21 0 21 2 5 2 0 2 从中我们可以看出,最先产生的余数 4 是转换结果的最低位,这正好符合栈的特性即后进先出的特性。 所以可以用顺序栈来模拟这个过程。以此来实现十进制数与八进制数的转换; . 编写主程序,实现对各不同的算法调用。 (2)利用队列的链式存储结构,设计一组输入数据(假定为一组整数),能够对链式队列进行如下操作: . 初始化一个空队列,形成一个带表头结点的空队; . 完成一个元素的入队操作,修改队尾指针; . 完成一个元素的出队操作,修改队头指针; . 修改主程序,实现对各不同的算法调用。

算法与数据结构总结

算法与数据结构总结 算法与数据结构这一门课程,就是描述了数据的逻辑结构,数据的存储结构,以及数据的运算集合在计算机中的运用和体现。数据的逻辑结构就是数据与数据之间的逻辑结构;数据的存储结构就包含了顺序存储、链式存储、索引存储和散列存储。在这学期当中,老师给我们主要讲了顺序存储和链式存储。最后数据的运算集合就是对于一批数据,数据的运算是定义在数据的逻辑结构之上的,而运算的具体实现依赖于数据的存储结构。 通过这学期的学习,让我在去年C语言的基础上对数据与数据之间的逻辑关系有了更深的理解和认识。以前在学Matlab这一课程的时候,我们如果要实现两个数的加减乘除,或者一系列复杂的数据运算,就直接的调用函数就行,套用规则符号和运算格式,就能立马知道结果。在学习C语言这一课程时,我们逐渐开始了解函数的调用的原理,利用子函数中包含的运算规则,从而实现函数的功能。现今学习了算法,让我更深层次的知道了通过顺序表、指针、递归,能让数据算法的实现更加的简洁,明了,更易于理解。摒弃了数据的冗杂性。 在本书第二章中,主要介绍了顺序表的实现以及运用。顺序表中我认为最重要的是一个实型数组,和顺序表的表长,不论是在一个数据的倒置、插入、删除以及数据的排序过程中,都能将数据依次存入数组当中,利用数组下标之间的关系,就能实现数据的一系列操作

了。在存储栈中,给我留下最深刻的映像就是“先进后出”,由于它特殊的存储特性,所以在括号的匹配,算术表达式中被大量应用。在存储队列之中,数据的删除和存储分别在表的两端进行操作,所以存储数据很方便。为节省队列浪费闲置空间的这一大缺点,所以引入了循环队列这一概念,很好用。 在第三章中,主要讲的是链式存储特性。它最突出的优点就是可以选择连续或者不连续的存储空间都行。所以,不管是数据在插入或者删除一个数据时,会很方便,不会像顺序表那样,要移动数组中的诸多元素。所以链表利用指针能很方便的进行删除或者插入操作。而链式在栈和队列的基础上,也有了多方面的应用,所以在这些方面有了更多的应用。 第四章字符串中,基本的数组内部元素的排序和字符串的匹配大部分代码自己还是能够理解,能够看懂,如果真的要将所学的大量运用于实践的话,那就要多花些功夫和时间了。在对称矩阵的压缩,三角矩阵的压缩,稀疏矩阵在存储中能够合理的进行,能大大提高空间的开支。 在第五章递归当中,就是在函数的定义之中出现了自己本身的调用,称之为递归。而递归设计出来的程序,具有结构清晰,可读性强,便于理解等优点。但是由于递归在执行的过程中,伴随着函数自身的多次调用,因而执行效率较低。如果要在追求执行效率的情况下,往往采用非递归方式实现问题的算法程序。 在第六章数型结构当中,这是区别于线性结构的另一大类数据

常用的大数据结构与算法

常用的大数据结构与算法 在学习了解这些数据结构和算法之前,引用一位前辈的话: “我们不需要你能不参考任何资料,实现红黑树;我们需要的是你能在实践当中,选择恰当的数据结构完成程序开发;在必要的时候,能在已有的数据结构基础上进行适当改进,满足工程需要。但要做到这一点,你需要掌握基础的算法和数据结构,你需要理解并应用一些高级数据结构和算法的思想。因此,在程序员这条道路上,你要想走得更远,你需要活用各种数据结构,你需要吸收知名算法的一些思想,而不是死记硬背算法本身。” 那么,工程实践当中,最常用的算法和数据结构有哪些? 以下是Google工程师Arjun Nayini在Quora给出的答案,得到了绝大多数人的赞同。 最常用的算法 1.图搜索算法(BFS,DFS) 2.排序算法 3.通用的动态规划算法 4.匹配算法和网络流算法 5.正则表达式和字符串匹配算法 最常用的数据结构 1.图,尤其是树结构特别重要 2.Maps结构 3.Heap结构 4.Stacks/Queues结构 5.Tries树 其他一些相对比较常用的数据算法还有:贪心算法、Prim’s / Kruskal’s算法、Dijkstra’s 最短路径算法等等。 怎么样才能活用各种数据结构? 你能很清楚的知道什么时候用hash表,什么时候用堆或者红黑色?在什么应用场景下,能用红黑色来代替hash表么?要做到这些,你需要理解红黑树、堆、hash表各有什么特性,彼此优缺点等,否则你不可能知道什么时候该用什么数据结构。 常言道: 程序=算法+数据结构 程序≈数据结构 小编希望这些算法的掌握能够帮助大家拓宽握数据结构和算法的视野,提高算法设计和动手编程的能力。

数据结构与算法上海第二工业大学二工大期末考试试卷

选择题: 1、在数据结构中,线性结构中元素之间存在____关系。 A: 一对一 B: 一对多 C: 多对一 D: 多对多 2、数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的____和运算等的学科。 A: 结构 B: 关系 C: 操作 D: 算法 3、算法分析的两个主要方面是____。 A: 空间复杂度和时间复杂度 B: 正确性和简明性 C: 可读性和文档性 D: 数据复杂性和程序复杂性 4、顺序表中逻辑上相邻的节点其物理位置也____。 A: 一定相邻 B: 不必相邻 C: 按某种规律排列 D: 无要求 5、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行____。 A: s->next=p->next; p->next=s; B: p->next=s->next; s->next=p; C: q->next=s; s->next=p; D: p->next=s; s->next=q; 6、一个栈的入栈序列是a,b,c,d,e,则栈的不可能的输出序列是____。 A: edcba B: decba C: dceab D: abcde 7、循环队列用数组A[0,m-1]存放其元素值,已知其头尾指针分别是front和rear,则当前队列中的元素个数是____。 A: (rear-front+m)%m B: rear-front+1 C: rear-front-1 D: rear-front 8、关于空格串,下列说法中正确的有____。 A: 空格串就是空串

B: 空格串是零个字符的串 C: 空格串的长度为零 D: 空格串的长度就是其包含的空格个数 9、数组A中,每个元素A的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放在存储器内,该数组按行存放时,元素A[8][5]的起始地址为____。A: SA+140 B: SA+144 C: SA+222 D: SA+225 10、对于一棵满二叉树,m个树叶,n个节点,深度为h,则____。 A: n=h+m B: h+m=2n C: m=h-1 D: n=2h-1 11、具有65个结点的完全二叉树其深度为____。(根的层次号为1) A: 8 B: 7 C: 6 D: 5 12、满二叉树____二叉树。 A: 一定是完全 B: 不一定是完全 C: 不是 D: 不是完全 13、将一棵有100个节点的完全二叉树从上到下,从左到右依次对节点进行编号,根节点的编号为1,则编号为49的节点的左孩子编号为____。 A: 99 B: 98 C: 50 D: 48 14、如果T2是由森林T转换而来的二叉树,那么T中结点的后序遍历就是T2中结点的____。A: 先序遍历 B: 中序遍历 C: 后序遍历 D: 层次遍历 15、将递归算法转换成对应的非递归算法时,通常需要使用____。 A: 栈 B: 队列 C: 链表 D: 树 16、如果某二叉树的前序为stuwv,中序为uwtvs,那么该二叉树的后序为____。 A: uwvts B: vwuts C: wuvts

数据结构与算法个人总结

数据结构与算法 重点内容:排序运算的算法、检索运算的算法,本部分所占分值较高,在11分左右; 考试点:数据顺序存储与链式存储、栈与队列的操作、二叉树的存储及遍历(或周游)、霍夫曼算法及其应用、各类排序算法; 知识部分: 1.数据结构的内容: 数据的逻辑结构:分为线性结构和非线性结构 数据的存储结构: 是数据的逻辑结构在存储器里的实现; 数据的运算:插入、删除、排序、查找等; 2.数据的存储结构分为:顺序存储结构和链式存储结构。 3.单链表与双链表的插入与删除这里不再赘述,百度一下吧! 4.栈与队列的基本运算有:插入、删除、读取头元素到变量中,原栈或队列保持不变、判 断是否为空、将栈或队列置为空 5.串的基本运算有:链接、赋值、求长度、全等比较、求子串、求子串的位置及替换等。 6.广义表:广义表是线性表的推广,也称列表。 广义表的特点: 广义表的元素可以使字表,且字表的元素还可以是字表; 广义表可以被其他广义表所共享; 广义表可以是递归的表,机本身的一个字表; 7.多维数组与稀疏矩阵的存储比较复杂,请用百度查找相关内容,不再赘述; 8.树:树并不重要,重要的知识点是二叉树,对树理解不透彻的同学,请用百度搜索。 9.二叉树: 二叉树的重点内容包括: 二叉树的遍历:中序遍历、前序遍历、后续遍历;(重点考察) 完全二叉树(定义):在一棵二叉树中,若最多只有最下面两层的节点数可小于2,且最下面一层的节点集中于最左边的位置,则称此二叉树为完全二叉树; 树的先根次序周游对应于二叉树的前序周游(遍历),树的后根次序周游对应于二叉树的中序周游(遍历) 10.二叉树的存储结构:链式存储结构与顺序存储结构。 二叉树的链式存储: 是指二叉树的各节点随机存储在内存空间中,节点之间的关系用指针标示; 二叉树链表的节点包括三个:左指针,数据域,右指针;其中左指针指向左子节点,有指针指向右子节点;也可以是指一个父指针(parent)用于指向父节点; 二叉树链表的重要知识点:一个n节点的二叉树链表,有n+1个空指针域; 二叉树的顺序存储: 二叉树的顺序存储就是按一定的次序,用一组地址连续的存储单元存储二叉树的节点元素; 完全二叉树的顺序存储的性质: 用数组A[1….n]顺序存储完全二叉树的各节点,则当i>0,且i<=[(n-1)/2]时,节点A[I]的右子女是节点A[2i+1],否则节点A[I]没有右子女;同理当i>0且I<=[n/2],节点i的左子女节点是2i,否则没有! 11.哈夫曼树:

数据结构与算法

[试题分类]:数据结构与算法 1.数据结构可形式地定义为(D, S),其中S是D上( )的有限集。 A.操作 B.存储映像 C.关系 D.数据元素 答案:C 题型:单选题 知识点:1.2 基本概念和术语 难度:1 2.一般而言,最适合描述算法的语言是( )。 A.自然语言 B.计算机程序语言 C.介于自然语言和程序设计语言之间的伪语言 D.数学公式 答案:C 题型:单选题 知识点:1.4 算法和算法分析 难度:1 3.在下列序列中,不是线性表的是( )。 A. (‘a’,‘b’) B. (a, b) C. (‘AB’,‘CD’) D. (‘a’, b) 答案:D

题型:单选题 知识点:2.1 线性表的类型定义 难度:2 4.对于顺序表的优缺点,以下说法错误的是( )。 A.插入和删除操作较方便 B.可以方便地随机存取表中的任一结点 C.无需为表示结点间的逻辑关系而增加额外的存储空间 D.由于顺序表要求占用连续的空间,存储分配只能预先进行 题型:单选题 知识点:2.2线性表的顺序表示和实现 难度:2 5.在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在q和p之间插入s结点,则执行( )。 A. s->next=p->next;p->next=s; B. p->next=s->next;s->next=p; C. q->next=s;s->next=p; D. p->next=s;s->next=q; 题型:单选题 知识点:2.3线性表的链式表示和实现 难度:2 6.若某链表中最常用的操作是在最后一个结点后插入一个结点和删除最后一个结点,则采用( )存储方式最节省时间。 A.单链表 B.带头结点的单链表 C.单循环链表

软件学院数据结构与算法分析期末试题(2006级B)

四川大学期末考试试题 (2007-2008学年第1学期) 课程号:课程名称:数据结构与算法分析(B卷)任课教师:适用专业年级:06级软件工程学号:姓名: (1)The primary purpose of most computer programs is a) to perform a mathematical calculation. b) to store and retrieve information. c) to sort a collection of records. d) all of the above. (2)Assume that P contains n elements. The number of sets in the powerset of P is a) n b) n^2 c) 2^n d) 2^n - 1 e) 2^n + 1 (3)Pick the growth rate that corresponds to the most efficientalgorithm as n gets large: a) 5n b) 20 log n c) 2n^2 d) 2^n (4)A sequence has the following properties: a) May have duplicates, element have a position. b) May have duplicates, elements do not have a position. c) May not have duplicates, elements have a position. d) May not have duplicates, elements do not have a position.

数据结构与算法分析实验报告

《数据结构与算法分析》实验报告 姓名学号_ _____ __年 __月__ __日 1.上机题目:以静态链表为存储结构,编写给定权值 {7,19,2,6,32,3}构造哈夫曼树的算法。(输出以存储结构表示或以树型显示(90度旋转)) 2.需求分析 (1)输入数据必须为int的整形数据,其数值范围为:-~47 (2)输出的数据格式为:%d (3)测试数据的数据为:{7,19,2,6,32,3} 3.详细设计 (1)该程序采用顺序表的存储结构,其数据结构定义如下:#define n 6 #define m 2*n-1 #define max 100typedef struct {int data; int lchild,rchild,prnt; }hufmtree; 所用数据类型中每个操作的伪码算法如下: 创建哈夫曼树 Program hufm(hufmtree t[m]) FOR i=0;i

p1=0;p2=0; small1=max;small2=max FOR j=0;j<=i-1;j++ TO IFt[j].prnt?=0 IF(t[j].data

相关主题
文本预览
相关文档 最新文档