算法与数据结构讲义三(搜索算法)

算法与数据结构讲义三(搜索算法)
算法与数据结构讲义三(搜索算法)

第十三课搜索算法

12.0 搜索树

引例:在一个4*4的棋盘上的左下角有一个马,按照国际象棋的规则,将这个马跳到右上角。

为(4,4)。按照马的移动规则,假定当前马的位置坐标为

(x,y),则移动方法有:

(1)x’=x+1; y’=y+2

(2)x’=x+1; y’=y-2;

(3)x’=x+2; y’=y+1;

(4)x’=x+2; y’=y-1;

(5)x’=x-1; y’=y+2;

(6)x’=x-1; y’=y-2;

(7)x’=x-2; y’=y+1;

(8)x’=x-2; y’=y-1

图中表示:由(1,1)可以跳到(2,3)和(3,2)两个点(其它移动规则由于边界限制无法到达);(2,3)又可以跳到(1,1)、(4,4)、(4,2)、(3,1)四个点,(3,2)

可以跳达(1,1)、(1,3)、(2,4)、(4,4)四个点,……。

搜索树:按照数据元素的产生式规则建立起来的数据元素逻辑关系。

特点:(1)数据之间的逻辑关系为一对多。

(2)每个结点数据的下一级子结点是由该结点的产生式规则生成。

(3)目标结点(答案数据)一定在搜索树中能够出现。

(4)对于数据规模较大的问题,搜索树的结点将是海量的。

(5)搜索树可能是无穷无尽的(因为很多结点回重复出现)。

12.1 搜索算法的基本原理:

从搜索树中可以看出,一个问题从起始状态,通过穷举的方式建立起搜索树后,目标状态一定能在搜索树中出现。因此,只要建立起搜索树,就可以在其中搜索到目标状态(数据、路径、位置等)。

搜索算法要解决的问题:

产生式规则:由当前状态按照问题的需求和限制,生成新的状态的方法集合。

搜索树的生成和存储:一般采用一边生成,一边搜索;存储方法有:集合、栈。

搜索的方法:按行搜索:即从上到下,逐层搜索

双向按行搜索:一边从上往下(起始状态到中间状态),一边从下往上逐

层搜索(从目标状态到中间状态),找到相同的中间状态

即可。

回朔法搜索:优先向更深层结点查找,走不通则换一条路,无法换则退回

到上一层。

搜索状态的减少:在生成搜索树时,对于已搜过的中间状态的再次出现,是否需要

再次加入到树中重新搜索。

12.2 广度优先搜索(bfs)

又称宽度优先搜索,是一种从搜索树的根结点开始,沿着树的宽度遍历树的结点。如果所有节点均被访问,则算法中止。一般用于求从起始状态到目标状态所需的最少步骤数。

算法过程:

1、首先将根结点放入队列中。

2、从队首取出一个结点,按照产生式规则逐个生成新的结点数据,对新数据:

如果如果是目标结点,则结束算法并返回结果。

如果不是目标结点,则检查它是否已在搜索树中出现过,未出现就将它作为尚未检查过的子结点加入到队列的队尾(特殊情况下,也有已出现过的结点重新入队的)。

3、重复步骤2。

4、若队列为空,表示整张图都检查过了,即目标无法达到,结束算法并返回“找

不到目标”的信息。

算法细化:

1、用哈希数组判断新生成的结点数据是否已出现过。

2、队列经常要多开一行,记录新结点的父亲(即该结点由上一层的哪个结点扩展而来),

用于最后输出过程。

3、如数据规模过大,需要使用循环队列(后果是无法记录父亲)。

算法框架:

function creat(i)

begin

case i of

1:creat:=按照第一产生式规则生成新状态数据;

2:creat:=按照第二产生式规则生成新状态数据;

.

.

.

end;

end;

////////////////////////////////////////////////////////////////

procedure bfs;

begin

join(起始状态);

while not(队空) do

begin

当前处理状态:=deq;

for i:=第一产生式规则 to 最大产生式规则 do

begin

新状态:=creat(i);

if 新状态=目标状态 then

begin

print;

exit;

end

else if not(haxi[新状态]) then

begin

join(新状态);

haxi[新状态]:=true;

end;

end;

end;

end;

空间复杂度:线性队列:O(最大可能状态数)

循环队列:O(最大可能状态数/2)

时间复杂度:最差情形下,BFS必须寻找所有到可能结点的所有路径。

O(最大可能状态数)

完全性:广度优先搜索算法具有完全性。只要目标存在,则BFS一定会找到。但是,若目标不存在,且问题规模为无限大,则BFS将不收敛(不会结束)。

适用范围:广度优先搜索是找到第一个解的算法,即距离根结点的边数最少的解。

如果所有边的权值都相等(即所有产生新状态的代价相同),则这个解

也是最优解。

例一:将一个马从M*N的棋盘的左下角跳到右上角,需要的最少步数是多少?

分析:1、用一个[1..2,1..m*n]的数组作为工作队列,用于存储搜索树。

2、使用m*n的二维哈希数组判重。

3、生成搜索树的同时,记录父节点的序号和新结点的层数。

4、最后从目标结点向起始结点回朔,用一个栈存储回朔的中间状态。

例二:在一个2n+1的一维棋盘上,有n个黑色棋子和n个白色棋子,初始状态如图:Array规定棋子移动规则如下:

1、如果某棋子的旁边正好为空,这枚棋子可以移动到空位置上。

2、如果某棋子的一侧有棋子,二那枚棋子的另一侧为空位置,这枚棋子可以跳过那

枚棋子到空位置上。

问:最少经过多少步,可以将棋盘状态变成

分析:

1、用2n+1位三进制数表示状态,如初始状态为:222201111,目标状态

为111102222。转化为十进制进行存储,另记录空格位置。

2、产生式规则:将棋子移动转化为空格的移动。

(1)空格向左移动

(2)空格向右移动

(3)空格向左跳动

(4)空格向右跳动

3、用一个[1..3^2n+1]的哈希数组判重。

例三:八数码问题。在一个3×3的九宫中有1-8这8个数及一个空格随机的摆放在其中的格子里,如图1所示。现在要求实现这个问题:将该九宫格调整为如图2 所示的形式。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中。试编程实现这一问题的求解。

图二

分析:1、字符串表达状态,另开一变量w记录空格位置。

2、空格移动规则:

(1)向下移动:w’=w+3。

(2)向上移动:w’=w-3。

(3)向左移动:w’=w-1。

(4)向右移动:w’=w+1。

3、用穷举法判重。(将来可以用排序二叉树判重)

12.3 深度优先搜索(dfs)

深度优先搜索是从根结点出发,沿着树的深度遍历树的结点。如果当前新产生的结点还有以此为根的下一层结点,则沿此路继续下去,直到无法再深入访问时,回朔到上一层的结点,选另一条路继续深入访问。反复此过程,直到所有结点都被访问到为止。

