SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

高速に符号/復号を行える最小冗長符号「Canonical Huffman Code」

最小冗長符号をHuffman木を作成せずに実現する


  • X ポスト
  • このエントリーをはてなブックマークに追加

本記事ではデータ圧縮の基盤である最小冗長符号を実現するCanonical Huffman Code(以下、CHC)を紹介します。最小冗長符号は、各文字の出現確率が分かっている場合にそのデータを最小長で表現可能な符号です。CHCは良く知られたHuffman符号の一種ですが、木を用いずに表引きのみで処理を行うので高速に符号/復号が可能です。また、符号の長さ制限をつけた場合の最適な符号を求めるreverse package merge法も紹介します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 「データ圧縮」は、必要な情報を残したまま、データをコンパクトに保存・伝送する技術であり、テキストや画像・動画情報の圧縮など、多くの場面で使われる情報化社会において不可欠なものとなっています。データ圧縮の中身は、「モデル化」と「符号化」の2種類に大きく分けられます。前者はデータをどのように表現するかを求める部分であり、後者はその表現したものをコンピュータ上でどう保存するかという部分です。今回扱うCHCは、この後者のための代表的な技術であり、モデルが分かっているデータを最も短い符号長注1で保存する技術です。

注1
 符号長を整数に限らない場合、さらに短い符号長で保存できる方法(算術圧縮符号など)も存在します。

対象読者

 C++の利用者を対象としています。データ圧縮の基礎を知っていることが望ましいです。

必要な環境

 C++、32bit環境を想定しています。Windows XP上のVisual Studio C++ 2005、gcc 3.2.2で動作確認済みです。

Huffman Codeの概要

 初めに、Huffman Code(以下、HC)について簡単に説明します。データ中に出現する各文字の出現確率が既に分かっている、もしくは予測できる場合に、多く出現する文字に対し短い符号を割り当て、あまり出現しない文字に対し長い符号を割り当てることで、データ全体の符号長を短くすることができます。このように各文字の符号の長さが違う符号(可変長符号)は、元のデータに間違いなく復元できる条件は必要ですが、HCはさらに次の条件を満たした符号を決定します。

  1. 瞬時復元可能である
  2. データ全体の符号長が最小である

 「瞬時復元可能」とは、符号化されたデータを前から順に見た時に、各符号が何の文字を表しているかを一意に決定できることであり、ある文字の符号が他の文字のprefixに含まれないことが必要十分条件です。

 例えば、文字a、b、cの符号がそれぞれ0、01、001の場合を考えて見ます。この場合、符号化されたデータが「0...」と並んでいたときに、先頭の「0」を読んだ段階で、それがaかbかcか分からないため、この符号は瞬時復元可能ではありません。それに対し、それぞれの符号が0、10、110ならば、先頭の「0」を読んだ段階でこの符号がaを表していると分かります(さらに上の符号では、一意に復元できません。001とある場合abかcか分かりません)。

 HCは各文字の出現確率の情報を用いてHuffman Treeを構成し、各文字の符号を決定します。こうして決定された符合は上の条件を満たします(証明は省略します)。Huffman Treeは次のようにして構成されます。

  1. 出現確率の小さい文字2つを選び、この2つを新しく作った節点の子とする。この節点の確率は選んだ2つの文字の出現確率の和とする。
  2. 1.の操作を節点が一つになるまで繰り返す。最後に残った節点を根とする。

 このように構成されたHuffman Treeはニ分木であり、葉が各文字に対応しています。各節点の左の子への枝に0、右の子への枝に1を割り当てます(逆の符号を割り当ててもよいです)。各文字の符号は、木の根から文字に対応する葉までたどっていった時に、各枝に付けられた符号をつなげたものです。例えば次の例では、各文字の符号が次のように求められます。

表1
文字番号出現回数最適な符号長符号
a6710
b113100
c73111
d63110
e541010
f441011
図1
図1

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
Canonical Huffman Codeの概要

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

岡野原 大輔(オカノハラ ダイスケ)

データ圧縮やデータ構造、またそれらの応用としての自然言語処理、機械学習に興味があります。http://hillbig.cocolog-nifty.com/(blog)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/376 2006/06/29 07:27

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング