1.实践题目:最优合并问题

2.问题描述:

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

 

输入格式:

 

第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。

 

输出格式:

 

输出最多比较次数和最少比较次数。

 

3.算法描述:

  这个问题的解题思想与构造哈夫曼树的思想比较贴近:按照贪心算法的性质,求合并时比较次数最少,即其每两个序列的比较次数都要是所有情况中最小的,故每次2路合并时选择长度最小的两个序列,它们的比较次数是最小的,故总的比较次数也是最小的。先把所有序列按长度由小到大排序,每次选两个长度最小的序列进行二路归并,归并得到的新序列加入到数组中,“删掉”已合并的两个序列,再进行排序,再选择两个长度最小的序列进行二路归并,以此类推。求合并时比较次数最大同理。

4.算法时间及空间复杂度分析(要有分析过程):

  时间复杂度:单层循环为O(n)。

  空间复杂度:数组备份为O(n)。

5.心得体会(对本次实践收获及疑惑进行总结):

  收获是对sort方法的用法有了更多的了解。本次编程遇到了一个段错误的问题,但在扩大了数组长度后,问题得到了解决。另外还遇到的问题是退出循环的条件,在经过思考和讨论后也得到的解决。

 

posted on 2018-12-02 19:58  Lucy1234567  阅读(100)  评论(0编辑  收藏  举报