題目:最優合併問題
1.問題描述
給定k 個排好序的序列, 用 2 路合併演算法將這k 個序列合併成乙個序列。 假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m+n-1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。 為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。
輸入格式:
第一行有 1 個正整數k,表示有 k個待合併序列。 第二行有 k個正整數,表示 k個待合併序列的長度。
輸出格式:
輸出最多比較次數和最少比較次數。
2.演算法描述
本題運用的是貪心演算法。由於長度分別為m和n的兩個序列需要進行m+n-1 次比較,因此最優合併排序總比較次數一定是按序列長度從小到大並依次比較而得,最差合併排序總比較次數則相反,按照序列長度從大到小並依次比較而得。長度最小的兩個序列比較相加後長度為m+n,接著再與剩餘最小長度的序列比較,以此類推。因此只需要設定兩個長度分別為序列個數的陣列,乙個按照從小到大排,另乙個從大到小排,第乙個和第二個元素相加後再返回所在陣列重新排序,與下乙個最小的元素繼續累加。本問題有點類似哈夫曼編碼問題,當求最優合併排序時,長度越小的序列所代表的點離二叉樹的根結點越遠。求最差合併排序時則相反。
時間複雜度:
最少比較次數:o(nlogn)
最多比較次數:o(n)
空間複雜度:o(n)
3.程式設計**
#include
using namespace std;
bool cmp(int a, int b)
int main()
sort(a, a+k);
sort(b, b+k, cmp);
for(int i=0; ib[i+1] = b[i]+b[i+1];
max += b[i+1]-1;
sort(b+i+1, b+k ,cmp);
}cout<4.對貪心演算法的理解
貪心演算法與動態規劃演算法有點類似,但又有所區別。貪心演算法是選擇當前一步的最優選擇,即區域性最優解,在一些選擇問題上往往比動態規劃法更加直接明了且更為簡潔,但把所有步驟完成之後,往往也能得到整體的最優解。總之,貪心演算法也是一種追求效益最大化的解決問題方法,但也離不開最優子結構的基本性質,都是從小問題上找最優解進而得到問題最優解的過程。
演算法第四章上機實驗報告
實踐題目名稱 最優合併問題 問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合...
演算法第四章上機實驗報告
4 1 程式儲存問題 40 分 設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1 i n。程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。第一行是2 個正整數...
演算法第四章上機實驗報告
1.問題描述 給定n位正整數a,去掉其中任意k n 個數字後,剩下的數字按原次序排列組成乙個新的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最小的刪數方案。如果數字最前面有0不輸出。2.演算法描述 3.問題求解 顯然高位數字的數值大小更對數字的大小起決定性作用,因...