算法第四章上机实验报告
实践题目名称
最优合并问题
问题描述
题目来源:王晓东《算法设计与分析》
给定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)
对贪心算法的理解
贪心的每一步都是当前的最优解,所有步骤完成后就是总的最优解。
它有两个重要性质:贪心选择性质和最优子结构性质。
贪心选择性质:指问题的最优解可以通过一系列局部最优解的选择得到。
最优子结构性质:指问题的最优解包含其子问题的最优解。
心得体会
优秀的贪心策略能极大的降低代码的复杂度,也能减少时间复杂度。
想要对贪心算法有更深刻的体会一定要多做题,感觉光看思想是远远不够的。
(目前来看,很多贪心都会与排序有关(?))