「遊びのレシピ」という本に書いてある以下の文章が理解できません。テーブルデータの数を少なくするには、たとえば、テーブル範囲の最大数が65,536個の場合、4ビット幅に分割することでテーブルに使うデータは4ビットの最大値となる16(0x1111)個だけで済むようになります。値を変換するときは「変換したい値」をこのビット幅に分割してから値を引き出します。得られた値は分割したときの順序に従って組み立てます。済むということでしょうか?変換したい値を4ビット幅に分割するというのは16進数にすることかな?得られた値は分割したときの順序に従って組み立てる。いうところは、まったく分かりません。69904(10進数)オフトピックそういえば、おどるかばね。256という記述があったな...。考えても左辺は奇数、右辺は偶数なんだよな...。5年前その本を読んだことはありませんが、アマゾンの評価すさまじく低いようですね。配列を小さくしたいなら、サンプルあげます。本の作者の意図にあった回答がほしければ、改善前のコードとどう改善したいかを提示しないと答えようがありません。懐かしいなあと思いつつ本棚を探すとあったので、私なりの解釈を説明します。この本ではテーブル参照を高速化のテクニックとして紹介しています。答えが分かっているなら予めソースコードなり初期化関数なりで、xに対するyを直ぐに引き出せるようにしましょう、というものです。テーブルに収めるときにxが取りうる種類(範囲)や、yのサイズによってはテーブルのサイズが大きくなります(xの範囲とyのサイズの積がテーブルのサイズです。)本の例ではxが65,536個、yが4バイトで、なんと256キロバイトも使用してしまいます。するか?本の例では4bit単位にxを分割するとあります。xは16bitで表すことができるデータなので、xを4bitずつに分割するとx0,x1,x2,x3という風に分割できる筈です。y0=f0(x0)、y1=f1(x1)、y2=f2(x2)、y3=f3(x3)、y=f(x)=g(y0,y1,y2,y3)、となるような関数f0,f1,f2,f3,gがあったとします。ここでf0,f1,f2,f3にそれぞれテーブル参照のテクニックがつかえると考えてください。y0を求めるテーブルサイズはx0が16個×データが4バイトで64バイト、y1,y2,y3も同様なので、64×4=256バイトとなります。xをx0,x1,x2,x3に分割する前のテーブルサイズが256キロバイトに対し、大幅に必要メモリ量を削減できています。「得られた値は分割したときの順序に従って組み立てます。」という表現は上記関数g()が該当すると思ってください。まとめると、xという入力に対し、処理fの結果yを求めるものがあった時に、1.テーブルを使用してfの実行にかかる時間を1度のテーブル参照に要する時間まで短縮させる。メモリ使用量が大きくなるかも。2.メモリ使用量を削減するために、xを分解し、分解した数だけテーブルを参照し、その結果を結合する。1より遅くなるけど、fの実行より早いはず。メモリ使用量は1より少なくなるはず。これはxがうまく分解できること、yをうまく結合できることが大前提です。ここの文章は、"xやyの性質をよく考えると"メモリを節約しつつ高速化できるかもね、くらいの理解でよろしいと思います。5年前>みけCATさん16(0x1111)からしておかしいですよね。さんこの本の作者はプログラマーとしては優秀かもしれませんが文書力や解説力が欠如していると思われます。アマゾンでの評価が低いのも納得できます。サンプルコードは頭の中に大切にしまっておきますね。>Pocoさんすばらしい解説ありがとうございます。長年の疑問が解決しました。要素が16個のテーブルが4つあって、4つの答えを元にして1つの答えを出すんですね。さんのコードがメモリリークしている上にdeleteがまちがっています。あとたとえ間違っていなくても意図が不明です。5年前そのようですね。一応*で注意コメントもありますし、大丈夫でしょう。脳内イメージはだいたいバグ入りですよ。それはどんなベテランにも言えることです。優れたソフトを作るには、優れた設計、優れたエンジニア、そして優れたテストケース。どれが欠けてもダメです。table[i];*優れたコード技法があるのに、優れた設計が書けないとは我ながら情けないことです。*softyaさんがそんな自分を救える期限はあと9時間!アドバイスお待ちしております^-^*というわけで、今度こそ座学に戻りますよ。ミクプラは自由にリンクできます。