算法导论(第三版)第二章思考题2-1 (在归并排序中对最小数组采用插入排序) 虽然归并排序的最坏情况运行时间为...

2-1(在归并排序中对最小数组采用插入排序) 虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏情况运行时间为θ(n2n2),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。
a) 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表
b) 表明在最坏情况下如何在θ(nlg(n/k))时间内合并这些子表
c) 假定修改后的算法的最坏情况运行时间为θ(nk+nlg(n/k)),要使修改后的算法与标准的归并排序具有相同的运行时间,作为n的一个函数,借助θ记号,k的最大值是什么?
d) 在实践中,我们应该如何选择k?

 

a)

对k个数进行插入排序 可以想一下

第1个数排序时长为1;

第二个数排序时长为2;

...

第k个数排序时长为k;

加起来的排序时长就是(k+1)*k/2

题目告诉我们有n/k个子表 所以总运行时长是(k+1)*k/2*(n/k)

约分k后得出总运行时长是(k+1)*n/2 所以θ(nk) 是关于nk的复杂度

 

b)子表的个数是n/k个 可以想象在树状归并图的底部 依次排列:

组1: 1 2 3...... k  组2: 1 2 3.....k ...... 组n/k 1 2 3......k

这样的结构的第二层就是

组1: 1 1 2 2 ...... k k 组2: 1 1 2 2 ...... k k  组n/k/2 1 1 2 2 ...... k k 

第1层有n/k个组 每组k个元素 

第2层有n/k/2个组 每组2k个元素

第3层有n/k/2^(层数-1)个组 每组有2^(层数-1)*k个元素

......

第lg(n/k)层最高层 有1个组 每组有n个元素

 

每一次合并 如果用标准的合并机制 则:

对于第lg(n/k)-1层 合并的复杂度为:

假设两个组 每组有m个元素 假如都是从大到小排序排好的 合并的时候 比较放在最前端的两个数 把较大的数拿出来组成新的组 在最坏的情况下要比较2m次

最终总的合并时间 是:

第一层: 2*k*(n/k)/2 = n(每次两两合并要2k时间 n/k组按照两两分组 有n/k/2个两两组合)

第二层: 2*2k*(n/2/k)/2 = n

...

最终 有lg(n/k)层 总共耗时n*lg(n/k)的时间

因此 总耗时的最大因素可以缩写为: θ(n*lg(n/k))

(c)

由题干θ(nlgn)标准二分法的运行时间是nlg(n)

本小题中算法的运行时间是nk+nlg(n/k)

即问什么情况下 能使 nk+nlg(n/k) = nlg(n)

过程如下:

左边提取公因式 = n*(k+lg(n/k))

左右都➗n 得到: k+lg(n/k) = lg(n)

k+lgn-lgk = lgn

k-lg(k) = 0

k不存在🤷‍♀️怀疑自己算错了欢迎指正...

(4) k怎么选?

就是问对于n个数,在一开始就要分组,那么每组排序的时候用插入法排序,合并时用归并法,怎么分配最快

如果对于一台运算很快的机器 在执行插入排序比细分到最小的归并排序快的话 这时选插入排序

这时就要计算 这个最小的n值在哪里 在n到达多少的时候 归并排序比插入排序快,这个n作为归并排序最低层的数字个数

比如对机器的运行速度的实验表明 对于32个数排序 插入排序比归并排序快,33个数就慢了

那么当要排序128个数的时候 k就应该是32 每组32个数 当这4组数在插入排序完成后 再进行归并排序 在第3层的时候运算完毕 这样是最快的.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值