Professional Documents
Culture Documents
2022 11 15 数据结构与算法 第九章 外排序书面作业
2022 11 15 数据结构与算法 第九章 外排序书面作业
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)
构造最佳归并树。
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。若没有找到合适的箱⼦,则启⽤⼀新箱⼦,并将物品
放⼊该箱⼦中。
可⽤最⼤赢者树来⾼效地实现相邻匹配策略。与最先匹配法⼀样,外部节点代表各箱⼦,⽐赛是依据各箱⼦
的最⼤容量来进⾏的。对于n 个物品的装载问题,从n 个箱⼦(外部节点)开始⼯作。观察下图的最⼤赢者
树,其中有6 / 8的箱⼦已被使⽤。虽然当n = 8时,图中所示的情况不会出现,但它演示了如何确定装载下⼀
个物品的箱⼦。若上⼀个物品被放⼊箱⼦l a s t中且当前已使⽤了b个箱⼦,则搜索下⼀个可⽤的箱⼦可按如
下两个步骤来进⾏:
2) 若1) 未找到合适的箱⼦,则在树中搜索适合该物品的最左箱⼦,这个箱⼦是⽬前正在使⽤的箱⼦。
注释:⼀般遍历从箱⼦j 到根的路径,查询各右⼦树直到找到第⼀个含有合适箱⼦的右⼦树。当找到该⼦树
时,该⼦树中具有合适容量的最左箱⼦就是所查找的箱⼦。
不想做,略。