Ist eine Erinnerung an alle möglichen Permutationen eines Kilobyte-Blocks und Zeigern möglich?


23

Dies ist eine schwierige Idee, die mir den Kopf zerbrechen lässt, und ich würde mich sehr über Änderungen / Hilfen freuen, um sie für Kenner besser lesbar zu machen.

Ist es theoretisch möglich, eine Festplatte zu haben, auf der eine Kopie jeder möglichen binären Permutation von einem Kilobyte gespeichert ist, und dann vom Rest des Systems einfach Zeiger auf diese Speicherorte zu erstellen?

Wäre ein solches System schneller als die direkte Speicherung von Informationen?

Um einen anderen Weg zu erklären, sagen Sie, anstatt Sätze zu haben:

"Hallo, ich bin Bob." und "Das Sandwich sieht köstlich aus."

... auf der Festplatte gespeichert, haben wir alle Permutationen des Alphabets und andere Zeichen bis zu einer bestimmten Zahl (z. B. 1000 Zeichen oder so) und haben dann unsere Sätze als so etwas wie gespeichert:

[Zeiger # 21381723]


21

Sie finden es interessant , wie git Werke, genannt inhaltsadressierbaren .
JDługosz,

5
github.com/philipl/pifs Basiert auf demselben Prinzip wie Ihre Idee, außer dass statt aller Permutationen eines kb pi verwendet wird.
Waxen,

12
Ihre Zeiger müssten 1 Kilobyte lang sein. Sie können festlegen, dass die Blöcke, die auf Englisch keinen Sinn ergeben, nicht gespeichert werden. In diesem Fall haben Sie die Idee der Komprimierung unabhängig neu erfunden.
user253751

Grundlegende Antwort ist NEIN - es ist unmöglich aufgrund der Anzahl und Größe der Permutationen. Aber für welche mögliche Anwendung hielten Sie es für nützlich, wenn es möglich wäre?
Erzengel

Antworten:


91

Es gibt 2 8192 mögliche unterschiedliche 1K-Blöcke. Das Speichern würde 2 8202 Bit Speicherplatz beanspruchen . Da das Universum nur etwa 10 80 (oder ~ 2 266 ) Partikel enthält, können Sie mit Sicherheit nicht alle speichern, und Sie müssen sich nicht fragen, ob dies Zeit spart oder nicht.

Tatsächlich gibt es jedoch eine interessantere Möglichkeit, dies zu beantworten. Sie schlagen vor, einen Index für einen riesigen Konstantenpool zu erstellen. Aber woher wissen Sie, welcher Index dereferenziert? Stellen Sie sich vor im Interesse eines Arguments , dass Sie nur 1-Zeichenblöcke speichern wollen: a, b, c... Vermutlich Ihre Indizes wären 0, 1, 2 usw., denn das ist das effizienteste Layout dieser Blöcke zu speichern.

Merken Sie etwas über das Arrangement? Ihr Index ist in der Tat eine verschlüsselte Darstellung der gespeicherten Daten ! Mit anderen Worten, Sie müssen überhaupt nicht dereferenzieren, sondern nur den Index in die gewünschten Daten umwandeln.

Wenn Sie alle möglichen Werte von etwas in einer Tabelle speichern , geschieht dies immer: Ihr Index wird lediglich zu einer verschlüsselten Version der Daten selbst, sodass das Speichern der Daten überhaupt nicht mehr erforderlich ist. Aus diesem Grund sind Indizes in der realen Welt nur für spärliche Daten nützlich (z. B. für alle von Ihnen besuchten Webseiten, nicht für alle Webseiten, die existieren könnten , oder sogar für alle, die existieren).


17
In gewisser Weise verwenden wir dieses System bereits - aber wir tun dies mit einer verzögerten Auswertung der Bitmuster in Kilobyte-Größe, wodurch wir Tonnen an Speicherplatz einsparen können!
Theodoros Chatzigiannakis

3
Der Speicher wird aufgrund von Überlappungen leicht reduziert (1024 Nullen, gefolgt von 1024 Einsen, enthalten 1025 eindeutige Muster) ... reduziert, aber immer noch unglaublich groß. Ein 1-KB-Block besteht auch aus 2 bis 13 Bits und nicht aus 2 bis 10 Bits.
Ben Voigt

2
Beachten Sie, dass das 10 ^ 80-Limit für Partikel im Universum nicht direkt bedeutet, dass Sie nicht mehr als beispielsweise 10 ^ 80 Bits im Universum speichern können - denn mit jedem Partikel können Sie möglicherweise mehr als ein Bit an Informationen speichern ( basierend auf seiner Position im Universum und möglicherweise seiner Geschwindigkeit usw.). Das bedeutet jedoch nicht, dass Sie jeden 1-K-Block speichern können - die Anzahl dieser Blöcke übersteigt die Anzahl der Partikel um einen erstaunlich großen Faktor. Es ist also immer noch eine sehr sichere Sache, dass Sie nicht alle speichern können!
Psmears

2
@Neil Wenn Sie ein Codierungssystem haben, mit dem Sie 10 ^ 80 speichern können, indem Sie es als "10 ^ 80" codieren, wie speichern Sie dann "10 ^ 80"? Wenn einige Daten kürzer als die tatsächlichen Daten codiert werden, müssen andere länger codiert werden. Wenn es sich bei allen Daten um Zahlen handelt, wird jede Dezimalstelle als ganzes Byte gespeichert.
Random832

3
Bei de Bruijn-Sequenzen würden 2 ^ 1024 Bits ausreichen.
Gronostaj

20

Wie bereits erwähnt, haben Sie 2 ^ 8192 Möglichkeiten für einen 1k-Block. Dies bedeutet, dass Sie 8192 Bits benötigen, um die Adresse eines Blocks zu codieren, wenn alle Blockadressen mit der gleichen Anzahl von Bits codiert sind, sodass Ihre Adressen 1 KB lang wären. Sie hätten nur eine Indirektionsebene hinzugefügt, um keine Leistung zu erzielen.

Wenn Sie kürzere Adressen haben wollten, müssten Sie einige Blöcke mit einer kurzen Adresse und einige mit längeren codieren und sie so gestalten, dass lange nicht so oft erscheinen, und Sie komprimieren jetzt einfach Daten (wahrscheinlich mit so etwas wie ein Huffman-Code ). Dies würde die Kenntnis der Daten erfordern, die Sie speichern, bevor Sie sie speichern, oder regelmäßige Änderungen der Codierung. Es wäre wahrscheinlich auch weniger effizient als andere Komprimierungsalgorithmen, die Blöcke unterschiedlicher Länge verwenden.


1

Damit sind zwei Probleme verbunden.

Erstens sind "alle möglichen binären Permutationen von einem Kilobyte" eine riesige Datenmenge. 1024 Bytes * 8 Bits pro Byte = 8192 Bits in einem Kilobyte. Alle möglichen Permutationen wären 2 ^ 8192. Das sind ungefähr 1.09e+2466Kilobyte! (Zum Vergleich: Ein 1-TB-Laufwerk ist 1e09Kilobyte groß.)

Zweitens, selbst wenn Sie eine so große Tabelle hätten und sie mit Zeigern indizieren würden, was würden Sie tun, wenn Sie auf Daten verweisen möchten, die kleiner als genau 1 KB sind?


2
Das Speichern aller Blöcke, die kleiner als 1 KB sind, nimmt nicht viel mehr Platz in Anspruch. Nimmt man nur Blöcke mit Byte-Größe an, so ist die Größe der kleineren Blöcke zusammen etwas größer als 1/256 der Größe der 1-KB-Blöcke. Unter der Annahme von Blöcken mit Bitgröße fügen Sie wieder ungefähr dieselbe Größe hinzu.
Paŭlo Ebermann,

-1

Wie andere Plakate bereits erwähnt haben, hebt die Größe des Zeigers, der für die Indexierung aller möglichen Werte in Ihrer Liste erforderlich ist, Ihren Gewinn auf.

Einige Sprachen verwenden jedoch eine eingeschränkte Version Ihrer Vorschläge, um die Speichernutzung zu optimieren. Python verwendet String-Internierung, um die Anzahl der doppelten Strings im Speicher zu verringern. Weitere Informationen finden Sie, wenn Sie nach "Python String Intern" suchen.


1
Das OP fragt nach einer dichten Menge, die jede Permutation enthält. Zeiger sind nur für spärliche Daten nützlich, bei denen die zum Halten eines Zeigers erforderlichen Bits kleiner sind als die Bits, auf die gezeigt wird. Internierung kann den Platz sparsamer machen, wenn Duplikate vorhanden sind, sodass dort eine Verbindung besteht, aber Ihre Antwort formuliert es nicht wirklich gut.
Peter Cordes
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.