web-dev-qa-db-ja.com

キロバイトブロックとポインタの可能なすべての順列のメモリは可能ですか?

これは私の頭を一周するのに十分難しいアイデアであり、編集者やヘルプをよく知っている人が読みやすくするために編集やヘルプをいただければ幸いです。

理論的には、1キロバイトのすべての可能なバイナリ順列の1つのコピーを保存したハードドライブを用意し、システムの残りの部分にこれらの場所へのポインターを作成させるだけですか?

そのような方法で作られたシステムは、単に情報を直接保存するよりも速くなりますか?

別の方法で説明するには、文章を書く代わりに次のように言います。

「こんにちは、ボブです。」そして、「そのサンドイッチは美味しそうです。」

...ハードドライブに保存すると、アルファベットやその他の文字のすべての順列が特定の数(たとえば、1000文字程度)になり、次のように文が保存されます。

[ポインタ#21381723]

2つあります8192 可能な異なる1Kブロック。それらをすべて保存するには28202 ストレージのビット。宇宙には約10しか含まれていないので80 (または〜2266)粒子、それはそれを安全に賭けるではないそれらをすべて格納することが可能であり、時間を節約するかどうかについて考える必要はありません。

しかし、実際にはこれに答えるもっと興味深い方法があります。定数の巨大なプールにインデックスを作成することを提案しています。しかし、どのインデックスを逆参照するかをどうやって知るのでしょうか?引数として、1文字のブロックのみを保存したいとします。abc...おそらく、インデックスは0、1になります。 2など、これらのブロックを格納する最も効率的なレイアウトです。

アレンジについて何か気づきましたか?あなたのインデックスは、実際には保存されたデータのコード化された表現です!つまり、逆参照する必要はなく、インデックスを必要なデータに変換するだけです。

テーブルに何かのall可能な値を格納すると、これは常に発生します。インデックスは単にデータ自体のエンコードされたバージョンになるため、データを格納しますそもそも不要になります。このため、現実の世界では、インデックスはスパースデータ(たとえば、アクセスしたすべてのWebページではなく、が存在する可能性があるすべてのWebページではない)にのみ役立ちます。またはすべてdoが存在します)。

91
Kilian Foth

他の人がすでに指摘したように、1kブロックの可能性は2 ^ 8192です。つまり、すべてのブロックアドレスが同じビット数でエンコードされている場合、ブロックのアドレスをエンコードするには8192ビットが必要になるため、アドレスは1kの長さになります。間接層を追加する以外は何も得られなかったので、パフォーマンスは得られません。

短いアドレスが必要な場合は、いくつかのブロックを短いアドレスでエンコードし、いくつかのブロックを長いアドレスでエンコードして、長いアドレスがそれほど頻繁に表示されないようにする必要があります。 a ハフマンコード )。そのためには、データを保存する前に、またはエンコードを定期的に変更する前に、保存しているデータについての知識が必要です。また、さまざまな長さのブロックを使用する他の圧縮アルゴリズムよりも効率が悪いでしょう。

20
user2313067

これには2つの問題があります。

まず、「1キロバイトのすべての可能なバイナリ順列」はhugeデータ量です。 1024バイト* 8ビット/バイト= 8192ビット/キロバイト。可能なすべての順列は2 ^ 8192になります。それは1.09e+2466キロバイト! (比較のために、1 TBドライブは1e09キロバイト。)

次に、そのような巨大なテーブルがあり、ポインタを使用してそのテーブルにインデックスを作成したとしても、ちょうど1 KBより小さいデータを参照したい場合はどうしますか?

1
Mason Wheeler