数据结构作业3文档格式.docx
《数据结构作业3文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构作业3文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
比较总数=54
(2)移至前端自组织线性表启发式规则:
D:
HDABCEFG8
HDABCEFG1
GHDABCEF8
HGDABCEF2
EHGDABCF7
GEHDABCF3
HGEDABCF3
GHEDABCF2
HGEDABCF2
EHGDABCF3
CEHGDABF7
ECHGDABF2
HECGDABF3
GHECDABF4
比较总数=59
(3)转置自组织线性表启发式规则:
ABDCEFGH4
ABDCEFHG8
ABDCEHFG7
ABDCEHGF8
ABDCHEGF6
ABDCEHGF6
ABDCEGHF7
ABDCEHGF7
ABDECHGF5
ABDCEHGF5
ABDEHCGF6
ABDEHGCF7
比较总数=95
9。
8编写一个算法,实现频率计数自组织线性表启发式规则,假定线性表使用数组实现。
特别是编写一个函数FreqCount,它把要检索的值作为输入,并且相应地调整线性表。
如果值不在线性表中,就把它添加到线性表的最后,其频率计数是1.
算法思想:
按顺序访问记录,每访问一条记录,该记录的访问数加1,如果该记录的访问数已经大于它前面记录的访问数,这条记录就在线性表中与前面的记录交换。
伪代码:
template〈classElem>
voidFreqCount(ElemA[],intcount[])
{
intn=0;
while((intval=GETNEXT())!
=DONE)
{
for(i=0;
i〈n;
i++)
if(A[i]==val)break;
elseif(i==n)
A[n]=val;
count[n++]=1;
}
else
count[i]++;
while((i〉0)&&(count[i]>
count[i-1]))
{
swap(A[i],A[i—1]);
swap(count[i],count[i-1]);
}
}
9编写一个算法,实现移至前端自组织线性表启发式规则,假定线性表使用数组实现.特别是编写一个函数MoveToFront,它把要检索的值作为输入,并且相应地调整线性表。
如果值不在线性表中,就把它添加到线性表的开始位置.
按顺序访问记录,每找到一个记录就把它放到线性表的最前面,而把其他记录后退一个位置.
template〈classElem〉
voidMoveToFront(ElemA[])
i<
n;
if(A[i]==val)break;
if(i==n)A[n]=val;
while(i>
0)
swap(A[i],A[0]);
9.10编写一个算法,实现转置自组织线性表启发式规则,假定线性表使用数组实现。
特别是编写一个函数transpose,它把要检索的值作为输入,并且相应地调整线性表.如果值不在线性表中,就把它添加到线性表的最后。
算法思想:
按顺序访问记录,把找到的记录与它在线性表中的前一条记录交换位置。
伪代码:
voidtanspose(ElemA[])
while((intval=GETNEXT())!
for(i=0;
i〈n;
if(i==n)A[n]=val;
While(i!
=0)
swap(A[i],A[i-1]);
*设散列函数为h(K)=Kmod7,闭散列表的地址空间为0,…,6,开始时散列表为空,用线性探查法解决冲突,请画出依次插入键值23,14,9,6,30,12,18后的散列表。
h(23)=2h(14)=0h(9)=2h(6)=6h(30)=2h(12)=5h(18)=4
14
1
18
2
23
3
9
4
30
5
12
6
9.16使用闭散列,利用双散列方法解决冲突,把下面的关键码插入到一个有13个槽的散列表中(槽从0到12编号).使用的散列函数H1和H2在下面定义。
给出插入8个关键码值后的散列表。
一定要说明如何使用H1和H2进行散列。
函数Rev(k)颠倒10进制数k各个位的数字,例如,Rev(37)=73,Rev(7)=7。
H1(k)=kmod13。
H2(k)=(Rev(k+1)mod11).
关键码:
2,8,31,20,19,18,53,27
H1
(2)=2H2
(2)=3放在位置2
H1(8)=8H2(8)=9放在位置8
H1(31)=5H2(31)=1放在位置5
H1(20)=7H2(20)=1放在位置7
H1(19)=6H2(19)=2放在位置6
H1(18)=5H2(18)=3放在位置5,但位置5已经有数据,5+3=8,位
置8也有数据8+3=11,放在位置11
H1(53)=1H2(53)=1放在位置53
H1(27)=1H2(27)=5放在位置1,但位置1已经有数据,1+5=6,位
置6也有数据,6+5=11,位置11也有数据,
11+5=3,放在位置3
53
27
31
19
7
20
8
10
11
第11章图的作业
11.3(a)画出图11。
26所示图的相邻矩阵表示。
(b)画出这个图的邻接表表示.
1—〉2(10)-〉4(20)—>
6
(2)->
\
2-〉1(10)->
3(3)—〉4(5)->
3—〉2(3)->
5(15)—>
4->
1(20)->
2(5)-〉5(11)->
6(10)—>
5—>
3(15)—〉4(11)—〉6(3)—〉\
6—>
1
(2)->
4(10)-〉5(3)-〉\
11。
4对于图11。
26所示的图,给出从顶点1开始DFS树。
5对于图11.26所示的图,给出从顶点1开始BFS树
8对于图11。
26中的图,给出从顶点4出发,使用Dijkstra最短路径算法产生的最短路径表.请像图11.18所示那样,每处理一个顶点时给出相应D值。
初始
∞
处理4
处理2
15
处理3
处理5
处理6
处理1
顶点4到顶点1的最短路径为15;
顶点4到顶点2的最短路径为5;
顶点4到顶点3的最短路径为8;
顶点4到顶点4的最短路径为0;
顶点4到顶点5的最短路径为11;
顶点4到顶点6的最短路径为10.
12编写一个算法确定一个有|V|个顶点的有向图是否包含回路。
算法的时间代价应该是Θ(|V|+|E|)。
用广度优先拓扑排序的方法,首先访问所有的边,计算指向每个顶点的边数,将所有没有先决条件的顶点放入队列,然后开始处理队列,当从队列中删除一个顶点时,把它打印出来,同时将其所有相邻顶点的先决条件计数减1,当某个相邻顶点的计数为0时,就将其放入队列,如果还有顶点未被打印,而队列已经为空,则图中包含回路.
voidtopsort(Graph*G,Queue)
intCount[G-〉n()];
intv,w;
for(v=0;
v<
G—〉n();
v++)Count[v]=0;
v〈G->
n();
v++)
for(w=G->
first(v);
w<
G->
w=G—>
next(v,w))
Count[w]++;
G-〉n();
if(Count[v]==0;
)
Q->
enqueue(v);
while(Q->
length()!
=0)
Q—>
dequeue(v);
printout(v);
w〈G->
w=G->
next(v,w))
{
Count[w]—-;
if(Count[w]==0)
Q-〉enqueue(w);
11.13编写一个算法确定一个有|V|个顶点的无向图是否包含回路.算法的时间代价应该是Θ(|V|).
用深度优先搜索的方法,如果遇到已经访问过的结点,则说明该无向图包含回路。
voidDFS(intmap[][],inta,intdep)
{
if(dep>
1&
&a==v)
{
Printout(”有环路"
);
return;
}
for(i=0;
i〈N;
i++)
{
if(map[a][i]==1)
DFS(map,i,dep++);
voidmain()
{
DFS(map,v,1);
15对于图11.26所示的图,给出使用Floyd的每对顶点间最短路径算法的结果。
0—path
1-path
2—path
3—path
4-path
5-path
6—path
11.18对于图11。
26中的图,给出从顶点3开始使用Prim的MST算法时各个边的访问顺序,并给出最终的MST。
各个边的访问顺序:
(3,2)(2,4)(2,1)(1,6)(6,5)
最终MST:
19对于图11.26中的图,给出使用Kauskal的MST算法时各个边的访问顺序,每当把一条边添加到MST时,等价类数组的结果是什么(如图6.7那样显示数组内容)?
初始状态
处理边(1,6)
处理边(2,3)
处理边(5,6)
处理边(2,4)
处理边(1,2)
等价类数组结果:
123456
初始状态—1—1—1-1—1—1
处理边(1,6)—1—1—1—1—11
处理边(2,3)-1—12—1—11
处理边(5,6)—1-12—111
处理边(2,4)—112-111
处理边(1,2)—112111