演算法例題之氣泡排序,huffman樹,優先順序佇列

2021-08-21 05:30:57 字數 2615 閱讀 7829

我發現自己有乙個賤毛病,學習之前喜歡先抒情或者表達一些什麼特別的感情,之後再開始學習,玩的時候倒是很快能夠進入狀態,比如說今天的感慨就是:

不管學習什麼都要對自己有耐心,學習一點是一點,不浮不躁。好了,我說完了,開始進入今天的正式內容。

重編碼問題

重編碼

問題描述

有一篇文章,文章包含 n 種單詞,單詞的編號從 1 至 n,第 i 種單詞的出現次數為 w[i]。

現在,我們要用乙個 2 進製串(即只包含 0 或 1 的串) s[i] 來替換第 i 種單詞,使其滿足如下要求:對於任意的 1≤i,j≤n(i≤j),都有 s[i] 不是 s[j] 的字首。(這個要求是為了避免二義性)

你的任務是對每個單詞選擇合適的 s[i],使得替換後的文章總長度(定義為所有單詞出現次數與替換它的二進位制串的長度乘積的總和)最小。求這個最小長度。

字串 s1(不妨假設長度為 n)被稱為字串 s2 的字首,當且僅當:s2 的長度不小於 n,且 s1 與 s2 前 n 個字元組組成的字串完全相同。

輸入格式

第一行乙個整數 n,表示單詞種數。

第 2 行到第 n+1 行,第 i+1 行包含乙個正整數 w[i],表示第 i 種單詞的出現次數。

輸出格式

輸出一行乙個整數,表示整篇文章重編碼後的最短長度。

樣例輸入

4 1

1 2

2 樣例輸出

12 思路一:暴力方法,構建哈夫曼樹,逐個節點構建(程式貌似沒法正確執行,不過我先貼出來了,作為乙個思路)

///完整版本的程式

#include

#include

#include

using

namespace

std;

long

long getanswer(int n,vector

long> w);

int main()

sort(w.begin(),w.end());

//print("%lld\n",getanswer(n,w));

cout

//返回的是乙個數值

long

long getanswer(int n,vector

long> w)

} ///

//如果大於所有的,就補充在最後

if(flag==0)

w.insert(w.end(),sum);//在最後插入元素 }}

//insert 表示在指定位置(loc)表示迭代器,之前插入元素

思路二:採用棧和佇列兩種資料結構

#include

#include

using

namespace

std;

int main()

//對向量進行排序

sort(v.begin(),v.end());

reverse(v.begin(),v.end());

stack

s;queue

q;//初始化兩個資料結構

//將已經有順序的向量入棧,逆著順序,在棧裡面從上到下是逐漸增加

for(vector

::iterator it =v.begin();it!=v.end();it++)

int sum=0,count=0;//表示最小的兩個數的加和

int max=1000000;//表示乙個很大的數值

int s_a,s_b,q_a,q_b;

if(s.size()==0)

cout

<<"一派胡言!";

if(s.size()==1)

count=s.top();

else

else

s_a=max;

s_b=max;

///同理對於佇列而言

if(q.size()>0)

else

q_a=max;

q_b=max;

//找出四個數之中最小的兩個數值

if(s_aif(!s.empty())

s_b=s.top();

else

s_b=max;

if(s_belse

} else

}

count+=sum;

q.push(sum);}}

cout

<<"count:"

}

思路三:採用優先順序佇列(priority queue)

//使用優先順序佇列重編碼 

#include

using

namespace

std;

int main()

sort(v.begin(),v.end());

for(vector

long>::iterator it=v.begin();it!=v.end();it++)

/*while(!pq.empty())

cout

<<"count:"

0;}

Dijkstra演算法 例題

dijkstra演算法 從起點到終點求最短路 使用要求權值為正 1 求短路i 題目 點數 500 邊數 1e5 include include include using namespace std const int n 510,m 1e5 10 時間複雜度o n m int n,m 鄰接矩陣 i...

模擬演算法例題

一 火柴棒 題目描述 給你n根火柴棍,你可以拼出多少個形如 a b c 的等式?等式中的a b c是用火柴棍拼出的整數 若該數非零,則最高位不能是0 用火柴棍拼數字0 9的拼法如圖所示 注意 1 加號與等號各自需要兩根火柴棍 2 如果a b,則a b c與b a c視為不同的等式 a b c 0 3...

manacher演算法 例題

簡單而有通俗的講解,講的太好了 證明對於一些我的理解,我會以 注釋的形式寫在 裡,我不懶 char str maxn char temp maxn 1 10 擴充套件後的字串 int len maxn 1 10 擴充套件後字串第i個位置回文串從中間到第有邊界的長度 相當於 回文子串長度 2 1 在用...