博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法第四章上机实践报告
阅读量:6335 次
发布时间:2019-06-22

本文共 1481 字,大约阅读时间需要 4 分钟。

一、实践题目

7-1 最优合并问题

题目描述:存在k个排好的序列,要用二路合并算法将其合并成一个序列。将长度

为m和长度为n的序列合并需要比较m+n-1次,现在要求进行合并操作时,所需要的

总比较次数最多和最少的次数。输入k,接下来的k个数为k个序列的长度

样例1:

//输入45 12 11 2 //输出78 52

题目分析:

容易分析得出,如果每次都将长度最小的两个序列合并,则每次合并的比较次数都会是最小的,

不断合并至为一个序列时,所需要的比较总次数最小。相反如果每次都将长度最大的两个序列

合并,则每次合并的比较次数都是最大的,最后得到的比较次数最多。

实现:

由题目分析可知,需要不断的将序列进行排序,因为每次合并后就会出现一个新的序列,又要将

新序列放入旧序列中重新排序,然后取出最小两个值再次合并,直到序列中仅存在一个值,则表

示合并完成。由上述分析可知,可以将序列长度按升序排序和降序排序然后不断合并在更新,就

可以得出结果因为需要不断排序,显然这里可以利用大根堆和小根堆进行操作,即可以借用C++

STL中的优先队列实现,定义优先级之后,每次取出队列中前两个元素合并并且用一个变量累加记

录比较次数,然后在将合并后的序列入队,不断进行该操作,直到队列中的只存在一个元素为止。

代码:

#include
#include
using namespace std;priority_queue
que; //大根堆 priority_queue
,greater
>que1; //小根堆 int a;int main(){ int n; cin>>n; for(int i=0;i
>a; que.push(a); que1.push(a); } int ans1=0; while(que.size()>1) { int a=que.top();que.pop(); //取出队首两个元素 int b=que.top();que.pop(); ans1+=(a+b-1); //记录比较次数 que.push(a+b); //合并后的新序列入队 } int ans2=0; while(que1.size()>1) { int a=que1.top();que1.pop(); int b=que1.top();que1.pop(); ans2+=(a+b-1); que1.push(a+b); } cout<
<<' '<
<

算法复杂度分析:

空间复杂度:改程序通过两个队列来实现,因此空间复杂度为O(n)。

时间复杂度:优先队列入队的时间复杂度为O(logN),共有k个序列需要进行(k-1)次入队,因此时间复杂度为O(nlogn).

心得体会:

通过本次实践操作,对贪心算法的理解更加深刻,知道该如何分析贪心策略来求得所需要的答案,希望能通过不断练习更进一步。

转载于:https://www.cnblogs.com/LjwCarrot/p/10029928.html

你可能感兴趣的文章
【每天一个Linux命令】12. Linux中which命令的用法
查看>>
软件接口数据一致性机制
查看>>
微服务架构介绍和RPC框架对比
查看>>
Debian下使用OpenLDAP 管理端
查看>>
泛型排序器TComparer
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>
No!No!No! It's not fashion!
查看>>
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>
百度、长沙加码自动驾驶,湖南阿波罗智行科技公司成立 ...
查看>>
10 个 Linux 中方便的 Bash 别名
查看>>
[Server] 服务器配置SSH登录邮件通知
查看>>