算法第4章实践报告

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

  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. 问题描述
    根据题目的意思可以知道,这道题是计算出任意k个序列的最小以及最大的合并比较总次数。对于k个序列,当我们进行第一次合并以后,剩余的序列数为k-1个,此时的比较次数为m+n-1 次(被合并的两个序列的长度分别为m和n),因此我们要计算的是:当经过多次合并以后,只剩下一个序列时,m+n-1的最小值和最大值。

  3. 算法描述
    利用哈夫曼算法进行操作,将长度最小的两个序列进行合并,然后将合并之后的新序列重新插入序列队中,不断重复这个操作,直至序列队中只剩下一个序列。

    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

     

  4. 算法时间及空间复杂度分析(要有分析过程)
    空间复杂度:用List存放,故是O(n)
    时间复杂度:循环是O(n),用了sort是O(n*logn),因此是O(n²*logn)

  5. 心得体会(对本次实践收获及疑惑进行总结
    在实践中掌握了贪心算法的使用,进一步理解了贪心算法的思想。在写第二题的时候,因为忽略了贪心算法的局部最优不一定会导致整体最优,而导致只能A对3个答案,经过多次的思考,对错误算法重新改写,终于还是写出来了。

你可能感兴趣的:(算法第4章实践报告)