




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、word算術(shù)編碼的C+實(shí)現(xiàn)#include <iostream>#include <string>#include <cstring>#include <vector>using namespace std;#define N 50 /輸入的字符應(yīng)該不超過(guò)50個(gè)struct L /結(jié)構(gòu)用于求各字符及其概率char ch; /存儲(chǔ)出現(xiàn)的字符不重復(fù) int num; /存儲(chǔ)字符出現(xiàn)的次數(shù)double f;/存儲(chǔ)字符的概率 ;/顯示信息void disp();/求概率函數(shù),輸入:字符串;輸出:字符數(shù)組、字符的概率數(shù)組;返回:數(shù)組長(zhǎng)度;int proba
2、(string str,char c,long double p,int count);/求概率的輔助函數(shù)int search(vector<L> arch,char,int n);/編碼函數(shù),輸入:字符串,字符數(shù)組,概率數(shù)組,以及數(shù)組長(zhǎng)度;輸出:編碼結(jié)果long double bma(char c,long double p,string str,int number,int size);/譯碼函數(shù),輸入:編碼結(jié)果,字符串,字符數(shù)組,概率數(shù)組,以及它們的長(zhǎng)度;輸出:字符串/該函數(shù)可以用于檢測(cè)編碼是否正確void yma(string str,char c,long double
3、p, int number,int size,long double input);int main()string str; /輸入要編碼的String類型字符串int number=0,size=0; /number-字符串中不重復(fù)的字符個(gè)數(shù);size-字符串長(zhǎng)度char cN; /用于存儲(chǔ)不重復(fù)的字符 long double pN,output; /pN-不重復(fù)字符的概率,output-編碼結(jié)果disp();cout<<"輸入要編碼的字符串:"getline(cin,str); /輸入要編碼的字符串size=str.length(); /字符串長(zhǎng)度numb
4、er=proba(str,c,p,size);/調(diào)用求概率函數(shù),返回不重復(fù)字符的個(gè)數(shù)cout.setf(ios:fixed); /“魔法配方規(guī)定了小數(shù)局部的個(gè)數(shù)cout.setf(ios:showpoint); /在此規(guī)定編碼結(jié)果的小數(shù)局部有十個(gè)cout.precision(10);output=bma( c, p, str, number, size);/調(diào)用編碼函數(shù),返回編碼結(jié)果yma(str,c, p, number, size, output); /調(diào)用譯碼函數(shù),輸出要編碼的字符串, /以驗(yàn)證編碼是否正確return 0;/顯示信息void disp()cout<<endl
5、;cout<<"*算術(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);vecto
6、r<L>pt; /定義了結(jié)構(gòu)類型的向量,用于同時(shí)存儲(chǔ)不重復(fù)的字符和其概率 L temp; /結(jié)構(gòu)類型的變量temp.ch = str0; /暫存字符串的第一個(gè)字符,它的個(gè)數(shù)暫設(shè)為1temp.num=1; temp.f=0.0;pt.push_back(temp); /將該字符及其個(gè)數(shù)壓入向量 for (int i=1;i<count;i+)/對(duì)整個(gè)字符串進(jìn)行掃描temp.ch=stri; /暫存第二個(gè)字符temp.num=1;temp.f=0.0;for (int j=0;j<pt.size();j+) /在結(jié)構(gòu)向量中尋找是否有重復(fù)字符出現(xiàn) /假設(shè)重復(fù),該字符個(gè)數(shù)加1,
7、并跳出循環(huán)int k; /假設(shè)不重復(fù),那么壓入該字符,并跳出循環(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+) /計(jì)算不重復(fù)字符出現(xiàn)的概率pti.f=double(pti.num)/count; intnumber=pt.size(); /計(jì)算不重復(fù)字符出現(xiàn)的次數(shù) cout<<"各字符概率如下:n" for (i=0;i<number;i+) /顯示所得的概率,驗(yàn)證是否正確 if (c
8、ount=0) cout<<"NO sample!n" else ci=pti.ch; pi=pti.f; cout<<ci<<"的概率為:"<<pi<<endl; return number; /返回不重復(fù)字符的個(gè)數(shù)/求概率的輔助函數(shù)/假設(shè)搜索發(fā)現(xiàn)有重復(fù)字符返回正數(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-下一個(gè)編碼區(qū)間的上限,Low-下一個(gè)編碼區(qū)間的下限;/high-中間變量,用來(lái)計(jì)算下一個(gè)編碼區(qū)間的上限;/low-中間變量,用來(lái)計(jì)算下一個(gè)編碼區(qū)間的下限;/range-上一個(gè)被編碼區(qū)間長(zhǎng)度int i,j=0;for(i=0;i<number;i+)if(str0=ci) break; /編碼第一個(gè)字符while(j<i)Low+=pj+;
10、/尋找該字符的概率區(qū)間下限r(nóng)ange=pj; /得到該字符的概率長(zhǎng)度High=Low+range; /得到該字符概率區(qū)間上限for(i=1;i<size;i+) /開始編碼第二個(gè)字符for(j=0;j<number;j+) /尋找該字符在c數(shù)組中的位置if(stri=cj)if(j=0) /假設(shè)該字符在c數(shù)組中的第一個(gè)字符low=Low; /此時(shí)該字符的概率區(qū)間下限剛好為零high=Low+pj*range;High=high;range*=pj; /求出該字符的編碼區(qū)間長(zhǎng)度else /假設(shè)該編碼字符不是c數(shù)組中的第一個(gè)float proba_next=0.0;for(int k=
11、0;k<=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ū)間長(zhǎng)度else continue; /i+,編碼下一個(gè)字符cout<<endl;cout<<"輸入字符串的編碼為:"<<Low<<endl;return Low;/譯碼函數(shù)void yma(string
12、 str,char c,long double p, int number,int size,long double input)vector<char> v; /定義char類型向量vlong double temp; /中間變量long double sumN; /存儲(chǔ)不重復(fù)字符概率區(qū)間的下限sum0=0.0; /數(shù)組第一個(gè)元素為0 for (int i=1;i<number+1;i+) /計(jì)算數(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);tem
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租賃車輛管理辦法暫緩
- 小區(qū)公攤物業(yè)管理辦法
- 管理人員職務(wù)管理辦法
- 省級(jí)人民醫(yī)院管理辦法
- 房屋簽約制度管理辦法
- 眼部瑜伽培訓(xùn)課件文案
- 腸胃細(xì)胞健康課件
- 腸癰的護(hù)理課件
- 人事管理培訓(xùn)課件
- 店長(zhǎng)培訓(xùn)內(nèi)容流程課件
- 2025年中國(guó)工商銀行招聘筆試備考題庫(kù)(帶答案詳解)
- 新課標(biāo)(水平三)體育與健康《籃球》大單元教學(xué)計(jì)劃及配套教案(18課時(shí))
- 《生物安全培訓(xùn)》課件-2024鮮版
- GB/T 14454.4-2008香料折光指數(shù)的測(cè)定
- (完整版)形式發(fā)票模版(國(guó)際件通用)
- BIM技術(shù)在施工項(xiàng)目管理中的應(yīng)用
- 25公斤級(jí)平焊法蘭及螺栓規(guī)格尺寸
- 小升初火車過(guò)橋問(wèn)題
- 中文版EN-12546
- 動(dòng)葉可調(diào)式軸流風(fēng)機(jī)動(dòng)葉調(diào)節(jié)原理圖
- 長(zhǎng)三角地區(qū)地圖(可以隨意更改顏色、轉(zhuǎn)動(dòng)、組合))
評(píng)論
0/150
提交評(píng)論