⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h_code.cpp

📁 一个n元编码
💻 CPP
字号:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>

using namespace std;

class H_coding{
public:
	double probablity;
	string code;
	bool connect;
    H_coding();
	H_coding(double pro,string cod,bool con);
	H_coding operator &= (const H_coding cod);
};
H_coding::H_coding(){
		probablity=0;
		code="";
		connect=false;
}
H_coding::H_coding(double pro,string cod,bool con){
	probablity=pro;
	code=cod;
	connect=con;
}

H_coding H_coding::operator &= (const H_coding cod){
	H_coding cod1;
	cod1.probablity=cod.probablity;
	cod1.code=cod.code;
	cod1.connect=cod.connect;
	return cod1;
}

typedef vector<H_coding> Arrary1;


void adding(int m,Arrary1 &a1){
	H_coding coding1(0,"",false);
	int append=0;
	a1.size();
	while((((a1.size()+append)-m)%(m-1))!=0)
		append++;
	for(int i=0;i<append;i++)
		a1.push_back(coding1);
}

int locate_a(double x,Arrary1 a1){
	int locate=0;
	for(;locate<a1.size()&&x<a1[locate].probablity;locate++);
	return locate;
}

int locate_b(double x,Arrary1 a1){
	int locate=0;
	for(;locate<a1.size()&&x<=a1[locate].probablity;locate++);
	return locate;
}

void move(Arrary1 &a1,int i){
	H_coding cod;
	Arrary1::iterator pit;
	pit=a1.begin();
	for(int j=0;j<i;j++)pit++;
	do{
		cod=a1[a1.size()-1];
		a1.insert(pit,cod);
		a1.pop_back();
	}while(a1[a1.size()-1].connect==true);
}

void coding_a(Arrary1 &a1,int N,int m){
	if(N>1){
	int j=m-1;
	int k=a1.size();
	int h=m;
	double temp=0;
		while(j>=0){
			do{
				k--;
			temp+=a1[k].probablity;
			a1[k].code=char(48+j)+a1[k].code;
			}while(a1[k-1].connect==true&&k>=1);
			j--;
			if(j>=0&&k>=1)a1[k-1].connect=true;
		}
		move(a1,locate_a(temp,a1));
		coding_a(a1,N-m+1,m);
	}
}

void coding_b(Arrary1 &a1,int N,int m){
	if(N>1){
	int j=m-1;
	int k=a1.size();
	int h=m;
	double temp=0;
		while(j>=0){
			do{
				k--;
			temp+=a1[k].probablity;
			a1[k].code=char(48+j)+a1[k].code;
			}while(a1[k-1].connect==true&&k>=1);
			j--;
			if(j>=0&&k>=1)a1[k-1].connect=true;
		}
		move(a1,locate_b(temp,a1));
		coding_b(a1,N-m+1,m);
	}
}

bool sortsp(H_coding cod1,H_coding cod2){
	if(cod1.probablity>cod2.probablity)
		return true;
	else
		if(cod1.probablity=cod2.probablity)
			return cod1.code.size()<cod2.code.size();
		else
			return false;
}

void display(Arrary1 a1){
	cout<<"符号       概率               码字              码长"<<endl;
	string s1;
	sort(a1.begin(),a1.end(),sortsp);
	for(int i=0;i<a1.size();i++){
		s1="u";
		s1+=char(49+i);
		cout<<s1<<"      "<<a1[i].probablity<<"               "<<a1[i].code<<"           "<<a1[i].code.size()<<endl;
	}
}

int main(){
	H_coding cod2;
	
	double a[5]={0.4,0.2,0.2,0.1,0.1};
	
	int m;
	for(;;){
		cout<<"                      H码编码                   "<<endl;
		cout<<"                     =========                  "<<endl;
		cout<<"                     1.方法A                    "<<endl;
		cout<<"                     2.方法B                    "<<endl;
		cout<<"                 请选择(1或2,0:退出):           "<<endl;
		int j;
		cin>>j;
		switch(j){
		case 1 :{ 
			Arrary1 a1;
			for(int i=0;i<5;i++){
		cod2.probablity=a[i];
		a1.push_back(cod2);
	}
			cout<<"输入码元数:"<<endl;
			cin>>m;
			adding(m,a1);
			int l=a1.size();
			coding_a(a1,l,m);
			display(a1);
				break;}
		case 2 :{
			Arrary1 a1;
			for(int i=0;i<5;i++){
		cod2.probablity=a[i];
		a1.push_back(cod2);
	}
			cout<<"输入码元数:"<<endl;
			cin>>m;
			adding(m,a1);
			int l=a1.size();
			coding_b(a1,l,m);
			display(a1);
				break;}
		case 0 :
			return 0;
		}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -