設有n個顧客同時等待同一服務,顧客i需要的服務時間為t,1<=i<=n,應如何安排n個顧客的服務次序才能使總的等待時間達到最小?總的等待時間是各顧客等待服務的總和。試給出你的做法的理由。
使用貪心策略,將服務所需時間按從小到大進行排列,優先安排服務時間短的。
二元字首碼:表示乙個字元的0,1字串不能是表示另乙個字元的0,1字串的字首。
b=∑f(xi)d(xi)是儲存乙個字元的平均值。d(xi)為碼長。
平均碼長達到最小的字首編碼方案稱為字符集c的乙個最優字首編碼
不同的字元 a
b cd e
f 頻率
f(千次) 45
13 12
16 9
5定長碼
000001
010011
100101
變長碼 0
// 最優字首碼-huffman編碼
//二元字首碼:表示乙個字元的0, 1字串不能是表示另乙個字元的0, 1字串的字首。
//b = ∑f(xi)d(xi)是儲存乙個字元的平均值。d(xi)為碼長。
//平均碼長達到最小的字首編碼方案稱為字符集c的乙個最優字首編碼。
//例:字符集及其頻率如
//表.長為100000的檔案:
//定長碼:300000 bit,
//變長碼:224000, 省25 %
// 演算法:要點:編碼字元均在葉子節點上,資料結構:佇列中裝樹的結點,佇列遞增排序,取最小元素賦值給樹節點左邊右邊,插入新節點後仍然遞增,注意頻率
//演算法複雜度:
//2行排序o(nlogn)
//3行迴圈n - 1次
//8行迴圈體內插入操作
//o(logn),其它操作常量
//所以t(n) = o(nlogn)
#include #include #include #include // 使用佇列
#include#include using namespace std;
struct huffman ;
struct node
};class minheap
huffman getelement(int i)
void add(huffman &data)
} huffman top()
void minheapify(int i)
if (r < heap.size() && heap[r].frequency < heap[small].frequency)
if (i != small)
} void swap(int i, int j)
};class ques20201017
//huffmans = minheap.getelement();// 得到排好序的陣列
// 開闢葉結點
vectorque;
while(minheap.getsize()!=1)
huffman last = minheap.getelement(0);// 得到最小元素
node* lastnode = new node(last);
que.push_back(lastnode);
// 列印結果
for (int i = que.size()-1; i >=0 ;i--)
}private:
vectorinit(vector&characters, vector&frequencys)
return huffs;
}};int main() ;
vectorfreq = ;
ques.test(s, freq);
return 0;
}
貌似還有些不完善的,比如如何去遍歷這棵樹的問題,作業太多就先不搞了= =
演算法題目打卡 Ques20201007
特別簡單的問題,從一組陣列中選出第k大的元素a i 最容易想到的辦法時間複雜度為o n 2 考慮快排中的劃分法 分治思想 選擇的基準元素預設是陣列的第乙個。對應 試用劃分法 int partselect vector a,int n,int k 但是這樣每次分治迭代只會減少1的複雜度,最壞複雜度 n...
演算法題目打卡 Ques20201012
活動安排問題,乙個場地,安排盡量多的活動。活動安排 include include include using namespace std struct activity class ques20201012 void test vector activities private vectorgre...
演算法打卡Week2
例1 輸入 l1 2 4,3 l2 5 6,4 輸出 7,0,8 解釋 342 465 807 例2 輸入 l1 0 l2 0 輸出 0 學習鍊錶結構 鍊錶是一種遞迴的資料結構,由乙個個結點 node 組成,且每個節點都有資料域 value 和指標域 next head 為單鏈表的頭指標,永遠指向第...