算法过程:

1、首先将根结点放入栈中。

2、取出栈顶结点,按照产生式规则生成新的结点数据,每产生一个:

检查是否是目标结点,如果是且比保存的数据更优,刷新所保存的数据。

检查该结点是否已搜过,如果是且比已保存的数据更优,则刷新所保存的数据,然后

该结点进栈;如没有搜过,则保存数据并进栈。

3、转第二步。

4、如果栈空,则算法结束。

细化说明:

1、一般用回朔法,利用递归使用系统栈。

2、哈希数组不仅用于判断新结点是否出现过,还用于保存到达该结点时的中间数据。

算法框架:

procedure dfs(结点数据);

var i:integer;

begin

for i:=产生式规则一to 最大产生式规则do

begin

新结点数据:=creat(i);

if (新结点数据没有搜到过)or(新结点数据虽已搜过但本次搜索结果更优)

then

begin

更新新结点搜索结果;

dfs(新结点数据);

end;

end;

procedure dfs(结点数据);

var i:longint;

begin

for i:=1 to 最大产生式规则do

begin

新结点:=creat(i);

if 新结点是目标结点then

begin

传回新结点;

t:=true;

exit;

end;

if 新结点更优then

begin

更新新结点数据;

dfs(新结点);

if t then exit;

end;

end;

end;

空间复杂度:O(最大状态数) (主要用于存储各结点搜索结果)

时间复杂度:O(最大产生式规则数^最大状态数)

深度优先搜索的理论依据是建立在穷举基础上的,所以时间是几何级数级的,其优化

剪枝是非常必要的,因此,深搜的主要算法设计是在于如何剪枝,如何既高效地抛弃

不必要的子树,又不至于将最优解剪掉,将是深搜的最大难点。

适用范围:在缺乏有效的数学方法、递推算法,不符合动态规划要求,也没有专用算法可以应对,一般考虑使用深搜;得分情况将取决于优化剪枝的技巧(30-100

分)。

例一:有A、B、C、D、E 5本书,要分给张、王、刘、赵、钱5位同学,每人只能选1本。每个人都将自己喜爱的书填写在下表中。请你设计一个程序,打印出让每个人都满意的所有分书方案。

┌──┬───┬───┬───┬───┬───┐

│ │ A│B│C│D│E│

├──┼───┼───┼───┼───┼───┤

│ 张│ │ │ √ │ √ │ │ 0 0 1 1 0

├──┼───┼───┼───┼───┼───┤

│ 王│ √ │ √ │ │ │ √ │ 1 1 0 0 1

├──┼───┼───┼───┼───┼───┤

│ 刘│ │ √ │ √ │ │ │ 0 1 1 0 0

├──┼───┼───┼───┼───┼───┤

│ 赵│ │ │ │ √ │ │ 0 0 0 1 0

├──┼───┼───┼───┼───┼───┤

│ 钱│ │ √ │ │ │ √ │ 0 1 0 0 1

└──┴───┴───┴───┴───┴───┘

分析:

1、朴素的穷举法:产生5本书的所有全排列,共有5!=120个,逐个检查各种排列是否

符合所有人的要求,符合则输出,否则丢弃。

穷举法的改进:例如产生一个全排列12345时,第一个数1表示将第一本书给小张。

但从表中可以看出,这是不可能的,因为小张只喜欢第三、第四本书。也就是说,1

X X X X这一类分法是不符合条件的。由此使我们想到,如果选定第一本书后,就立

即检查一下是否符合条件,当发现第一个数的选择不符合条件时,就不必再产生后面

的4个数了,这样做可以减少很多的运算量。换句话说,第一个数只在3和4中选择,

这样就可以减少3/5的运算量。同理,在选定了第一个数后,其他4个数字的选择

也可以用类似的方法处理,即选择第二个数后,立即检查是否符合条件。例如,第一

个数选3,第二个数选4后,立即进行检查,发现不符合条件,就另选第二个数。这

样就又把34XXX一类的分法删去了,从而又减少了一部分运算量。

3、

建立如上搜索树,每一层分发一本书,未向下扩展的结点为当前层已不合理,故剪去。参考程序:

program dfs1;

const a:array[1..5,1..5]of boolean=((false,false,true,true,false),

(true,true,false,false,true),

(false,true,true,false,false),

(false,false,false,true,false),

(false,true,false,false,true));

var outf:text;

c:array[1..5]of integer;

hx:array[1..5]of boolean;

/////////////////////////////////////////////////////////////////

procedure print;

var i:integer;

begin

for i:=1 to 5 do

case c[i]of

1:write(outf,'张');

2:write(outf,'王');

3:write(outf,'刘');

4:write(outf,'赵');

5:write(outf,'钱');

end;

end;

/////////////////////////////////////////////////////////////////

procedure dfs(n:integer);

var i:integer;

begin

for i:=1 to 5 do

if (a[i,n])and(not(hx[i])) then

begin

c[n]:=i;

if n=5 then print;

hx[i]:=true;

dfs(n+1);

hx[i]:=false;

end;

end;

/////////////////////////////////////////////////////////////////

begin

assign(outf,'dfs_1.out'); rewrite(outf);

dfs(1);

close(outf);

end.

例二:跳马问题:在半张中国象棋盘上(5*9),有一匹马自左下角往右上角跳,今规定只许往右跳,不许往左跳。编程计算共有多少种不同的跳行路线,并将路线打印出来。

例三:01000

01010

00000

01110

00010

表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着

走,要求编程序找出从左上角到右下角的路线。

例四:有一个m*n的滑雪场,请找出最长的滑雪道。

比如:24 40 20 30 28 44

33 35 20 18 30 40

40 35 22 15 13 20

30 35 25 20 12 18

28 40 30 10 11 20

15 30 12 15 20 12

从第一排开始下滑,只能向上、下、左、右四个方向,且下一个区域的高度必须低于当前

区域的高度,找出一条滑动距离最长的路径,可以在任何区域停止。

12.4 习题:

1、营求(save)

【问题描述】铁达尼号发出了求救信号。距离最近的哥伦比亚号收到了信号,必须尽快赶到那

里。通过侦测,哥伦比亚号获取了一张海洋图。这张图将海洋部分分化成n×n个比较小的单位,

其中用1标明的是陆地,用0标明的是海洋。船只能从一个格子移到相邻的四个格子。为了尽

快赶到出事地点,哥伦比亚号最少需要走多远的距离。

【输入格式】第一行为n,下面是一个n×n的0,1矩阵,表示海洋地图。最后一行为四个小

于等于n的整数,分别表示哥伦比亚和铁达尼号的位置。

【输出格式】哥伦比亚号到达铁达尼号的最短距离,答案精确到整数。

【输入样例】save.in

3

001

101

100

1 1 3 3

【输出样例】save.out

4

【数据范围】n<=1000

