




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、算術(shù)編碼的C+實現(xiàn)#include <iostream>#include <string>#include <cstring>#include <vector>using namespace std;#define N 50 /輸入的字符應該不超過50個struct L /構(gòu)造用于求各字符及其概率char ch; /存儲出現(xiàn)的字符不重復 int num; /存儲字符出現(xiàn)的次數(shù)double f;/存儲字符的概率 ;/顯示信息void disp();/求概率函數(shù),輸入:字符串;輸出:字符數(shù)組、字符的概率數(shù)組;返回:數(shù)組長度;int proba(str
2、ing str,char c,long double p,int count);/求概率的輔助函數(shù)int search(vector<L> arch,char,int n);/編碼函數(shù),輸入:字符串,字符數(shù)組,概率數(shù)組,以及數(shù)組長度;輸出:編碼結(jié)果long double bma(char c,long double p,string str,int number,int size);/譯碼函數(shù),輸入:編碼結(jié)果,字符串,字符數(shù)組,概率數(shù)組,以及它們的長度;輸出:字符串/該函數(shù)可以用于檢測編碼是否正確void yma(string str,char c,long double p, i
3、nt number,int size,long double input);int main()string str; /輸入要編碼的String類型字符串int number=0,size=0; /number-字符串中不重復的字符個數(shù);size-字符串長度char cN; /用于存儲不重復的字符 long double pN,output; /pN-不重復字符的概率,output-編碼結(jié)果disp();cout<<"輸入要編碼的字符串:"getline(cin,str); /輸入要編碼的字符串size=str.length(); /字符串長度number=p
4、roba(str,c,p,size);/調(diào)用求概率函數(shù),返回不重復字符的個數(shù)cout.setf(ios:fixed); /“魔法配方規(guī)定了小數(shù)局部的個數(shù)cout.setf(ios:showpoint); /在此規(guī)定編碼結(jié)果的小數(shù)局部有十個cout.precision(10);output=bma( c, p, str, number, size);/調(diào)用編碼函數(shù),返回編碼結(jié)果yma(str,c, p, number, size, output); /調(diào)用譯碼函數(shù),輸出要編碼的字符串, /以驗證編碼是否正確return 0;/顯示信息void disp()cout<<endl;cou
5、t<<"*算術(shù)編碼*n"cout<<"* heiness*n"cout<<endl;cout<<"此程序只需要輸入要編碼的字符串,不需要輸入字符概率n" cout<<endl;/求概率函數(shù)int proba(string str,char c,long double p, int count) cout.setf(ios:fixed); /“魔法配方規(guī)定了小數(shù)局部位數(shù)為三位cout.setf(ios:showpoint);cout.precision(3);vector<
6、;L>pt; /定義了構(gòu)造類型的向量,用于同時存儲不重復的字符和其概率 L temp; /構(gòu)造類型的變量temp.ch = str0; /暫存字符串的第一個字符,它的個數(shù)暫設為1temp.num=1; temp.f=0.0;pt.push_back(temp); /將該字符及其個數(shù)壓入向量 for (int i=1;i<count;i+)/對整個字符串進展掃描temp.ch=stri; /暫存第二個字符temp.num=1;temp.f=0.0;for (int j=0;j<pt.size();j+) /在構(gòu)造向量中尋找是否有重復字符出現(xiàn) /假設重復,該字符個數(shù)加1,并跳出循
7、環(huán)int k; /假設不重復,那么壓入該字符,并跳出循環(huán)k=search(pt,stri,pt.size();if(k>=0)ptk.num+;break;else pt.push_back(temp);break;for (i=0;i<pt.size();i+) /計算不重復字符出現(xiàn)的概率pti.f=double(pti.num)/count; intnumber=pt.size(); /計算不重復字符出現(xiàn)的次數(shù) cout<<"各字符概率如下:n" for (i=0;i<number;i+) /顯示所得的概率,驗證是否正確 if (count
8、=0) cout<<"NO sample!n" else ci=pti.ch; pi=pti.f; cout<<ci<<"的概率為:"<<pi<<endl; return number; /返回不重復字符的個數(shù)/求概率的輔助函數(shù)/假設搜索發(fā)現(xiàn)有重復字符返回正數(shù)/否那么,返回-1int search(vector<L> arch,char ch1,int n)for (int i=0;i<n;i+) if(ch1=archi.ch) return i;return -1;/編碼函
9、數(shù)long double bma(char c,long double p,string str,int number,int size)long double High=0.0,Low=0.0,high,low,range;/High-下一個編碼區(qū)間的上限,Low-下一個編碼區(qū)間的下限;/high-中間變量,用來計算下一個編碼區(qū)間的上限;/low-中間變量,用來計算下一個編碼區(qū)間的下限;/range-上一個被編碼區(qū)間長度int i,j=0;for(i=0;i<number;i+)if(str0=ci) break; /編碼第一個字符while(j<i)Low+=pj+; /尋找該
10、字符的概率區(qū)間下限r(nóng)ange=pj; /得到該字符的概率長度High=Low+range; /得到該字符概率區(qū)間上限for(i=1;i<size;i+) /開場編碼第二個字符for(j=0;j<number;j+) /尋找該字符在c數(shù)組中的位置if(stri=cj)if(j=0) /假設該字符在c數(shù)組中的第一個字符low=Low; /此時該字符的概率區(qū)間下限剛好為零high=Low+pj*range;High=high;range*=pj; /求出該字符的編碼區(qū)間長度else /假設該編碼字符不是c數(shù)組中的第一個float proba_next=0.0;for(int k=0;k&
11、lt;=j-1;k+)proba_next+=pk; /再次尋找字符的概率區(qū)間下限low=Low+range*proba_next; /編碼區(qū)間下限high=Low+range*(proba_next+pj);/編碼區(qū)間上限Low=low; /編碼區(qū)間下限High=high; /編碼區(qū)間上限r(nóng)ange*=pj; /編碼區(qū)間長度else continue; /i+,編碼下一個字符cout<<endl;cout<<"輸入字符串的編碼為:"<<Low<<endl;return Low;/譯碼函數(shù)void yma(string str
12、,char c,long double p, int number,int size,long double input)vector<char> v; /定義char類型向量vlong double temp; /中間變量long double sumN; /存儲不重復字符概率區(qū)間的下限sum0=0.0; /數(shù)組第一個元素為0 for (int i=1;i<number+1;i+) /計算數(shù)組各元素的值 sumi=sumi-1+pi-1; for (int j=0;j<size;j+) for (int k=0;k<number;k+) /確定被編碼字符的下限屬于【0,1】之間的哪一段if (input>sumk)&&(input<sumk+1) /發(fā)現(xiàn)在哪就將屬于該段的字符壓入向量vv.push_back(strj);temp=(input-sumk)/(sumk+1-sumk);/計算下一個被編碼字符的下限input=temp;break;elsecontinue; cout<<endl;cout<<"譯碼輸出為:" /將譯碼結(jié)果輸出 for (int m=0;m<v.size();m+)cout<<vm;cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 陜西省安康市2024-2025學年高三下學期第二次質(zhì)量考試(二模)地理試題(含答案)
- 企業(yè)對外溝通與合作記錄表
- 鄉(xiāng)村旅游規(guī)劃設計服務協(xié)議
- 產(chǎn)品保密與知識產(chǎn)權(quán)保護契約書
- 倒裝句的構(gòu)成與識別:英語語法知識鞏固教案
- 鄉(xiāng)村土地承包經(jīng)營獎補資金使用協(xié)議
- 二手房買賣過戶網(wǎng)簽協(xié)議
- 健康飲食品牌推廣合同書
- 本季度銷售業(yè)績匯報與展望
- 高體三教授治療眩暈病學術(shù)思想研究
- 煙葉生產(chǎn)培訓題庫附有答案
- 2024工程用鋼絲環(huán)形網(wǎng)
- 濟南網(wǎng)約車駕駛員區(qū)域考試題庫(含答案)
- GB/T 9799-2024金屬及其他無機覆蓋層鋼鐵上經(jīng)過處理的鋅電鍍層
- 2024年山東高考歷史卷試卷分析與2025年備考啟示-2025屆高三歷史一輪復習
- HG/T 6313-2024 化工園區(qū)智慧化評價導則(正式版)
- 物業(yè)外包管理
- 住院醫(yī)師規(guī)范化培訓計劃及目標
- 中職語文必考文言文15篇
- 2024-2028年蒸汽發(fā)電機市場發(fā)展現(xiàn)狀調(diào)查及供需格局分析預測報告
- 《團隊的凝聚力》課件
評論
0/150
提交評論