Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

数据结构与算法 第九章 外排序书⾯作业

1.
假设⼀个记录⻓为32个字节,⼀个块⻓1024个字节(每个块有32个记录),⼯作内存是1MB(还有⽤于I/O
缓冲区、程序变量等的其他存储空间)。使⽤置换选择算法和多路归并,其中归并算法只允许扫描两遍。预
计能得到的⽂件最⻓为多少?解释这个结果是怎样计算出来的。

⼀个堆可以利⽤全部内存来存记录,也就是可以存 个记录,其为⽣成的顺串的
最短⻓度。

⽤赢者树/输者树多路归并时,可以存下⼀半,也就是 条记录。因此,归并两趟,即可合并
条记录。

因此,预计能得到的⽂件最⻓为 。

2.
设置换选择排序所⽤的堆空间就是⼀个缓冲区块的⼤⼩,⽽且对于⼀个特定的待排⽂件,⼀个缓冲区可以容
纳8个纪录。

(1)
采⽤置换选择排序的⽅法创建关键码由⼩到⼤的初始顺串,对有1600个纪录的⽂件,产⽣的初始顺串最少为
多少个,最多为多少个?平均情况下是多少?请解释是怎样得到这个结果的。

当原⽂件有序时,产⽣的初始顺串最少,为 个。

当原⽂件按形如 的⽅式排列时,产⽣
的初始顺串最多,为 个。

平均情况下,假设数据随机分布,扫描时新记录的有 概率⽐堆顶⼩,有 概率⽐堆顶⼤,故顺串的平均⻓


度约为 ,初始顺串有 个。

(2)
写出当对关键码为{61,12,72,18,79,3,48,25,65,22,90,58,14、22、16、100、18、45、
11、20,38、30、26、107、50、55、17、27}的置换选择排序后,所产⽣的初始顺串。

答:3、12、18、22、25、48、58、61、65、72、79、90、100、11、14、16、18、20、22、26、27、30、
38、45、50、55、107、17。
输出 堆(未排序,|表示END)

61,12,72,18,79,3,48,25

3 61,12,72,18,79,48,25,65

12 61,72,18,79,48,25,65,22

18 61,72,79,48,25,65,22,90

22 61,72,79,48,25,65,90,58

25 61,72,79,48,65,90,58|14

48 61,72,79,65,90,58|14、22

58 61,72,79,65,90|14、22、16

61 72,79,65,90,100|14、22、16

65 72,79,90,100|14、22、16、18

72 79,90,100|14、22、16、18、45

79 90,100|14、22、16、18、45、11

90 100|14、22、16、18、45、11、20

100 14、22、16、18、45、11、20、38

11 14、22、16、18、45、20、38、30

14 22、16、18、45、20、38、30、26

16 22、18、45、20、38、30、26、107

18 22、45、20、38、30、26、107、50

20 22、45、38、30、26、107、50、55

22 45、38、30、26、107、50、55|17

26 45、38、30、107、50、55、27|17

27、30、38、45、50、55、107 17

17

3.
现有8个顺串,每个顺串的第⼀个记录的关键码分别为14,22,24,15,16,11,100,18,第⼆个记录的
关键码分别为26,38,30,26,50,28,110,40.请画出对顺串开始8路归并时的败者树,以及输出⼀个优
胜者后重构得到的败者树。

败者树如图:
11

14

15 18

22 24 16 100

14 22 24 15 16 11 100 18

重构后如图(原来是 的地⽅标为了 ):
14

16

15 18

22 24 X 100

14 22 24 15 16 X 100 18

4.
现在有9个⻓度不同的的顺串,其⻓度分别为。请⽤⼆路归并的⽅法对其进⾏归并。

(1)
构造最佳归并树。

排序得到 ,按照 Huffman 树的构造⽅式,得:


6+11+16+17+21+25+40+41+55=232

41+55=96 6+11+16+17+21+25+40=136

41 55 16+17+25=58 6+11+21+40=78

25 16+17=33 6+11+21=38 40

16 17 6+11=17 21

6 11

(2)
根据最佳归并树计算每⼀趟和总的读记录次数。

第⼀趟:6+11=17

第⼆趟:16+17+17+21=71

第三趟:25+33+38+40=136

第四趟:41+55+58+78=232

第五趟:96+136=232

总共:688次。

5.
*附加题,相邻匹配策略实现箱⼦装载的算法(可以不做)。
在箱⼦装载问题中,有若⼲个容量为 c 的箱⼦和 n 个待装载⼊箱⼦中的物品。物品i需占s[i]个单元
(0<s[i]≤c)。所谓成功装载(feasible packing),是指能把所有物品都装⼊箱⼦⽽不溢出,⽽最优装载
(optimal packing)则是指使⽤了最少箱⼦的成功装载。