2、硬币翻转(coin)

【问题描述】在桌面上有一排硬币,共n枚,每一枚硬币均为正面向上。现在要把所有的硬币

翻转成反面向上,规则是每次可翻转任意n-1枚硬币(正面向上的翻转成向下,向下的翻转成

向上)。求一个最短的操作序列(将每次翻转n-1枚硬币定为一次操作)。

【输入格式】只有一行,包含一个自然数n(n为不大于100的偶数)

【输出格式】第一行包含一个整数s,表示最少需要的操作次数。接下来s行每行分别表示每

次操作后桌上硬币的状态(一行包含n个整数(0或1),表示每个硬币的状态,0正面向上,

1反面向上,不允许出现多余的空格)。对于有多种操作方案的情况,则只需输出一种。

【输入样例】coin.in

4

【输出样例】coin.out

4

0111

1100

0001

3、闭合曲线面积(area)

【问题描述】编程计算由“*”号围城的下列图形

的面积。面积计算方法是统计*号所围城的闭合曲

线中水平线和垂直线交点的数目。如下图所示,

在10×10的二维数组中,有*围住了15点,因此

面积为15。

【输入样例】area.in

0 0 0 0 0 0 0 0 0 0

0 0 0 0 1 1 1 0 0 0

0 0 0 0 1 0 0 1 0 0

0 0 0 0 0 1 0 0 1 0

0 0 1 0 0 0 1 0 1 0

0 1 0 1 0 1 0 0 1 0

0 1 0 0 1 1 0 1 1 0

0 0 1 0 0 0 0 1 0 0

0 0 0 1 1 1 1 1 0 0

0 0 0 0 0 0 0 0 0 0

【输出样例】area.out

15

4、细胞(cell)

【问题描述】一矩形阵列由数字0~9组成,数字1~9代表细胞,细胞的定义是沿细胞数字上下左右如果还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

如阵列:

023*******

1034560500

2045600671

0000000089

有4个细胞。

【输入格式】第一行为整数m,n,接着m行,每行n个数字

【输出格式】细胞的个数

【输入样例】cell.in

4 10

023*******

1034560500

2045600671

0000000089

【输出样例】cell.out

4

5、最少转弯问题(turn)

【问题描述】给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山。平地可以通过,高山则不能。现在你处在地图(x1,y1)这块平地,问:你至少需要拐几个弯才能到达目的地(x2,y2)?你只能沿着水平和垂直方向的平地上行进,拐弯次数就等于行进方向的改变(从水平到垂直从垂直到水平)次数。如右图,最少拐弯5次。

【输入格式】第一行n m

第2到n+1行:整个地图的描述(0:平地,1:高山)。

1 0 0 0 0 1 0

第n+2行:x1 y1 x2 y2

【输出格式】 S

【输入输出样例】

6、骑士周游世界。在国际象棋的棋盘上,有一位骑士按照国际象棋中马的行走规则从棋盘上的某

一方格出发,开始在棋盘上周游。若能不重复地走遍棋盘上的每一个方格,这样的一条周游路线在数学上被称之为国际象棋盘上马的哈密尔顿链。请你设计一个程序,对于从键盘输入的任意一个起始方格的坐标,由计算机自动寻找并按如下格式打印出国际象棋盘上马的哈密尔顿链。例如,当马从坐标点(5,8)出发时,相应的哈密尔顿链如下图所示:

┌───┬───┬───┬───┬───┬───┬───┬───┐

│ 60 │ 11 │ 26 │ 29 │ 54 │ 13 │ 24 │ 21 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 27 │ 30 │ 61 │ 12 │ 25 │ 22 │ 51 │ 14 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 10 │ 59 │ 28 │ 55 │ 50 │ 53 │ 20 │ 23 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 31 │ 64 │ 57 │ 62 │ 43 │ 48 │ 15 │ 52 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 58 │ 9 │ 32 │ 49 │ 56 │ 19 │ 42 │ 1 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 33 │ 6 │ 63 │ 44 │ 47 │ 36 │ 39 │ 16 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 8 │ 45 │ 4 │ 35 │ 18 │ 41 │ 2 │ 37 │

├───┼───┼───┼───┼───┼───┼───┼───┤

│ 5 │ 34 │ 7 │ 46 │ 3 │ 38 │ 17 │ 40 │

└───┴───┴───┴───┴───┴───┴───┴───┘

7、有两个无刻度的量杯A和B,其容积分别为m升和n升(m>n),现在允许用量杯从水缸里取水或将水

