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


23

これは頭​​をかき回すのに十分なほど難しい考えであり、編集/ヘルプを知っている人にとって読みやすくするためにどんな編集/ヘルプも大いに感謝します。

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

このような方法で作成されたシステムは、単に情報を直接保存するよりも速いでしょうか?

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

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

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

[ポインター#21381723]



gitがどのように機能するのか、content addressableと呼ばれるのは面白いかもしれません。
JDługosz

5
github.com/philipl/pifsは、kbのすべての順列ではなく、piを使用することを除いて、あなたのアイデアと同じプリンシパルに基づいています。
ワックス

12
ポインターの長さは1キロバイトでなければなりません。英語では意味をなさないブロックを保存しないことを選択できます。その場合、圧縮のアイデアを独自に再発明しました。
user253751

基本的な答えはNOです-順列の数とサイズのために不可能ですが、可能であればどのようなアプリケーションが有用だと考えていましたか?
大天使

回答:


91

2つの8192種類の異なる1Kブロックがあります。それらをすべて保存するには、2つの8202ビットのストレージが必要です。宇宙はたったの約10含まれているので80(または〜2 266)粒子を、いることを安全な賭けだではありませんそれらすべてを保存することができ、そしてあなたはそれが時間を節約したりしませんかどうかについて疑問に持っていません。

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

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

何かの可能な値をすべてテーブルに保存すると、これは常に起こります。インデックスは単にデータ自体のエンコードされたバージョンになるため、最初からデータを保存する必要がなくなります。これが実際の世界では、インデックスはスパースデータに対してのみ有用です(たとえば、訪問したすべてのWebページ、存在する可能性のあるすべてのWebページ、または存在するすべてのWebページでさえありません)。


17
ある意味では、このシステムをすでに使用していますが、キロバイトサイズのビットパターンを怠zyに評価することで、大量のストレージスペースを節約できます。
セオドロスチャツィジアンナキス

3
オーバーラップ(1024個のゼロの後に1024個のゼロが含まれ、1025個の一意のパターンが含まれる)により、ストレージはわずかに減少します... また、1KBブロックは2 <sup> 10 </ sup>ではなく2 <sup> 13 </ sup>ビットです。
ベンフォイト

2
ユニバースのパーティクルの10 ^ 80制限は、ユニバースに10 ^ 80ビット以上を格納できないことを直接意味するわけではないことに注意してください-各パーティクルでは、1ビット以上の情報を格納できる可能性があるためです(宇宙内での位置、およびおそらくその速度などに基づきます)。ただし、1Kブロックごとに保存できるというわけではありません-それらの数はパーティクルの数を驚くほど大きく超えているため、すべてを保存することはできません。
psmears

2
@Neil「10 ^ 80」としてエンコードして10 ^ 80を保存できるコーディングシステムがある場合、「10 ^ 80」をどのように保存しますか?一部のデータが実際のデータよりも短くエンコードされる場合、他のデータは長くエンコードする必要があります。または、すべてのデータが数字である場合、各10進数を1バイト全体として格納しています。
Random832

3
デBruijnグラフ系列 2 ^ 1024ビットで十分でしょう。
グロノスタジュ

20

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

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


1

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

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

第二に、そのような巨大なテーブルがあり、ポインターでインデックスを付けたとしても、正確に1 KBより小さいデータを参照したい場合はどうしますか?


2
さらに1 KB未満のすべてのブロックを保存しても、それほど多くのスペースは必要ありません。バイトサイズのブロックのみを想定すると、小さいブロックを合わせたサイズは、1 KBブロックのサイズの1/256をわずかに超えています。ビットサイズのブロックを想定して、ほぼ同じサイズを再度追加します。
パエロエベルマン

-1

他のポスターが指摘しているように、ある時点で、可能なすべての値のリストにインデックスを付けるために必要なポインターのサイズは、ゲインを無効にします。

ただし、一部の言語では、メモリ使用量を最適化するために、提案されたものの限定バージョンを使用しています。Pythonは文字列「interning」を使用して、メモリ内の重複文字列の数を減らします。「python string intern」を検索すると、詳細情報を見つけることができます。


1
OPは、すべての順列を含む密集合について尋ねています。ポインターは、ポインターを保持するために必要なビットが指すビットよりも小さいスパースデータに対してのみ有用です。重複がある場合、インターンによりスペースがより疎になる可能性があるため、そこに接続がありますが、答えは実際にはうまく言い表せません。
ピーターコーデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.