È possibile un ricordo di tutte le possibili permutazioni di un blocco di kilobyte e di puntatori?


23

Questa è un'idea abbastanza difficile da avvolgere la testa e apprezzerei molto qualsiasi modifica / aiuto per renderla più leggibile per chi è a conoscenza.

È teoricamente possibile avere un disco rigido che ha salvato su di esso una copia di ogni possibile permutazione binaria di un kilobyte e quindi il resto del sistema semplicemente creare puntatori a queste posizioni?

Un sistema creato in questo modo sarebbe più veloce della semplice memorizzazione diretta delle informazioni?

Per spiegare un altro modo, dire invece di avere frasi:

"Ciao, sono Bob." e "Quel panino sembra delizioso."

... memorizzati sul disco rigido, avremmo tutte le permutazioni dell'alfabeto e di altri caratteri fino a un certo numero (diciamo, 1000 caratteri o giù di lì), e quindi memorizzeremo le nostre frasi come qualcosa del tipo:

[Pointer # 21381723]



Potresti trovare interessante il modo in cui git funziona, chiamato contenuto indirizzabile .
JDługosz,

5
github.com/philipl/pifs Si basa sullo stesso principio della tua idea, tranne che invece di avere tutte le permutazioni di un kb, usa pi.
Waxen,

12
I puntatori dovrebbero essere lunghi 1 kilobyte. Potresti scegliere di non memorizzare i blocchi che non hanno senso in inglese - nel qual caso hai reinventato autonomamente l'idea di compressione!
user253751

La risposta di base è NO - è impossibile a causa del # e delle dimensioni delle permutazioni. Ma quale possibile applicazione pensavi sarebbe utile se fosse possibile ??
Arcangelo,

Risposte:


91

Esistono 2 8192 possibili blocchi 1K diversi. Memorizzarli tutti richiederebbe 2 8202 bit di memoria. Poiché l'universo contiene solo circa 10 80 (o ~ 2 266 ) particelle, è una scommessa sicura che non è possibile memorizzarle tutte e non devi chiederti se risparmierebbe tempo o meno.

Ma esiste, in effetti, un modo più interessante di rispondere a questa domanda. Stai suggerendo di creare un indice in un enorme pool di costanti. Ma come faresti a sapere quale indice dedurre? Immaginate per il bene di un argomento che si desidera memorizzare solo 1 carattere blocchi: a, b, c... Presumibilmente i vostri indici sarebbero 0, 1, 2 ecc, dato che è il layout più efficiente di immagazzinare quei blocchi.

Noti qualcosa sull'accordo? Il tuo indice è, infatti, una rappresentazione codificata dei dati memorizzati ! In altre parole, non devi assolutamente dereferenziare, devi solo trasformare l'indice nei dati che desideri.

Quando memorizzi tutti i possibili valori di qualcosa in una tabella, ciò accade sempre: il tuo indice diventa semplicemente una versione codificata dei dati stessi, quindi la memorizzazione dei dati diventa inutile in primo luogo. Questo è il motivo per cui, nel mondo reale, gli indici sono utili solo per dati sparsi (ad esempio tutte le pagine Web che hai visitato, non tutte le pagine Web che potrebbero esistere o anche tutto ciò che esiste).


17
Quindi, in un certo senso, stiamo già utilizzando questo sistema, ma lo stiamo facendo con una valutazione pigra dei modelli di bit delle dimensioni di un kilobyte, che ci consente di risparmiare tonnellate di spazio di archiviazione!
Theodoros Chatzigiannakis,

3
La memoria è leggermente ridotta, a causa della sovrapposizione (1024 zeri seguiti da 1024 contengono 1025 modelli unici) ... ridotti ma ancora incredibilmente grandi. Inoltre, un blocco da 1 KB è 2 <sup> 13 </sup> bit, non 2 <sup> 10 </sup>.
Ben Voigt,

2
Nota che il limite di 10 ^ 80 sulle particelle nell'universo non significa direttamente che non puoi memorizzare più di, diciamo, 10 ^ 80 bit nell'universo - perché con ogni particella puoi potenzialmente memorizzare più di un bit di informazioni ( basato sulla sua posizione all'interno dell'universo, e forse sulla sua velocità ecc.). Ciò non significa che puoi memorizzare ogni blocco da 1K - il numero di quelli supera il numero di particelle di un fattore sorprendentemente grande, quindi è ancora una scommessa molto sicura che non puoi memorizzarle tutte!
psmears,

2
@Neil Se si dispone di un sistema di codifica che consente di memorizzare 10 ^ 80 codificandolo come "10 ^ 80", come si memorizza "10 ^ 80"? Se alcuni dati sono codificati più corti dei dati effettivi, altri devono essere codificati più a lungo. O se tutti i tuoi dati sono numeri, allora stai memorizzando ogni cifra decimale come un intero byte.
Casuale 832,

3
Con le sequenze di de Bruijn sarebbero sufficienti 2 ^ 1024 bit.
gronostaj,

20

Come altri hanno già sottolineato, hai 2 ^ 8192 possibilità per un blocco 1k. Ciò significa che occorrerebbero 8192 bit per codificare l'indirizzo di un blocco se tutti gli indirizzi di blocchi sono codificati con la stessa quantità di bit, quindi i tuoi indirizzi sarebbero lunghi 1k. Non avresti guadagnato nulla se non l'aggiunta di un livello di indiretto in modo da non ottenere alcuna prestazione.

Se volessi avere indirizzi più brevi, dovresti codificare alcuni blocchi con un indirizzo breve e alcuni con quelli più lunghi e farlo in modo che quelli lunghi non appaiano così spesso, e ora stai semplicemente comprimendo i dati (probabilmente con qualcosa come un codice Huffman ). Ciò richiederebbe la conoscenza dei dati che stai memorizzando prima di memorizzarli o modifiche regolari nella codifica. Probabilmente sarebbe anche meno efficiente di altri algoritmi di compressione che usano blocchi di lunghezza variabile.


1

Ci sono due problemi con questo.

Innanzitutto, "tutte le possibili permutazioni binarie di un kilobyte" sono un'enorme quantità di dati. 1024 byte * 8 bit per byte = 8192 bit in un kilobyte. Tutte le possibili permutazioni sarebbero 2 ^ 8192. Ecco i 1.09e+2466kilobyte! (Ai fini del confronto, un'unità da 1 TB è 1e09kilobyte.)