倒回水缸里,而且两个量杯中的水也可以相互倾倒,试设计计算机程序求出在m升的量杯中准确量得k升(

【输入文件】ls.in

仅一行,三个数,分别为m,n,k。

【输出文件】ls.out

仅一行,为最少步数。

【样例数据】

【输入】

4 3 2

【输出】

6

8、<问题描述>

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

43#9865#045

+ 8468#6633

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。

现在,我们对问题做两个限制:

首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。

其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。

BADC

+ CRDA

DCCC

上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,

- 输入文件

输入文件alpha.in包含4行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

- 输出文件

输出文件alpha.out包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N 个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。- 样例输入

5

ABCED

BDACE

EBBAA

- 样例输出

1 0 3 4 2

- 数据规模

对于30%的数据,保证有N<=10;

对于50%的数据,保证有N<=15;

对于全部的数据,保证有N<=26。

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

数据结构与算法基础知识总结 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表示队列满

算法与数据结构试题及答案

数据结构试卷(一) 一、单选题(每题2 分,共20分) 1.栈和队列的共同特点是( )。 A.只允许在端点处插入和删除元素 B.都是先进后出 C.都是先进先出 D.没有共同点 2.用链接方式存储的队列,在进行插入运算时( ). A. 仅修改头指针 B. 头、尾指针都要修改 C. 仅修改尾指针 D.头、尾指针可能都要修改 3.以下数据结构中哪一个是非线性结构?( ) A. 队列 B. 栈 C. 线性表 D. 二叉树 4.设有一个二维数组A[m][n],假设A[0][0]存放位置在644(10),A[2][2]存放位置在 676(10),每个元素占一个空间,问A[3][3](10)存放在什么位置?脚注(10)表示用10进制表示。 A.688 B.678 C.692 D.696 5.树最适合用来表示( )。 A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 6.二叉树的第k层的结点数最多为( ). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 7.若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二 分查找,则查找A[3]的比较序列的下标依次为( ) A. 1,2,3 B. 9,5,2,3 C. 9,5,3 D. 9,4,2,3 8.对n个记录的文件进行快速排序,所需要的辅助存储空间大致为 A. O(1) B. O(n) C. O(1og2n) D. O(n2) 9.对于线性表(7,34,55,25,64,46,20,10)进行散列存储时,若选用H(K) =K %9作为散列函数,则散列地址为1的元素有()个, A.1 B.2 C.3 D.4 10.设有6个结点的无向图,该图至少应有( )条边才能确保是一个连通图。 A.5 B.6 C.7 D.8 二、填空题(每空1分,共26分) 1.通常从四个方面评价算法的质量:_________、_________、_________和_________。 2.一个算法的时间复杂度为(n3+n2log2n+14n)/n2,其数量级表示为________。 3.假定一棵树的广义表表示为A(C,D(E,F,G),H(I,J)),则树中所含的结点数 为__________个,树的深度为___________,树的度为_________。 4.后缀算式9 2 3 +- 10 2 / -的值为__________。中缀算式(3+4X)-2Y/3对应的后缀算式 为_______________________________。 5.若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右孩子的两个指 针。在这种存储结构中,n个结点的二叉树共有________个指针域,其中有________个指针域是存放了地址,有________________个指针是空指针。 6.对于一个具有n个顶点和e条边的有向图和无向图,在其对应的邻接表中,所含边结点 分别有_______个和________个。 7.AOV网是一种___________________的图。 8.在一个具有n个顶点的无向完全图中,包含有________条边,在一个具有n个顶点的有 向完全图中,包含有________条边。 9.假定一个线性表为(12,23,74,55,63,40),若按Key % 4条件进行划分,使得同一余数的元 素成为一个子表,则得到的四个子表分别为____________________________、___________________、_______________________和__________________________。

算法与数据结构复习资料

算法与数据结构复习资料 一、单选题 在一个带有附加表头结点的单链表HL中,若要向表头插入一个由指针p指向的结点,则执行( B)。 A. HL=p;p->next=HL; B.p->next=HL->next;HL->next=p; C.p->next=HL;p=HL; D.p->next=HL;HL=p; 若顺序存储的循环队列的QueueMaxSize=n,则该队列最多可存储(B)个元素. A. n B.n-1 C.n+1 D.不确定 下述哪一条是顺序存储方式的优点?(A) A.存储密度大B.插入和删除运算方便 C. 获取符合某种条件的元素方便 D.查找运算速度快 设有一个二维数组A[m][n],假设A[0][0]存放位置在600 (10),A[3][3]存放位置在678 (10) , 每个元素占一个空间,问A[2][3] (10)存放在什么位置?(脚注 (10) 表示用10进制表示,m>3)C A.658 B.648 C.633 D.653 下列关于二叉树遍历的叙述中,正确的是( D) 。 A. 若一个树叶是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序遍历最后一个结点 B.若一个点是某二叉树的前序遍历最后一个结点,则它必是该二叉树的中序遍历的最后一个结点 C.若一个结点是某二叉树的中序遍历的最后一个结点,则它必是该二叉树的前序最后一个结点 D.若一个树叶是某二叉树的前序最后一个结点,则它必是该二叉树的中序遍历最后一个结点 k层二叉树的结点总数最多为(A). A.2k-1 B.2K+1 C.2K-1 D. 2k-1 对线性表进行二分法查找,其前提条件是( C). A.线性表以链接方式存储,并且按关键码值排好序 B.线性表以顺序方式存储,并且按关键码值的检索频率排好序 C. 线性表以顺序方式存储,并且按关键码值排好序 D. 线性表以链接方式存储,并且按关键码值的检索频率排好序 对n个记录进行堆排序,所需要的辅助存储空间为(C) A. O(1og2n) B. O(n) C. O(1) D.O(n2) 对于线性表(7,34,77,25,64,49,20,14)进行散列存储时,若选用H(K)=K%7作为散列函数,则散列地址为0的元素有(D)个, A.1 B.2 C.3 D.4 下列关于数据结构的叙述中,正确的是( D). A. 数组是不同类型值的集合 B. 递归算法的程序结构比迭代算法的程序结构更为精炼 C. 树是一种线性结构 D. 用一维数组存储一棵完全二叉树是有效的存储方法 在决定选取何种存储结构时,一般不考虑( A )。 A.各结点的值如何B.结点个数的多少 C.对数据有哪些运算D.所用的编程语言实现这种结构是否方便 需要分配较大空间,插入和删除不需要移动元素的线性表,其存储结构是(B)。A.单链表B.静态链表C.线性链表D.顺序存储结构 设指针变量p指向单链表中结点A,若删除单链表中结点A,则需要修改指针的操作序列为(A)。 A.q=p->next;p->data=q->data;p->next=q->next;free(q); B.q=p->next;q->data=p->data;p->next=q->next;free(q); C.q=p->next;p->next=q->next;free(q);

算法与数据结构实验

学生实验报告册 (理工类) 课程名称:算法与数据结构专业班级 学生学号:学生: 所属院部:计算机工程学院指导教师:章海鸥 2016 ——2017 学年第 1 学期 金陵科技学院教务处制 实验报告书写要求 实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸一律采用 A4的纸。

实验报告书写说明 实验报告中一至四项容为必填项,包括实验目的和要求;实验仪器和设备;实验容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。 填写注意事项 (1)细致观察,及时、准确、如实记录。 (2)准确说明,层次清晰。 (3)尽量采用专用术语来说明事物。 (4)外文、符号、公式要准确,应使用统一规定的名词和符号。 (5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。 实验报告批改说明 实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。 实验报告装订要求 实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:顺序表实验学时: 2 同组学生:╱实验地点: 实验日期:实验成绩: 批改教师:批改时间:

实验1 顺序表 一、实验目的和要求 掌握顺序表的定位、插入、删除等操作。 二、实验仪器和设备 VC6.0 三、实验容与过程(含程序清单及流程图) 1、必做题 (1)编写程序建立一个顺序表,并逐个输出顺序表中所有数据元素的值。 编写主函数测试结果。 (2)编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。 如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号 从0开始编号);如果不存在,返回-1。编写主函数测试结果。 (3)在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。 解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第 一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位 置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将 新结点x插入到i位置。 (4)删除顺序表中所有等于X的数据元素。 2、选做题 (5)已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值 相同的元素)。 程序清单: (1) #include #define maxsize 20 typedef int datatype; typedef struct{ datatype data[maxsize];

数据结构与算法复习题及参考答案

