ハフマン符号化プログラミング
- VisualStudioを使用して、ハフマン符号化プログラム(3次拡大)を作成します。
- 指定されたtxtファイルを読み込んで文字数を数え、文字の種類と発生確率を調べます。
- ツリー構造のアルゴリズムを使用して、各文字の値を2進数に変換し、txtファイルに保存します。
- ベストアンサー
ハフマン符号化プログラミング
学校の課題でVisualStudioで実現できるハフマン符号化プログラム(3次拡大)を作成せよ。という課題が出題されました。 しかし私は今まで入門程度のプログラミングしかやったことがなく、。指定されたファイルの文字数を調べる程度の事しかできない程度のプログラミングの知識なのでさっぱりです。 指定されたtxtファイルを読み込んで、文字数を数えて、文字の種類を調べて、各文字の発生確率を調べて、各文字を3次拡大行列にし、ツリー構造のアルゴリズムを作成し、各値を2進数に変換して、2進数に変換したものをtxtファイルにして保存するということは何となくわかるのですが、それを実現する知識がありません。 プログラミングの知識をお持ちの方のご協力をお願いいたします。
- requiem0901
- お礼率100% (1/1)
- C・C++・C#
- 回答数1
- ありがとう数1
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
「ハフマン符号化プログラム(3次拡大)を作成せよ。」 これだと、問題に不備があるとおもう。 入力情報源の符号はビット?バイト?その他? 一文字だとすると、文字コードによっては長さが変動するから、固定長の文字コードじゃないと無理だと思う。 例えば、 扱う文字が限定されているとか、 ファイルで使う文字コードが決まってるとか なにか他に限定する条件が必要。 この課題を素直に解釈すると、 ファイルの bit ストリームを、3bit ずつ区切るか、 ファイルの byte ストリームを、3byte ずつ区切るか して「一つの符号」とする。 1) 出現回数をカウントして 2) 二分木を構築する。 3) 構築した二分木から bit 列 → 「一つの符号」の対応テーブルをファイルに出力。 4) 作成した二分木をつかって、入力の「一つの符号」を順番に bit 列に変換しながら、ファイルに出力して、入力の「一つの符号」がなくなるまで繰り返す。 おしまい。 あと、必要な知識は、 二分木 http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8 連結リストは、二分木の前提知識 http://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90%E3%83%AA%E3%82%B9%E3%83%88 ハフマン符号化の為の、 - 「一つの符号」 - 出現回数 - 左右の子の接点の合計 をノードの属性として含めて、構造体かクラスにする。 クラスにするなら、二分木の操作をクラス関数に含める。 構造体 http://ja.wikipedia.org/wiki/%E6%A7%8B%E9%80%A0%E4%BD%93 クラス http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9_%28%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%29 ノードのソート http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88
関連する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ずつファイルに書き込む。 (ファイルポインタはグローバル変数で用意する)
- ベストアンサー
- C・C++・C#
- ブロックハフマン符号化プログラムの作成
現在学校の研究で「ブロック(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(圧縮対象データのファイルサイズ)です。 やはり、バッファリングに使う配列をもう少しサイズの大きい型で宣言するとこから始めるべきでしょうか? ご教授お願いします。
- ベストアンサー
- C・C++・C#
- プログラミング ファイル処理について
こんにちは いつもお世話になっています 今回は、プログラミングのファイル処理について質問させていただきます 大学で、読み取りファイルscores.txtを作成して、ファイル操作をするプログラミングの課題が出たのですが、そのscores.txtを保存する場所が分かりません 配布された資料には、「VisualStudioを用いてる場合は,コードと同じ場所を探索し,コードと同じ場所に作成」と書いてあるのですが、よく分かりません 基本的なことで申し訳ないのですが、ファイルの保存場所、保存方法について詳しく教えていただけないでしょうか?
- ベストアンサー
- C・C++・C#
- いくつかのファイルの一致を確認するプログラミングの作り方。
いくつかのファイルの一致を確認するプログラミングの作り方。 例えば7個のtxtファイル a, b, c, d, e, f, g があるとします。 a, b, c, d, e, f, g はそれぞれのファイルのファイル名です。 そのうち、 a, b, g のファイルの内容が全く同じであった場合、 a, b, g は一致していると判断するには、どんなプログラムを作成すればよいのでしょう? ちなみにファイルの中身は 数字が配列のように並んでおり、文字数は5000文字程度です。
- ベストアンサー
- 大学・短大
- [Java]プログラミング初心者なため解りません。
はじめまして。 大学でJavaの課題を出されたのですが、プログラミング初心者なため方法がわかりません。どなたか助けていただきたいです。 課題 まず、以下のようなファイル(test.dat)を作成する 1 2 3 4 5 6 7 8 9 10 このファイルを読み込み、次のような結果をファイル(kekka.dat)として出力するプログラムを作成せよ。 1 + 2 = 3 3 + 4 = 7 5 + 6 = 11 7 + 8 = 15 9 + 10 = 19 なんとか自力でファイルの入出力を行うことはできたのですが、文字列を操作して出力する方法がわかりません。 どなたか教えていただけないでしょうか。 よろしくお願いします。
- ベストアンサー
- Java
- プログラミングができません
友人に相談を受けたのですが、回答できなくて困っています。 条件1)ファイル名を引数とする。 条件2)-の後にオプション指定できる。 例)特定の文字数をカウントする。 -オプションで複数文字指定。 特定の文字を大文字に変換する。 -オプションで複数文字指定。-abd 特定の単語の数を数える。 -オプションで単語を指定。-word そのほか、各自でアイデアを発揮すること。 処理対象は、ファイルとする。 というようなプログラムを作りたいのです。 よろしくお願いいたします。 (自分で作ったらエラーだらけで、全くできませんでした…)
- ベストアンサー
- C・C++・C#
- shellプログラミングで困っています。。
こんにちは。 お世話になっております。 現在shellを用いてツールを作りたいのですが、 上手くいかず困っています。 どなたか教えてください(>_<)!! "1","あああ","いいい" というようなCSVファイルを番号の部分だけ どんどん連番になるようなshellを作りたいです。 "1","あああ","いいい" "2","あああ","いいい" "3","あああ","いいい" ・ ・ ・ といった感じで。。。 そのshellはユーザにスタートの番号とカウント数を入力させると、 指定されたスタート番号からカウント数分だけ データを作るといった感じにしたいのです。 例えば、ユーザがスタート数:5とカウント数:2 と指定したら "5","あああ","いいい" "6","あああ","いいい" といったcsvファイルが作成される感じです。 作成するcsvファイルは1つで中身が ユーザの指定によって変化する仕様です。 shellプログラミングは全くの初心者で 何から手を付けていいのかもわからず困っています。 期限が迫っていてどうしようもないので どなたか教えてください。。 お手数ですが、よろしくお願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- プログラミング、C言語について・・・
プログラミング、C言語について・・・ 大学の宿題でわからないところがありまして・・・ 課題は、 キーボードから入力した数だけ、*(アスタリスク)を表示するようなプログラミングを作成せよ また、表示を見やすくするため*が10個表示されるたびに改行を入れよ。 なんですが とくにキーボードから入力した数だけ、*(アスタリスク)を表示するようなプログラミング がわからなくて困ってます。 あとこのプログラミングではforではなくてwhileでお願いします。 わがまま多いですがよろしくお願いします。
- 締切済み
- C・C++・C#
- 台形則のプログラミング
http://www.sist.ac.jp/~suganuma/cpp/2-bu/7-sho/C++/daikei.txt このサイトのプログラミングを参考にして、いろいろいじっているのですが、分割数、積分範囲の指定、積分する関数の変更 がよくわかりません。 具体的には、 分割数、範囲は改めて数を宣言するのか?それともこのプログラミングにある、x1、x2などにそのまま代入するのか? 関数は真ん中にあるreturn ~の部分だけ変更すればいいのか? ということがわかりません。 回答、アドバイス等ありましたらお願いします!
- 締切済み
- C・C++・C#
お礼
ご回答ありがとうございます。 データの中の文字の種類がABCDの4種類の英字だということを書き忘れていました(-_-;) ご紹介いただいたサイトで少し勉強してみます(#^.^#)