算法第四章实践报告

实践报告任选一题进行分析。内容包括:

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语言,花了点时间才做出来的。

 

posted @ 2018-12-02 16:11  鹿瞳  阅读(163)  评论(0)    收藏  举报