复习题集─参考答案 一判断题 (√)1. 在决定选取何种存储结构时,一般不考虑各结点的值如何。 (√)2. 抽象数据类型与计算机部表示和实现无关。 (×)3. 线性表采用链式存储结构时,结点和结点部的存储空间可以是不连续的。 (×)4. 链表的每个结点中都恰好包含一个指针。 (×)5.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。(×)6. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 (×)7. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 (×)8. 线性表在物理存储空间中也一定是连续的。 (×)9. 顺序存储方式只能用于存储线性结构。 (√)10.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)11.对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。 (√)12.栈是一种对所有插入、删除操作限于在表的一端进行的线性表,是一种后进先出型结构。 (√)13.两个栈共享一片连续存空间时,为提高存利用率,减少溢出机会,应把两个栈的栈底分别设在这片存空间的两端。 (×)14.二叉树的度为2。 (√)15.若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。 (×)16.二叉树中每个结点的两棵子树的高度差等于1。 (√)17.用二叉链表法存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。 (√)18.具有12个结点的完全二叉树有5个度为2的结点。 (√)19.二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 (×)20.在冒泡法排序中,关键值较小的元素总是向前移动,关键值较大的元素总是向后移动。 (×)21.计算机处理的对象可以分为数据和非数据两大类。[计算机处理的对象都是数据] (×)22.数据的逻辑结构与各数据元素在计算机中如何存储有关。 (×)23.算法必须用程序语言来书写。 (×)24.判断某个算法是否容易阅读是算法分析的任务之一。 (×)25.顺序表是一种有序的线性表。[任何数据结构才用顺序存储都叫顺序表] (√)26.分配给顺序表的存单元地址必须是连续的。 (√)27.栈和队列具有相同的逻辑特性。[它们的逻辑结构都是线性表] (√)28.树形结构中每个结点至多有一个前驱。 (×)29.在树形结构中,处于同一层上的各结点之间都存在兄弟关系。 (×)30.如果表示图的邻接矩阵是对称矩阵,则该图一定是无向图。 (×)31.如果表示图的邻接矩阵是对称矩阵,则该图一定是有向图。 (×)32.顺序查找方法只能在顺序存储结构上进行。 (×)33.折半查找可以在有序的双向链表上进行。

计科本科生《算法与数据结构》实验报告4

学院专业姓名学号 实验1:约瑟夫环问题(3学时) [问题描述] 将编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。 [实验目的] (1)掌握线性表的顺序存储结构和循环顺序存储结构。 [实验内容及要求] (1)构造数据结构。 (2)对线性表进行初始化。 [测试数据] 输入一组n,m值时,程序输出出列顺序。 [思考] (1)你采用的存储结构是顺序表还是循环顺序表?哪个比较合适? (2)当存储结构为循环链表时,如何修改你的程序?并考虑两种存储结构的优缺点。

学院专业姓名学号 实验2:ADT List(线性表)(3学时) [问题描述] 线性表是典型的线性结构,实现ADT List,并在此基础上实现两个集合的交运算或并运算。[实验目的] (1)掌握线性表的链表存储结构。 (2)掌握在单链表上基本操作的实现。 (3)在掌握单链表的基本操作上进行综合题的实现。 [实验内容及要求] (1)要求用带头结点的单链表存储两个集合中的元素和最终的结果。 (2)集合的元素限定为十进制数,程序应对出现重复的数据进行过滤,即链表中没有重复数据。 (3)显示两个集合的内容及其运算结果。 [测试数据] (1)set1={3, 8, 5, 8,11},set2={22, 6, 8, 3, 15,11,20 } set1∪set2= set1∩set2= (2)set1={1, 3, 5, 7},set2={2, 3, 7, 14, 25,38} set1∪set2= set1∩set2=

算法与数据结构 教学大纲

教学大纲 1 教学目的 一些著名的计算机科学家在有关计算机科学教育的论述中认为,计算机科学是一种创造性思维活动,其教育必须面向设计。算法与数据结构正是一门面向设计,且处于计算机学科核心地位的教育课程。通过对算法与数据结构的系统学习与研究,理解和掌握算法设计的主要方法,培养对算法的计算复杂性进行正确分析的能力,为独立地设计算法和对给定算法进行复杂性分析奠定坚实的理论基础,对从事计算机系统结构、系统软件和应用软件研究与开发的科技工作者是非常重要和必不可少的。 计算机科学与技术专业的人员应该具有4种基本的专业能力:计算思维能力,算法设计与分析能力,程序设计和实现能力,计算机软硬件系统的认知,分析,设计与应用能力。本课程着重于培养学生的算法设计与分析能力,程序设计和实现能力。 2 教学内容的结构模块 以教育部计算机科学与技术教学指导委员会发布的“高等学校计算机科学与技术本科专业规范”为依据,以基本数据结构为知识单元,包括引论、表、栈、队列、排序与选择、树、图、集合、符号表、字典、优先队列、并查集共十二章节。 2.1 课堂教学大纲(共计52学时) 第1章引论(4学时) 知识点:本章介绍算法的基本概念、表达算法的抽象机制以及算法的计算复杂性概念和分析方法。简要阐述数据类型、数据结构和抽象数据类型的基本概念以及这3个重要概念的区别和内在联系。最后简要概述C语言的若干重要特性和采用C与自然语言相结合的方式描述算法的方法。本章内容是后续各章叙述算法和描述数据结构的基础和准备。 重点: ? 理解算法的概念。 ? 理解什么是程序,程序与算法的区别和内在联系。 ? 能够列举求解问题的基本步骤。 ? 掌握算法在最坏情况、最好情况和平均情况下的计算复杂性概念。 ? 掌握算法复杂性的渐近性态的数学表述。 ? 了解表达算法的抽象机制。 ? 熟悉抽象数据类型的基本概念。 ? 熟悉数据类型和数据结构的概念。 ? 理解数据结构、数据类型和抽象数据类型三者的区别和联系。 ? 掌握用C语言描述算法与数据结构的方法。 难点:掌握用C语言描述算法与数据结构的方法 第2章表(4学时)

数据结构与算法知识点必备

