1. 程式人生 > >[作業系列]第四章實踐報告

[作業系列]第四章實踐報告

級別 () 時間復雜度 nlog [1] pan 最小 假設 哈夫曼樹

實踐題目

7-1 最優合並問題

問題描述

題目來源:王曉東《算法設計與分析》

給定k 個排好序的序列, 用 2 路合並算法將這k 個序列合並成一個序列。 假設所采用的 2 路合並算法合並 2 個長度分別為m和n的序列需要m+n-1 次比較。試設 計一個算法確定合並這個序列的最優合並順序,使所需的總比較次數最少。 為了進行比較,還需要確定合並這個序列的最差合並順序,使所需的總比較次數最多。

算法描述

最小次數:每次找最小的兩個數字合並得到當前操作數,將兩個最小的數字去掉,將合並得到的數字加入數組,往復操作即可得到最小操作數

(這題可以用一個哈夫曼樹的思想維護,或者用multiset來維護,就可以在log的時間完成操作,時間復雜度度應該是O(NlogN)級別的)

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int b[1000005];
bool cmp(int aa,int bb)
{
	return aa>bb;
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		b[i]=a[i];
	}
	sort(a,a+n);
	sort(b,b+n,cmp);
	int cnt1=0,cnt2=0;
	long long int s1=0,s2=0;
	int kkk=0;
	while(cnt1!=n-1)
	{
		sort(a,a+n+cnt1);
		kkk=a[0]+a[1];
		s1+=kkk-1;
		a[n+cnt1]=kkk;
		a[0]=100000000;
		a[1]=100000000;
		cnt1++;
	}
		while(cnt2!=n-1)
	{
		sort(b,b+n+cnt2,cmp);
		kkk=b[0]+b[1];
		s2+=kkk-1;
		b[n+cnt2]=kkk;
		b[0]=-1;
		b[1]=-1;
		cnt2++;
	}
	cout<<s2<<" "<<s1<<endl;
}

//4
//5 12 11 2 

  

算法時間及空間復雜度分析(要有分析過程)

空間復雜度明顯是O(N)的;

時間復雜度,每次操作都是O(NlogN)所以總的復雜度是O(N^2logN)的

心得體會(對本次實踐收獲及疑惑進行總結)

感覺隊友的編程能力提高了

[作業系列]第四章實踐報告