算法第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)

 

五、心得体会

接触优到先队列,一种更快捷的方法实现算法,希望可以熟练运用。

 

posted @ 2018-11-28 11:19  鸡丝面  阅读(170)  评论(0)    收藏  举报