数据结构与方法 1、算法的基本特征:可行性、确定性、有穷性、拥有足够的情报 2、算法的基本运算与操作:算术运算、逻辑运算、关系运算、数据传输 3、算法的基本控制结构:顺序结构、选择结构、循环(重复)结构 4、算法设计的基本方法:列举法、归纳法、递推、递归、减半递推技术、回溯法 5、算法的复杂度主要包括:时间复杂度、空间复杂度 6、算法的时间复杂度:指执行算法所需要的计算工作量 7、算法的空间复杂度:指执行这个算法所需要的内存空间 8、数据结构主要研究:数据的逻辑结构、数据的存储结构、对各种数据结构进行的运算 9、数据结构研究的目的:提高数据处理的效率 10、数据处理的效率:数据处理的速度、减少处理过程中占用计算机的存储空间 11、数据处理:指对数据集合中的各元素以各种方式进行运算 12、数据元素:指在数据处理中,每一个需要处理的对象都可以抽象成数据元素 13、数据结构:指反映数据元素之间关系的数据元素集合的表示 14、数据的逻辑结构:指反映数据元素之间逻辑关系的数据结构,两要素:数据元素的集合、数据元素在集合上的关系 15、数据的存储结构:指数据的逻辑结构在计算机存储空间的存放形式,常用的存储结构有:顺序、链接、索引等 16、数据结构的图形表示中每个元素加上方框成为结点 17、数据结构一般分为:线性结构、非线性结构 18、线性结构满足:有且仅有一个根结点、每个结点最多有一个前件与后件、在一个线性结构中插入与删除任何一个结点后还就是线性结构 19、线性表定义:线性表就是由n个数据元素a1、a2、a3、a4……an组成的一个有限序列,表中每一个数据元素,除了第一个外,有且仅有一个前件,除了最后一个外,有且仅有一个后件20、非线性表的特征:有且只有一个根节点a1,它无前件、有且只有一个终结点an,它无后件、除了第一个与最后一个外,其她所有结点只有一个前件与一个后件 21、线性表的长度:线性表中的结点的个数n成为线性表的长度,当n=0时,成为空表 22、线性表的顺序存储的特点:所有元素所占的存储空间就是连续的、各数据元素在存储空间中就是按逻辑顺序一次存放的 23、线性表的随机存取地址计算公式:ADD(ai)=ADD(a1)+(i-1)*k 24、线性表的主要操作:插入、删除、查找、排序、分解、合并、复制、逆转 25、栈的定义:栈就是限定在一端进行插入与删除的线性表,它按照“先进后出,后进先出”的原则组织数据 26、栈的顺序存储:在程序设计语言中,一般一维数组S(1:m)作为栈的顺序存储空间,其中m 为栈的最大容量 27、栈的基本运算:入栈、退栈、读栈顶元素 28、入栈运算:首先将栈顶指针(top)加1,然后将新元素插入到栈顶指针指向的位置。当栈顶指针已经指向存储空间的最后一个位置时,说明栈空间已满,称为“上溢”错误 29、退栈运算:首先将栈顶元素赋给一个指定的变量,然后将栈顶指针(top)减1。当栈顶指针为0时,说明栈空,成为“下溢”错误 30、队列的定义:队列就是指允许在一端进行插入,而在另一端进行删除的线性表,它按照“先进先出”的原则组织数据 31、循环队列:在实际应用中,队列的顺序存储结构一般采用循环队列的形式。所谓循环队列,

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

数据结构与算法第二次实验报告 电子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)利用队列的链式存储结构,设计一组输入数据(假定为一组整数),能够对链式队列进行如下操作: . 初始化一个空队列,形成一个带表头结点的空队; . 完成一个元素的入队操作,修改队尾指针; . 完成一个元素的出队操作,修改队头指针; . 修改主程序,实现对各不同的算法调用。

数据结构与算法设计知识点

数据结构与算法设计知识点 试题类型: 本课程为考试科目(闭卷笔试),试题类型包括:概念填空题(10 %),是非判断题(10 %),单项选择题(40 %),算法填空题(10%),算法应用题(20 %),算法设计题(10 %)。 第一章绪论 重点内容及要求: 1、了解与数据结构相关的概念(集合、数据、数据元素、数据项、关键字、元 素之间的关系等)。 数据:所有能被输入到计算机中,且能被计算机处理的符号的 集合。是计算机操作的对象的总称。是计算机处理的信息的某种特定 的符号表示形式。 数据元素:是数据(集合)中的一个“个体”,数据结构中的基本 单位,在计算机程序中通常作为一个整体来考虑和处理。 数据项:是数据结构中讨论的最小单位,数据元素可以是一个或 多个数据项的组合 关键码:也叫关键字(Key),是数据元素中能起标识作用的数 据项。 其中能起到唯一标识作用的关键码称为主关键码(简称主码); 否则称为次关键码。通常,一个数据元素只有一个主码,但可以有多 个次码。 关系:指一个数据集合中数据元素之间的某种相关性。 数据结构:带“结构”的数据元素的集合。这里的结构指元素之 间存在的关系。 数据类型:是一个值的集合和定义在此集合上的一组操作的总

称。 2、掌握数据结构的基本概念、数据的逻辑结构(四种)和物理结构(数据元素 的表示与关系的表示、两类存储结构:顺序存储结构和链式存储结构)。 数据结构包括逻辑结构和物理结构两个层次。 数据的逻辑结构:是对数据元素之间存在的逻辑关系的一种抽象的描述,可以用一个数据元素的集合和定义在此集合上的若干关系来表示 逻辑结构有四种:线性结构、树形结构、图状结构、集合结构数据的物理结构:是其逻辑结构在计算机中的表示或实现,因此又称其为存储结构。 存储结构:顺序存储结构和链式存储结构 顺序存储结构:利用数据元素在存储器中相对位置之间的某种特定的关系来表示数据元素之间的逻辑关系; 链式存储结构:除数据元素本身外,采用附加的“指针”表示数据元素之间的逻辑关系。 3、了解算法分析的基本方法,掌握算法时间复杂度相关的概念。 算法:是为了解决某类问题而规定的一个有限长的操作序列 或处理问题的策略 一个算法必须满足以下五个重要特性:1.有穷性2.确定性3.可行性4.有输入5.有输出 设计算法时,通常还应考虑满足以下目标: 1.正确性, 2.可读性, 3.健壮性 4.高效率与低存储量需求

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include >验目的 掌握顺序栈的基本操作:初始化栈、判栈空否、入栈、出栈、取栈顶数据元素等运算以及程序实现方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)分析问题的要求,编写和调试完成程序。 (3)保存和打印出程序的运行结果,并分析程序的运行结果。 3.实验内容 利用栈的基本操作实现一个判断算术表达式中包含圆括号、方括号是否正确配对的程序。具体完成如下:

(1)定义栈的顺序存取结构。 (2)分别定义顺序栈的基本操作(初始化栈、判栈空否、入栈、出栈等)。 (3)定义一个函数用来判断算术表达式中包含圆括号、方括号是否正确配对。其中,括号配对共有四种情况:左右括号配对次序不正确;右括号多于左括号;左括号多于右括号;左右括号匹配正确。 (4)设计一个测试主函数进行测试。 (5)对程序的运行结果进行分析。 实验代码: #include < > #define MaxSize 100 typedef struct { int data[MaxSize]; int top; }SqStack;

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

. . 河南工程学院 理学院学院 实验报告 (数据结构与算法) 学期: 课程: 专业: 班级: 学号: 姓名: 指导教师:

. . 目录 实验一线性表1(顺序表及单链表的合并) (1) 实验二线性表2(循环链表实现约瑟夫环) (1) 实验三栈和队列的应用(表达式求值和杨辉三角) (1) 实验四赫夫曼编码 实验五最小生成树 (1) 实验六排序算法

. . 实验一线性表1 一、实验学时:2学时 二、实验目的 1.了解线性表的逻辑结构特性是数据元素之间存在着线性关系。在计算机中 表示这种关系的两类不同的存储结构是顺序存储结构和链式存储结构。 2.熟练掌握这两类存储结构的描述方法以及线性表的基本操作在这两种存储 结构上的实现。 三、实验内容 1. 编写程序,实现顺序表的合并。 2. 编写程序,实现单链表的合并。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 1. 顺序表合并的基本思想 程序流程图: 2. 单链表合并的基本思想 程序流程图 六、程序清单

