7-1最優合併問題
1.問題描述:
給定k 個排好序的序列, 用 2 路合併演算法將這k 個序列合併成乙個序列。 假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m+n-1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。 為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。
4
5 12 11 2
78 52
2.貪心策略
每次選最小的兩個序列合併得到較小比較次數;每次選最大的兩個序列合併得到較大的比較次數。
兩個長度分別為m和n的序列需要m+n-1次比較,此題樣例的計算路徑為:
較小:((2+5-1)+((2+5-1)+11-1))+(2+5+11+12-1)=6+17+29=52
較大同理。
3.詳細**及注釋
#include #includeusing
namespace
std;
intmain()
sort(a,a+k);//庫函式,(a,a+k)表示從左到右遍歷
int min=0
;
for(int n=0;n1;n++)//此處迴圈求最小比較次數
sort(b,b+k);
int max = 0
;
for(int i=1;i<=k-1;i++)
cout
<"
"return0;
}
3.演算法時間及空間複雜度 當n=1時,就成了m個數的歸併排序,時間複雜度為o(mlogn)。
4.結對心得
這道題是我的同伴打的,他非常細心地向我講解了此題的方法和策略。最優合併問題幫助我更直觀地了解了貪心演算法,還有庫函式的使用。
第四章上機實踐報告
實踐題目 4 2 刪數問題 110 分 給定n位正整數a,去掉其中任意k n 個數字後,剩下的數字按原次序排列組成乙個新 的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最 小的刪數方案。輸入格式 第 1 行是1 個正整數 a。第 2 行是正整數k。輸出格式 輸出最...
第四章上機實踐報告
刪數問題 110 分 給定n位正整數a,去掉其中任意k n 個數字後,剩下的數字按原次序排列組成乙個新 的正整數。對於給定的n位正整數a和正整數 k,設計乙個演算法找出剩下數字組成的新數最 小的刪數方案。第 1 行是1 個正整數 a。第 2 行是正整數k。輸出最小數。在這裡給出一組輸入。例如 178...
第四章上機實踐報告
一 實踐題目 二 題目描述 給定一串串行,每次取兩個數的值加起來,然後把兩個數取出來,將兩個數加起來的值放入序列 三 演算法描述 題目大意其實類似哈夫曼編碼,只是他還要再求乙個最大值的 因此進行兩次操作,一次每次都是取最大的兩個數,另一次每次都是取最小的兩個數 每次取到的兩個最大或者最小的數a b進...