算法第四章实践报告
实践报告任选一题进行分析。内容包括:
1.实践题目
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
2.问题描述
第一行有 1 个正整数k,表示有 k个待合并序列。 第二行有 k个正整数,表示 k个待合并序列的长度。
输出最多比较次数和最少比较次数。
3.算法描述
先将各序列的长度按照从小到大进行排序。每次最先合并当前情况下长度最短的两个序列,合并完再进行一次排序,直到合并成一个序列。这样得到的就是最优合并顺序,比较次数最少,每次合并当前情况下最长的两个序列,合并完再进行一次排序直到合并成一个序列,这样得到的是最多比较次数。
4.算法时间及空间复杂度分析(要有分析过程)
算法的时间复杂度:O(n^2 logn) 分析:前面的两个循环的时间复杂度都为O(n) 第三个循环循环n-1次,每次都要执行一次sort函数,时间复杂度为O(nlogn),后面的赋值操作的时间复杂度为O(1),所以这个循环体的时间复杂度为O(n^2logn),整个算法的时间复杂度也为O(n^2logn)。
5.心得体会(对本次实践收获及疑惑进行总结)
做完本次实践题,总结:第三题用到的就是最优装载问题的算法,第二个删数问题要从高位往低位删,每次删去开始递减的第一个数。因为感觉python处理字符串比较方便,所以就尝试用python来写这道题,同时也体会到python的简洁所在(很短的代码就可以解决这个问题)。第一题也算是用到了贪心选择,每次选择当前最长(最短)的两个序列合并,同时结合了数据结构中二叉树的性质来解题。在和队友的结对编程中,第二题对于字符串的处理和最后去除0的方法想了很久,当时用的是Java语言,花了点时间才做出来的。
浙公网安备 33010602011771号