. 七、实现结果 .

. 八、实验体会或对改进实验的建议.

. . 实验二线性表2 一、实验学时:2学时 二、实验目的 1.了解双向循环链表的逻辑结构特性,理解与单链表的区别与联系。 2.熟练掌握双向循环链表的存储结构以及基本操作。 三、实验内容 编写程序,采用循环链表实现约瑟夫环。 设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 四、主要仪器设备及耗材 硬件:计算机一台 软件:VC++ 6.0,MSDN2003或者以上版本 五、算法设计 约瑟夫环实现的基本思想 程序流程图: 六、程序清单

算法与数据结构试题及答案

数据结构模拟试题... 一、简答题(15分,每小题3分) 1.简要说明算法与程序的区别。 2.在哈希表中,发生冲突的可能性与哪些因素有关?为什么? 3.说明在图的遍历中,设置访问标志数组的作用。 4.说明以下三个概念的关系:头指针,头结点,首元素结点。 5.在一般的顺序队列中,什么是假溢出?怎样解决假溢出问题? 二、判断题(10分,每小题1分) 正确在括号内打√,错误打× ( )(1)广义表((( a ), b), c ) 的表头是(( a ), b),表尾是( c )。 ( )(2)在哈夫曼树中,权值最小的结点离根结点最近。 ( )(3)基数排序是高位优先排序法。 ( )(4)在平衡二叉树中,任意结点左右子树的高度差(绝对值)不超过1。 ( )(5)在单链表中,给定任一结点的地址p,则可用下述语句将新结点s插入结点p的后面:p->next = s; s->next = p->next; ( )(6)抽象数据类型(ADT)包括定义和实现两方面,其中定义是独立于实现的,定义仅给出一个ADT的逻辑特性,不必考虑如何在计算机中实现。 ( )(7)数组元素的下标值越大,存取时间越长。 ( )(8)用邻接矩阵法存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中结点个数有关,而与图的边数无关。 ( )(9)拓扑排序是按AOE网中每个结点事件的最早发生时间对结点进行排序。 ( )(10)长度为1的串等价于一个字符型常量。 三、单项选择题(10分, 每小题1分) 1.排序时扫描待排序记录序列,顺次比较相邻的两个元素的大小,逆序时就交换位置。这是哪种排序方法的基本思想? A、堆排序 B、直接插入排序 C、快速排序 D、冒泡排序 2.已知一个有向图的邻接矩阵表示,要删除所有从第i个结点发出的边,应该: A)将邻接矩阵的第i行删除B)将邻接矩阵的第i行元素全部置为0 C)将邻接矩阵的第i列删除D)将邻接矩阵的第i列元素全部置为0 3.有一个含头结点的双向循环链表,头指针为head, 则其为空的条件是: A.head->priro==NULL B. head->next==NULL C. head->next==head D. head->next-> priro==NULL 4. 在顺序表( 3, 6, 8, 10, 12, 15, 16, 18, 21, 25, 30 ) 中,用折半法查找关键码值11,所需的关键码比

算法与数据结构实验

学生实验报告册 (理工类) 金陵科技学院教务处制 实验报告书写要求 实验报告原则上要求学生手写,要求书写工整。若因课程特点需

