算法第4章实践报告
一、实践题目
7-1 最优合并问题
二、问题描述
给定k 个排好序的序列, 用 2 路合并算法将这k 个序列合并成一个序列。 假设所采用的 2 路合并算法合并 2 个长度分别为m和n的序列需要m+n-1 次比较。试设 计一个算法确定合并这个序列的最优合并顺序,使所需的总比较次数最少。 为了进行比较,还需要确定合并这个序列的最差合并顺序,使所需的总比较次数最多。
三、算法描述
算法使用优先队列,将字符串长度排序,并且合并后的序列长度重新回到队列中时可以自动排序。比较次数最多则从字符串长度大的开始合并,比较次数少则从字符串长度小的开始合并。每次取队列前两个元素做比较次数的运算,第一行队列定义为大的数字优先级高,第二行则相反,所以可以根据思路求得比较次数最多和最少的情况。
#include<iostream> #include<queue> using namespace std; priority_queue<int>que; priority_queue<int,vector<int>,greater<int> >que1; int a[1000]; int main() { int n; cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; que.push(a[i]); que1.push(a[i]); } int ans1=0; while(!que.empty()) { if(que.size()==1) break; 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.empty()) { if(que1.size()==1) break; int a=que1.top();que1.pop(); int b=que1.top();que1.pop(); ans2+=(a+b-1); que1.push(a+b); } cout<<ans1<<' '<<ans2<<endl; }
四、算法时间及空间复杂度分析
空间复杂度:O(n),算法是由两个队列实现的
时间复杂度:O(nlogn)
五、心得体会
接触优到先队列,一种更快捷的方法实现算法,希望可以熟练运用。