
No.1ベストアンサー
- 回答日時:
木の作り方によって得られる符号は微妙に違いますのでこれは参考です。
シンボルと頻度テーブルから木を作って符号一覧を表示します。
符号化だけならleftとrightは不要です(復号化のとき使う)
#include <stdio.h>
#define N 6 /* N>=2 */
char *s[N]={"a1","a2","a3","a4","a5","a6"};
float f[2*N-1]={0.35,0.15,0.15,0.20,0.10,0.05};
int size=N, parent[2*N-1], left[2*N-1], right[2*N-1];
/* ハフマン木の作成 */
void huff(void) {
int i,j,dat1,dat2;
float min;
/* 初期化 */
for (i=0;i<2+N;i++) left[i]=right[i]=parent[i]=0;
/* 最小頻度2個をまとめ続ける */
while(1) {
/* 一番小さい数を探す */
for (i=0;i <size;i++) if (f[i]>=0) break;
if (i==size) break; /* 頻度リストが空? */
dat1=i; min=f[dat1];
for (;i<size;i++) if (f[i]<min && f[i]>=0) {min=f[i]; dat1=i;}
/* 二番目に小さい数を探す */
for (i=0; i<size; i++) if ((f[i]>=0)&&(i!=dat1)) break;
if (i==size) break; /* 頻度リストが1個しかない */
dat2=i; min=f[dat2];
for (;i<size;i++) if (f[i]<min && f[i]>=0 && i!=dat1) { min=f[i]; dat2=i; }
/* 木に登録 */
left[size]=dat1; right[size]=dat2;
parent[dat1]=size; parent[dat2]= -size;
f[size]=f[dat1]+f[dat2]; f[dat1]= -1; f[dat2]= -1;
size ++;
}
}
/* ハフマン符号の出力 */
void outenc(int huf) {
if (huf== size-1) return;
if (parent[huf]<0) {
outenc(-parent[huf]); printf("1");
} else {
outenc(parent[huf]); printf("0");
}
}
/* メインルーチン */
int main(void) {
int i;
huff();
for (i=0; i<N; i++) { printf("%s ",s[i]); outenc(i); printf("\n"); }
return 0;
}
この回答へのお礼
お礼日時:2008/07/05 00:47
詳しい説明ありがとうございます。
コメントが多いのでとてもわかりやすかったです。
これを参考にいろいろ変えて試してみます。
本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
whileとifを使い偶数を出すには
-
乱数で交互に偶数、奇数が、、、。
-
C言語でDOS画面のプログラム(...
-
異なるn個の整数からr個の整数...
-
条件が多い場合
-
デバッグビルドとリリースビル...
-
C言語で%を使わない余りの出し方
-
intとlongは同じ?
-
Aの値からBの値を除するとは??
-
信頼区間の1.96や1.65ってどこ...
-
c languageで 簡単な質問があ...
-
エクセルで可視セルにのみ値貼...
-
20'(角度)の計算がわかりま...
-
scanfの入力をgets関数で読み捨...
-
マイナスからプラスへ転じた時...
-
値差の%計算方法について
-
「Aに対するBの割合」と「Aに対...
-
gcc: incompatible pointer type
-
「指定されたキャストは有効で...
-
CStringをwchar_tに変換したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語で簡単なパックマンゲーム...
-
2の補数を計算するプログラム
-
c言語プログラミングについて f...
-
再起呼び出しの回数をカウント...
-
intとlongは同じ?
-
openCVの画像処理について
-
C言語
-
【C#】SQL文の中に変数を埋め込...
-
C言語プログラミング 漸化式に...
-
カードシャッフルのブログラム...
-
C++ Debug Errorについて教えて
-
デバッグビルドとリリースビル...
-
迷路を脱出する経路探索プログ...
-
C++デバックエラーについて詳し...
-
C++ bmp 透過処理
-
複数の共有メモリの作成
-
C言語で%を使わない余りの出し方
-
C言語
-
2次関数プログラムを描写する...
-
16bitで乱数を生成する方法
おすすめ情報