打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。 实验报告书写说明 实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。 填写注意事项 (1)细致观察,及时、准确、如实记录。 (2)准确说明,层次清晰。 (3)尽量采用专用术语来说明事物。 (4)外文、符号、公式要准确,应使用统一规定的名词和符号。 (5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。 实验报告批改说明 实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。 实验报告装订要求 实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:顺序表实验学时: 2 同组学生姓名:实验地点:A101 实验日期: 4.5 实验成绩: 批改教师:批改时间:

实验1 顺序表 一、实验目的和要求 掌握顺序表的定位、插入、删除等操作。 二、实验仪器和设备 Turbo C 2.0 三、实验内容与过程(含程序清单及流程图) 1、必做题 (1)编写程序建立一个顺序表,并逐个输出顺序表中所有数据元素的值。 编写主函数测试结果。 (2)编写顺序表定位操作子函数,在顺序表中查找是否存在数据元素x。 如果存在,返回顺序表中和x值相等的第1个数据元素的序号(序号 从0开始编号);如果不存在,返回-1。编写主函数测试结果。 (3)在递增有序的顺序表中插入一个新结点x,保持顺序表的有序性。 解题思路:首先查找插入的位置,再移位,最后进行插入操作;从第 一个元素开始找到第一个大于该新结点值x的元素位置i即为插入位 置;然后将从表尾开始依次将元素后移一个位置直至元素i;最后将新 结点x插入到i位置。 (4)删除顺序表中所有等于X的数据元素。 2、选做题 (5)已知两个顺序表A和B按元素值递增有序排列,要求写一算法实现将A和B归并成一个按元素值递减有序排列的顺序表(允许表中含有值 相同的元素)。

算法与数据结构复习重点全

一、单项选择题(50个) 1. 数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称,而(B)是数据不分割的最小单位。 A.数据元素B.数据项C.数据对象D.数据结构 2.以下数据结构中,(A)是非线性数据结构 A.树 B.字符串 C.队 D.栈 3.在定义ADT时,除数据对象和数据关系外,还需说明(c)。 A.数据元素B.算法C.基本D.数据项 4.算法分析的两个方面是( C)。 A. 正确性和简明性 B. 可读性和文档性 C. 空间复杂性和时间复杂性 D. 数据复杂性和程序复杂性 5.通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着(B)。 A.数据具有同一特点 B.不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致 C.每个数据元素都一样 D.数据元素所包含的数据项的个数要相等 6.以下说法正确的是(D)。 A.数据元素是数据的最小单位 B.数据项是数据的基本单位 C.数据结构是带有结构的各个数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是(A)。 A. 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B. 在第i个结点后插入一个新结点(1≤i≤n) C. 删除第i个结点(1≤i≤n) D. 将n个结点从小到大排序 8.在单链表指针为p的结点之后插入指针为s的结点,正确的操作是(B)。 A.p->next=s;s->next=p->next; B.s->next=p->next;p->next=s; C.p->next=s;p->next=s->next; D.p->next=s->next;p->next=s; 9.线性表L=(a1,a2, ……an),下列陈述正确的是(D)。 A.每个元素都有一个直接前驱和一个直接后续 B.线性表中至少有一个元素 C.表中诸元素的排列必须是由小到大或由大到小 D.除第一个和最后一个元素外,其余每个元素都有且仅有一个直接前驱和直接后继

算法与数据结构—5章课后习题

第一章绪论习题练习答案 1.1 简述下列概念:数据、数据元素、数据类型、数据结构、逻辑结构、存储结构、线性结 构、非线性结构。 ●数据:指能够被计算机识别、存储和加工处理的信息载体。 ●数据元素:就是数据的基本单位,在某些情况下,数据元素也称为元素、结点、顶点、 记录。数据元素有时可以由若干数据项组成。 课后答案网 ●数据类型:是一个值的集合以及在这些值上定义的一组操作的总称。通常数据类型可以 看作是程序设计语言中已实现的数据结构。 ●数据结构:指的是数据之间的相互关系,即数据的组织形式。一般包括三个方面的内容: 数据的逻辑结构、存储结构和数据的运算。 ●逻辑结构:指数据元素之间的逻辑关系。 ●存储结构:数据元素及其关系在计算机存储器内的表示,称为数据的存储结构. ●线性结构:数据逻辑结构中的一类。它的特征是若结构为非空集,则该结构有且只有一 个开始结点和一个终端结点,并且所有结点都有且只有一个直接前趋和一个直接后继。线性

表就是一个典型的线性结构。栈、队列、串等都是线性结构。 ●非线性结构:数据逻辑结构中的另一大类,它的逻辑特征是一个结点可能有多个直接前 趋和直接后继。数组、广义表、树和图等数据结构都是非线性结构。 1.2 试举一个数据结构的例子、叙述其逻辑结构、存储结构、运算三个方面的内容。 答: 例如有一张学生体检情况登记表,记录了一个班的学生的身高、体重等各项体检信息。 这张登记表中,每个学生的各项体检信息排在一行上。这个表就是一个数据结构。每个记录 (有姓名,学号,身高和体重等字段)就是一个结点,对于整个表来说,只有一个开始结点(它 的前面无记录)和一个终端结点(它的后面无记录),其他的结点则各有一个也只有一个直接前 趋和直接后继(它的前面和后面均有且只有一个记录)。这几个关系就确定了这个表的逻辑结 构是线性结构。 这个表中的数据如何存储到计算机里,并且如何表示数据元素之间的关系呢? 即用一片 连续的内存单元来存放这些记录(如用数组表示)还是随机存放各结点数据再用指针进行链

《数据结构》考研必须掌握的知识点与算法

《数据结构》必须掌握的知识点与算法 第一章绪论 1、算法的五个重要特性(有穷性、确定性、可行性、输入、输出) 2、算法设计的要求(正确性、可读性、健壮性、效率与低存储量需求) 3、算法与程序的关系: (1)一个程序不一定满足有穷性。例操作系统,只要整个系统不遭破坏,它将永远不会停止,即使没有作业需要处理,它仍处于动态等待中。因此,操作系统不是一个算法。 (2)程序中的指令必须是机器可执行的,而算法中的指令则无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。 (3)一个算法若用程序设计语言来描述,则它就是一个程序。 4、算法的时间复杂度的表示与计算(这个比较复杂,具体看算法本身,一般关心其循环的次数与N的关系、函数递归的计算) 第二章线性表 1、线性表的特点: (1)存在唯一的第一个元素;(这一点决定了图

不是线性表) (2)存在唯一的最后一个元素; (3)除第一个元素外,其它均只有一个前驱(这一点决定了树不是线性表) (4)除最后一个元素外,其它均只有一个后继。 2、线性表有两种表示:顺序表示(数组)、链式表示(链表),栈、队列都是线性表,他们都可以用数组、链表来实现。 3、顺序表示的线性表(数组)地址计算方法: (1)一维数组,设DataType a[N]的首地址为A0,每一个数据(DataType类型)占m个字节,则a[k]的地址为:A a[k]=A0+m*k(其直接意义就是求在数据a[k]的前面有多少个元素,每个元素占m个字节) (2)多维数组,以三维数组为例,设DataType a[M][N][P]的首地址为A000,每一个数据(DataType 类型)占m个字节,则在元素a[i][j][k]的前面共有元素个数为:M*N*i+N*j+k,其其地址为: A a[i][j][k]=A000+m*(M*N*i+N*j+k); 4、线性表的归并排序: 设两个线性表均已经按非递减顺序排好序,现要将两者合并为一个线性表,并仍然接非递减顺序。可见算法2.2

《数据结构与算法》实验报告模板

软件工程系 实验报告封面 课程名称: 数据结构与算法 课程代码: SS1005 实验指导老师: 钟迅科 实验报告名称: Lab05 队列的实现 学生姓名: 张三 学号: 1140888888 教学班: FJ01 递交日期:2012年10月11日 我申明,本报告内的实验已按要求完成,报告完全是由我个人完成,并没有抄袭行为。我已经保留了这份实验报告的副本。 申明人(签名): 本实验报告包括以下几个内容: 一、实验(实践)目的 二、实验(实践)环境 三、实验(实践)实现过程 四、实验(实践)分析与总结 五、指导教师评语与评分

实验题目Lab05 队列的实现 实验地点B406 实验时间2012年10月11日 一、实验目的和要求 1、目的 1)掌握链式存储结构的队列的特点与实现; 2)掌握循环顺序存储结构的队列的特点与实现; 3)理解栈和队列的简单应用。 2、要求 1)验证链式队列的入队过程; 2)验证链式队列的出队过程; 3)验证顺序队列(循环队列)的入队过程; 4)验证顺序队列(循环队列)的出队过程; 5)利用栈的“后进先出”的特性与队列的“先进先出”的特性,编写程序判断回文。 二、实验环境(本实验的硬件和软件环境) 1)PC机; 2)Windows XP以上版本的操作系统; 3)Visual Studio 2010以上版本的开发工具; 4)项目文件: LinkQueue.h和LinkQueue.cpp:实现队列链式存储结构的头文件和源代码; SqQueue.h和SqQueue.cpp:实现队列顺序存储结构的头文件和源代码; LinkStack.h和LinkStack.cpp:实现栈链式存储结构的头文件和源代码; SqStack.h和SqStack.cpp:实现栈顺序存储结构的头文件和源代码。 三、实验实现过程 链式队列: 1) 在语句EnQueue(Q1,'a');处按“F9”设置断点①,按“F5”调试程序至断点处暂停(暂停序号0),然后按“F10”调试程序3次,每次程序暂停时记录数据。调试结束时按“Shift+F5”结束调试过程。 2) 取消其它断点,在语句DeQueue(Q1, temp);处按“F9”设置断点②,按“F5”调试程序至断点处暂停(暂停序号0),然后按“F10”调试程序3次,每次程序暂停时记录数据。 循环队列: 1) 取消其它断点,在语句EnQueue(Q2,'a');处按“F9”设置断点③,按“F5”调试程序至断点处暂停(暂停序号0),然后按“F10”调试程序5次,每次程序暂停时记录数据。观察第5次调试时队列中数据,分析入队EnQueue(Q2,'e');是否成功,并说明原因。 2) 取消其它断点,在语句DeQueue(Q2, temp);处按“F9”设置断点④,按“F5”调试程序至断点处暂停(暂停序号0),然后按“F10”调试程序4次,每次程序暂停时记录数据。

相关文档
最新文档