In secondo luogo, anche se tu avessi una tabella così enorme e ti indicizzassi con dei puntatori, cosa faresti se volessi fare riferimento a dati più piccoli di esattamente 1 KB?


2
Inoltre, la memorizzazione di tutti i blocchi di dimensioni inferiori a 1 KB non occuperà molto più spazio. Supponendo solo blocchi di dimensioni in byte, la dimensione dei blocchi più piccoli insieme è leggermente superiore a 1/256 della dimensione dei blocchi da 1 KB. Supponendo blocchi di dimensioni in bit, si aggiunge nuovamente la stessa dimensione.
Paŭlo Ebermann,

-1

Come hanno sottolineato altri poster, a un certo punto, la dimensione del puntatore necessaria per indicizzare nell'elenco di tutti i possibili valori annulla il guadagno.

Tuttavia, alcune lingue utilizzano una versione limitata di ciò che viene suggerito per ottimizzare l'utilizzo della memoria. Python utilizza la stringa "interning" per ridurre il numero di stringhe duplicate in memoria. Puoi trovare maggiori informazioni cercando "intern stringa di python".


1
L'OP sta chiedendo un set denso, contenente ogni permutazione. I puntatori sono utili solo per dati sparsi, in cui i bit necessari per contenere un puntatore sono più piccoli dei bit indicati. Il interning può rendere lo spazio più scarso se ci sono duplicati, quindi c'è una connessione lì, ma la tua risposta non lo definisce davvero bene.
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.