第四章上机实践报告

一、实践题目

 二、题目描述

 给定一串序列,每次取两个数的值加起来,然后把两个数取出来,将两个数加起来的值放入序列

三、算法描述

题目大意其实类似哈夫曼编码,只是他还要再求一个最大值的

因此进行两次操作,一次每次都是取最大的两个数,另一次每次都是取最小的两个数

每次取到的两个最大或者最小的数a、b进行合并,合并后又形成一个新的数(c = a+b)

再将c放入,和剩下的数进行比较,再挑出最小的或最大的,一直进行下去

运用优先队列,每次取出a、b时,便从队列中把a、b弹出去,再让c(c=a+b)进队

四、算法时间和空间复杂度分析

时间复杂度:队列中有N个数,因为每次都是取队列中两个数相加,直到队列为空,用一个while循环即可,只需要N次;而优先队列中的pop(),push() 需要log N

      因此时间复杂度为 O(Nlog N)

空间复杂度:  需要两个队列的空间,O(N)

五、心得体会

这次的题感觉比上次动态规划的容易一些,所以还是比较快做出来了。其实还是有点像动态规划吧,找一个贪心算法,然后每一步都用那个贪心策略即可。

原文地址:https://www.cnblogs.com/xyishere/p/11876500.html