2022年算術(shù)編碼的C++實現(xiàn)_第1頁
2022年算術(shù)編碼的C++實現(xiàn)_第2頁
2022年算術(shù)編碼的C++實現(xiàn)_第3頁
2022年算術(shù)編碼的C++實現(xiàn)_第4頁
2022年算術(shù)編碼的C++實現(xiàn)_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論