算法第4章实践报告
实践报告任选一题进行分析。内容包括:
-
实践题目
7-1 最优合并问题 (100 分)
题目来源:王晓东《算法设计与分析》
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
输入格式:
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。
输出格式:
输出最多比较次数和最少比较次数。
输入样例:
在这里给出一组输入。例如:
4 5 12 11 2输出样例:
在这里给出相应的输出。例如:
78 52 -
问题描述
根据题目的意思可以知道,这道题是计算出任意k个序列的最小以及最大的合并比较总次数。对于k个序列,当我们进行第一次合并以后,剩余的序列数为k-1个,此时的比较次数为m+n-1 次(被合并的两个序列的长度分别为m和n),因此我们要计算的是:当经过多次合并以后,只剩下一个序列时,m+n-1的最小值和最大值。 -
算法描述
利用哈夫曼算法进行操作,将长度最小的两个序列进行合并,然后将合并之后的新序列重新插入序列队中,不断重复这个操作,直至序列队中只剩下一个序列。def minMerge(k, aList): aList_1 = sorted(aList)//先将序列按照从小到大排好序 ans_1 = [] while(len(aList_1) > 1): i = aList_1[0] j = aList_1[1] k = i + j del aList_1[0] del aList_1[0] aList_1.append(k)//将合并的序列重新插入 ans_1.append(k - 1) aList_1 = sorted(aList_1) return ans_1
-
算法时间及空间复杂度分析(要有分析过程)
空间复杂度:用List存放,故是O(n)
时间复杂度:循环是O(n),用了sort是O(n*logn),因此是O(n²*logn) -
心得体会(对本次实践收获及疑惑进行总结
在实践中掌握了贪心算法的使用,进一步理解了贪心算法的思想。在写第二题的时候,因为忽略了贪心算法的局部最优不一定会导致整体最优,而导致只能A对3个答案,经过多次的思考,对错误算法重新改写,终于还是写出来了。
浙公网安备 33010602011771号