算法第四章上机实验报告

实践题目名称

最优合并问题

问题描述

题目来源:王晓东《算法设计与分析》

给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。

算法描述(贪心选择性质)

要求最多比较次数和最少比较次数。由于每次合并 2 个长度分别为m和n的序列需要m+n-1 次比较,所以如果想要最多的比较次数,那么我们要将输入数据从大到小排序,把每次组成的m+n再跟下一个数据比较,每次都在ans上加m+n-1;由于两个最大的数据加起来一定大于第三个最大的数据,这里不用排序,直接往下遍历即可。

对于想要求最少的比较次数,我们要将输入数据从小到大排序,并每次在ans上加上m+n-1,把每次组成的m+n放回数组重新排序,直到没有数字了

这里我们可以每次加入完数据后对数组重新排序(nlogn),也可以用一个小根堆(优先队列)来维护数组这样能保证每次堆顶取出的都是最小的,这样就减少了排序所要的时间,只需要维护小根堆的时间。

算法时间及空间复杂度分析

时间:

求最多比较次数只用从大到小遍历一次,O(n);

求最少比较次数:

若每次排序:O(n^2 logn)

若用优先队列:O(nlogn)

 ps:维护优先队列插入和删除的时间复杂度O(logn)

空间:O(n)

对贪心算法的理解

贪心的每一步都是当前的最优解,所有步骤完成后就是总的最优解。

它有两个重要性质:贪心选择性质和最优子结构性质。

贪心选择性质:指问题的最优解可以通过一系列局部最优解的选择得到。

最优子结构性质:指问题的最优解包含其子问题的最优解。

 

心得体会

优秀的贪心策略能极大的降低代码的复杂度,也能减少时间复杂度。

想要对贪心算法有更深刻的体会一定要多做题,感觉光看思想是远远不够的。

(目前来看,很多贪心都会与排序有关(?))

 

posted @ 2021-11-10 21:42  karshey  阅读(38)  评论(0编辑  收藏  举报