最優合併問題

2021-10-05 18:14:27 字數 932 閱讀 7590

給定k個排好序的序列s1,s2, …, sk,用2路合併演算法將這k個序列合併成乙個序列。假設採用的2路合併演算法合併2個長度分別為m和n的序列需要m+n-1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。

為了進行比較,還需要確定合併這個序列的最差合併順序,使所需的總比較次數最多。

對於給定的k個待合併序列,計算最多比較次數和最少比較次數合併方案,可採用huffman演算法,貪心策略:每次選最短的序列合併得到最少比較次數;每次選最長的序列合併得到最多比較次數,這裡使用優先佇列來進行資料的儲存

#include

#include

using

namespace std;

priority_queue<

int, vector<

int>

, greater<

int>

> greater_queue;

priority_queue<

int, vector<

int>

, less<

int>

> less_queue;

template

<

typename t>

intsolve

(t q)

ans +

=(sum-1)

; q.

push

(sum);}

return ans;

}int

main()

cout <<

solve

(less_queue)

<<

" "<<

solve

(greater_queue)

<< endl;

}

1 2 3 4 5

46 29

最優合併問題

include iostream include fstream include vector include queue using namespace std int a 50 n為要合併的序列個數 返回最少合併次數 int mergemin int n q.pop return sum n為要...

最優合併問題

給定k個排好序的序列s1,s2,sk,用2路合併演算法將這k個序列合併成乙個序列。假設所採用的2路合併演算法合併兩個長度分別為m和n的序列需要m n 1次比較。試設計乙個演算法確定合併這個序列的最優合併順序,使所需要的總比較次數最少。測試用例 4 序列數 5 12 11 2 序列中的元素數 輸出 7...

最優合併問題

include define k 4 int data k void sort int data max 12 11 12 11 5 12 11 5 2 k 1 min 2 5 2 5 11 2 5 11 2 k 1 按照這兩個公式求解的 int main index max k 1 最好情況 雖然...