箱⼦装载问题是NP复杂问题。因此可⽤近似的算法求解。在箱⼦装载问题中,该算法可得到⼀个接近于最少
箱⼦个数的解。可以采⽤最先匹配法(First Fit, FF)求近似解:物品按1,2,**⋯,n的顺序装⼊箱⼦,假
设箱⼦从左⾄右排列,每⼀物品 i ⾸先放⼊可盛载它的最左箱⼦。**

在相邻匹配(Next Fit)策略中,⼀次只将⼀个物品放⼊⼀个箱⼦中。开始时将物品1放⼊箱⼦1。对于其余
物品,则从最后使⽤的箱⼦的下⼀个箱⼦开始,⽤循环的⽅式轮流查询能够装载该物品的⾮空箱⼦。⽐如,
在该轮询法中,若箱⼦1~箱⼦b 正在使⽤,则可认为这些箱⼦排列成环状。i≠b 时,i 的下⼀个箱⼦为i +1;
i =b时,i 的下⼀个箱⼦为箱⼦1。若上⼀个物品放⼊了箱⼦j,则从箱⼦j 的下⼀个箱⼦开始不断地查找后续
箱⼦,直到找到具有⾜够空间的箱⼦或者⼜回到箱⼦j。若没有找到合适的箱⼦,则启⽤⼀新箱⼦,并将物品
放⼊该箱⼦中。

例,欲将6个物品s[1: 6] = [3, 5, 3, 4, 2, 1 ]放⼊容量为7的箱⼦中。⽤相邻匹配装载法,⾸先将物品1放⼊箱


⼦1。物品2⽆合适的箱⼦,故插⼊⼀个新的箱⼦——箱⼦2。对于物品3,从下⼀箱⼦开始搜寻⾮空的合适箱
⼦。上⼀次使⽤的箱⼦为箱⼦2,故下⼀个箱⼦为箱⼦1。箱⼦1有⾜够的空间,所以将物品3放⼊箱⼦1。对
于物品4,因箱⼦1是上⼀次使⽤的箱⼦,所以从箱⼦2开始轮询。箱⼦2⽆⾜够的空间,⽽箱⼦2的下⼀个箱
⼦(箱⼦1)也⽆⾜够的空间,因此启⽤新箱⼦——箱⼦3,并将物品4放⼊其中。装载物品5的过程是从查寻
箱⼦3的下⼀个箱⼦开始的,箱⼦3的下⼀个箱⼦为箱⼦1,按上述步骤,可查知箱⼦2是合适的,因此将物品
5放⼊箱⼦2。对于最后⼀个物品6,从箱⼦3开始检查,因该箱有⾜够空间,可将物品6放⼊其中。

可⽤最⼤赢者树来⾼效地实现相邻匹配策略。与最先匹配法⼀样,外部节点代表各箱⼦,⽐赛是依据各箱⼦
的最⼤容量来进⾏的。对于n 个物品的装载问题,从n 个箱⼦(外部节点)开始⼯作。观察下图的最⼤赢者
树,其中有6 / 8的箱⼦已被使⽤。虽然当n = 8时,图中所示的情况不会出现,但它演示了如何确定装载下⼀
个物品的箱⼦。若上⼀个物品被放⼊箱⼦l a s t中且当前已使⽤了b个箱⼦,则搜索下⼀个可⽤的箱⼦可按如
下两个步骤来进⾏:

1) 找到第⼀个箱⼦j,j >last。当箱⼦总数为n 时,这样的j 总存在。若该箱⼦⾮空(即j≤b),则使⽤之。

2) 若1) 未找到合适的箱⼦,则在树中搜索适合该物品的最左箱⼦,这个箱⼦是⽬前正在使⽤的箱⼦。

现在来考察图中的情形。假设下⼀个物品需7个单元的空间。若last = 3,则在1) 中可确定箱⼦5有⾜够的空


间。因箱⼦5是⾮空箱⼦,可将物品放⼊其中。另⼀⽅⾯,若l a s t = 5,则在1) 中获知箱⼦7有⾜够空间,因
箱⼦7为空,故移到2 ),找到有⾜够空间的最左箱⼦为箱⼦1,将物品放⼊其中。

为了实现1 ),从箱⼦j = l a s t + 1开始,其中last 为上⼀个箱⼦的编号。注意到若l a s t = n,则所有n个物


品都已被装载并且使⽤了n 个箱⼦,每个物品分别放在⼀个箱⼦中。因此j≤n。
请编写采⽤相邻匹配策略实现箱⼦装载的算法。

注释:⼀般遍历从箱⼦j 到根的路径,查询各右⼦树直到找到第⼀个含有合适箱⼦的右⼦树。当找到该⼦树
时,该⼦树中具有合适容量的最左箱⼦就是所查找的箱⼦。

不想做,略。

You might also like