[作業系列]第四章實踐報告
阿新 • • 發佈:2018-11-30
級別 () 時間復雜度 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)的
心得體會(對本次實踐收獲及疑惑進行總結)
感覺隊友的編程能力提高了
[作業系列]第四章實踐報告