• 締切済み

ハフマン符号化について

ハフマン符号化についてですが、圧縮のためであるので、 ハフマン符号化を行いなさいといわれた場合において、 木構造の1と0の取り方はどんなものでも良いのでしょうか? 生起確率が A:0.12 B:0.12 C:0.28 D:0.48 であった場合、 添付画像の青い文字のように符号化を行い、 A:000 B:001 C:01 D:1 としても、赤い文字のように符号化を行い、 A:111 B:110 C:10 D:0 としても、どちらでもハフマン符号化としては正解なのでしょうか? また、0と1を階層ごとにランダムにとっても問題ないのでしょうか?

みんなの回答

  • foomufoomu
  • ベストアンサー率36% (1018/2761)
回答No.2

2つは、1と0が反転しているだけで、論理上は同じものです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どんなふうにしてもいいです.

関連するQ&A

  • ハフマン符号のプログラム

     以下の問題に回答できる方,いらっしゃいましたらソースファイルと実行結果を送ってください。  ファァイル(記号列)を読み込んで,ハフマン符号によりファイルを圧縮するプログラム(C言語)を作成する(プログラムは,圧縮を行うものと,解凍を行うものの2つ作る)。また,いくつか適当なファイルに対して,圧縮を行い圧縮率を測定する。 (1)圧縮プログラムについて  圧縮のステップ  (a)入力ファイルを読み込み各記号の出現頻度をカウントする。  (b)得られた出現頻度を使って各符号のハフマン符号を生成する。  (c)各符号の出現頻度を出力ファイルに書き出す。  (d)もう一度入力ファイルを読み込みながら各符号をハフマン符号で置き換え    て出力ファイルに出力する。圧縮ファイルの形式は次のようになる。   0x00の  0x01の … 0xffの 先頭文字の 2文字目の … 終端文字の   出現頻度 出現頻度 出現頻度 符号語   符号語    符号語    (c)で書きこむ部分      (d)で書きこむ部分 (2)解凍プログラムについて  解凍のステップ  (a)各符号の出現頻度を圧縮ファイルから読み込む。  (b)得られた出現頻度を使って各符号のハフマン符号を生成する。  (c)圧縮ファイルの符号語を読み込みながら各符号のハフマン符号と比較しも    し一致したらその記号を解凍ファイルに出力する。  (d)(c)をファイルの終わりもしくは出現頻度をすべて足し合わせた記号数分処   理するまで繰り返す。  関数について  関数get_bit  ファイルから1bit読み込んで戻り値として返す。  (ファイルポインタはグローバル変数で用意する)  関数put_bit  引数として0,または1を渡すと1bitずつファイルに書き込む。  (ファイルポインタはグローバル変数で用意する)

  • ハフマン符号化による圧縮

    1と0からだけでできた100文字の列を4ビットごとに区切ってハフマン符号化による圧縮したいのですが、いまいちわかりません。どなたか教えてください。

    • ベストアンサー
    • Java
  • ハフマン符号の圧縮率について

    こんにちは。現在、情報処理技術者試験の勉強をして いるのですが、ハフマン符号の圧縮率を問う問題でつ まずいています。 問題は、 同じ文字が、4文字以上続いた場合、(文字)*(文字 数)の3バイトで表す。Aが15文字連続ならA*15の3 バイトです。(厳密には15(2桁)が1バイトで表せな いと思いますが、この問題ではそうなっています。)  その前提で、「同じ文字がn個(1<=n<=15)続く確 率を表1のとおり仮定した場合の圧縮率は何パーセン トか。小数点第一位を四捨五入して答えよ。」(1文字 は1バイトとする) 表1 n   確率 1 0.6   2 0.03 3 0.03 4 0.03 5 0.03 6 0.03 7 0.03 8 0.03 9 0.03 10 0.03 11 0.03 12 0.025 13 0.025 14 0.025 15 0.025 問題は以上です。 私は、1000回事象が起きたと仮定して、 0.6は600回、0.03は30回、0.025は25回 として考えました。 まず、圧縮しない場合、 1*600=600byte(以下b) 2*30=60b 3*30=90b 4*30=120b 5*30=150b 6*30=180b 7*30=210b 8*30=240b 9*30=270b 10*30=300b 11*30=330b 12*25=300b 13*25=325b 14*25=350b 15*25=375b 合計 3800b 次に、圧縮した場合、n=3までは、 1*600=600byte(以下b) 2*30=60b 3*30=90b 合計、750b 4以上は3バイトに圧縮なので、 3b*30=90 これが、4~11まで同じ確率なので、 合計 3b*30*8=720b 12~15は25回なので、 合計 3b*25*4=300b 圧縮した場合の 合計、750+720+300=1770b 圧縮率 1770/3800=47% 解答は、79% でした。字数制限で、詳細を記入できな いのですが、なぜ食い違うのか分かりません。 大変な長文ですみません。よろしくお願いします。

  • ハフマン符号化の問題を解くプログラム

    ハフマンの符号化の問題を解くプログラムをC言語(コンソールアプリケーション)で作りたいのですが ファイルの圧縮とかをするプログラムはいろいろなサイトにあったのですが、 簡単な情報源を与えられたものを符号化するプログラムで参考にできるようなサイトは見つかりませんでした。 誰かプログラムの例を教えていただけないでしょうか? 入力する例はつぎのようなものです S=(a1, a2, a3, a4, a5, a6/0.35, 0.15, 0.15, 0.20, 0.10, 0.05)

  • ハフマン符号 情報源記号と符号語の対応表

    S=(a1 0.15 , a2 0.3 , a3 0.05 , a4 0.2 a5 0.25 , a6 0.05) この情報源Sに対するハフマン符号をハフマン符号の木を構成することにより、情報源記号と符号語の対応表を示せ。 という問題があるのですが、これについて質問です。 符号の木は、これらのa1~a6が二進数でどうなるのかがわからないと書けないと思うのですが、この問題にはその二進数の割り当てがしてありません。 これは最初からa1ならば0やa2ならば01という風に決まっていたり、また、勝手に割り当ててもいいのでしょうか? どなたかご教授お願いします。

  • ブロックハフマン符号化プログラムの作成

    現在学校の研究で「ブロック(n次拡大情報源)ハフマン符号化」プログラムをC言語で作成しています。 これは、通常のハフマン符号化でデータ1個ごとに出現頻度を調べてそれぞれにハフマン符号を割り当てるところを、ファイル中で隣り合うデータ2個(あるいは3個、4個、・・・n個)を一かたまりと見なし、それぞれの出現頻度を調べてハフマン符号を割り当てる、というものです。 通常のハフマン符号化は以前作成したことがあるのですが、これをどのようにして上記のようなプログラムに改変すればいいのかわかりません。 ちなみに、データのバッファリングは以下のようにし、 #define BUFFER_SIZE 102400 unsigned char buffer[BUFFER_SIZE]; (中略) int i,c; i = 0; while(i < BUFFER_SIZE && (c = fgetc(fp_i)) != EOF) { buffer[i] = c; i++; } 各データの出現頻度は以下のようにして調べています。 #define N 256 (中略) int hist[N * 2]; for(i = 0;i < (N * 2);i++) hist[i] = 0; for(i = 0;i < size;i++) hist[data[i]]++; ※data[i]は前述のbuffer[i]、sizeは前述のi(圧縮対象データのファイルサイズ)です。 やはり、バッファリングに使う配列をもう少しサイズの大きい型で宣言するとこから始めるべきでしょうか? ご教授お願いします。

  • Huffman木の作成の問題

    Huffman法のプログラムを作成する上で、Huffman木の作成と符号化のところがなかなか出来なくて困っています。 英文を読み込んで、各文字の出現回数を数えて、というところまではいけるのですが… 教えていただけませんか?

  • ハフマン符号化プログラミング

     学校の課題でVisualStudioで実現できるハフマン符号化プログラム(3次拡大)を作成せよ。という課題が出題されました。  しかし私は今まで入門程度のプログラミングしかやったことがなく、。指定されたファイルの文字数を調べる程度の事しかできない程度のプログラミングの知識なのでさっぱりです。  指定されたtxtファイルを読み込んで、文字数を数えて、文字の種類を調べて、各文字の発生確率を調べて、各文字を3次拡大行列にし、ツリー構造のアルゴリズムを作成し、各値を2進数に変換して、2進数に変換したものをtxtファイルにして保存するということは何となくわかるのですが、それを実現する知識がありません。  プログラミングの知識をお持ちの方のご協力をお願いいたします。

  • Huffmannのプログラム

    Huffman法のプログラムをC言語で作成する上で、Huffman木の作成と符号化のところがなかなか出来なくて困っています。 英文を読み込んで、各文字の出現回数を数えて、というところまではいけるのですが… 教えていただけませんか?(特にHuffman木を作るところ) Huffman法の仕組みは分かるのですが…

  • 符号化について

    現在、ソフトウェア関連の勉強をしているのですが、 符号化についてのテキストで 「'a'~'d'を符号化する場合、1文字あたり2ビットあれば それを一意に認識できる」 とあるのですが、意味がわかりません。 教えてください。