演算法第四章上機實驗報告

2022-09-10 07:03:09 字數 892 閱讀 7768

4-1 程式儲存問題

有限空間中放最多的程式,很容易就可以想到優先放最小的程式,就會得到最大數量。

sort(a, a + n);

//sum為儲存空間大小

for(int i = 0; i < n; i++)

if(sum == 0)

}

時間複雜度為 o(n * log n)

4-2 刪數問題

給定一串數字,題目要求刪掉 t 個數字(刪掉後先後關係不變),問如何刪才能取得最小值。

可以從另乙個問題引申出求解思路

問題:假設有 x 個數字可以任意排列,如何才能讓其取值最小?

答案:小的數放在高位,大的數放在低位,使他由高位到低位單調遞增

此題原理相同,要使得得到的數最小,就每次刪掉逆序的數就可以了。

while(t--) 

}a.erase(cnt, 1); //刪除選中數

if(a.size()==0)

//刪掉前導0

while(a.size() > 1 && a[0]=='0')

}//因為直接以字串讀取一行會多出乙個空格,所以先判斷一下是不是數字

for(int i = 0; i < a.size(); i++) if(isdigit(a[i])) cout << a[i];

假設有 n 位數字,時間複雜度為 o(t * n)

4 - 3 最優和並問題

用到哈夫曼樹,用大根堆,小根堆能快速解決,優先最大的或最小的兩個,沒什麼難點。

時間複雜度,優先佇列插入單個數是 log n 的,n 個數,所以是 o(n * log n) 的。 

總結:貪心演算法沒有固定的套路,有時候證明也很難,但比較符合人的直覺,很多時候可以先猜想再通過程式去驗證。

演算法第四章上機實驗報告

實踐題目名稱 最優合併問題 問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合...

演算法第四章上機實驗報告

題目 最優合併問題 1.問題描述 給定k 個排好序的序列,用 2 路合併演算法將這k 個序列合併成乙個序列。假設所採用的 2 路合併演算法合併 2 個長度分別為m和n的序列需要m n 1 次比較。試設 計乙個演算法確定合併這個序列的最優合併順序,使所需的總比較次數最少。為了進行比較,還需要確定合併這...

演算法第四章上機實驗報告

4 1 程式儲存問題 40 分 設有n 個程式要存放在長度為l的磁帶上。程式i存放在磁帶上的長度是 li,1 i n。程式儲存問題要求確定這n 個程式在磁帶上的乙個儲存方案,使得能夠在磁帶上儲存盡可能多的程式。對於給定的n個程式存放在磁帶上的長度,計算磁帶上最多可以儲存的程式數。第一行是2 個正整數...