Kilobayt blok ve işaretçilerin tüm olası permütasyonlarının bir hatırası mümkün mü?


23

Bu, kafamı sarmak için yeterince zor bir fikir ve bildiğim kişiler için daha okunaklı olması için herhangi bir düzenleme / yardım için müteşekkirim.

Teorik olarak, bir kilobaytlık her olası ikili permütasyonun bir kopyasının bir kopyasına kaydedilmiş bir sabit sürücüye sahip olmak ve ardından sistemin geri kalanının bu konumlara basit bir şekilde işaretçiler koyması mümkün mü?

Bu şekilde yapılan bir sistem, bilgileri doğrudan saklamaktan daha hızlı mı olurdu?

Başka bir yolla açıklamak için, cümleleri kullanmak yerine:

"Merhaba, ben Bob." ve "Bu sandviç lezzetli görünüyor."

... sabit sürücüde saklanırsa, alfabenin ve diğer karakterlerin bir miktarına kadar (1000 karakter veya daha fazla karakter) tüm permütasyonlarına sahip oluruz ve sonra cümlelerimizi aşağıdaki gibi saklarız:

[İmleç # 21381723]


21
Kaç tane benzersiz İngilizce tweet'in mümkün olduğunu düşünebilirsiniz. Dünya nüfusunun hepsini yüksek sesle okuması ne kadar sürer? . Çok büyük rakamlarla uğraşıyorsun.

Git'in nasıl çalıştığını, içeriğe adreslenebilir olarak adlandırdığını ilginç bulabilirsiniz .
JDługosz 15:15

5
github.com/philipl/pifs Fikrinizle aynı prensibi temel alır, bir kb'nin tüm izinlerine sahip olmak dışında, pi kullanır.
Waxen

12
İşaretçilerinizin 1 kilobayt uzunluğunda olması gerekir. Mantıklı olmayan blokları İngilizce olarak saklamamayı seçebilirsiniz - bu durumda, sıkıştırma fikrini bağımsız olarak yeniden keşfettiniz!
user253751

Temel cevap HAYIR - permütasyonların sayısı ve büyüklüğü nedeniyle imkansızdır Ancak, mümkün olsaydı ne gibi bir uygulama için faydalı olacağını düşünüyorsunuz?
Başmelek

Yanıtlar:


91

2 8192 farklı 1K blok var. Hepsini saklamak için 2 8202 bit depolama alanı gerekir. Evren sadece yaklaşık 10 80 (veya ~ 266 ) parçacık içerdiğinden , hepsini saklamanın mümkün olmadığı ve zaman kazanıp kazanmayacağı konusunda endişelenmenize gerek yoktur.

Ancak, aslında buna cevap vermenin daha ilginç bir yolu var. Çok büyük bir sabit havuza indeks oluşturmayı öneriyorsunuz. Peki hangi endere uygunluğa düşeceğini nasıl bilebilirsin? Saklamak istediğiniz bir argüman uğruna düşünün sadece 1 karakterlik bloklar: a, b, c... olanlar blokları saklanması en verimli düzen beri Muhtemelen sizin endeksleri, 0, 1, 2 vb olacaktır.

Düzenleme hakkında bir şey farkettin mi? Dizininiz aslında saklanan verilerin kodlu bir gösterimidir ! Başka bir deyişle, hiçbir zaman kuralsızlaştırmanız gerekmez, dizini istediğiniz verilere dönüştürmeniz gerekir.

Bir nesnenin olası tüm değerlerini bir tabloda sakladığınızda , bu her zaman olur: Dizininiz yalnızca verilerin kendisinin kodlanmış bir sürümü olur, böylece verilerin depolanması ilk etapta gereksiz olur. Bu yüzden gerçek dünyada, endeksler seyrek veri (Ziyaret ettiğiniz gibi tüm web sayfaları değil, tüm web sayfaları için sadece yararlıdır var olabileceği , hatta tüm bu yapmak varoldukları için).


17
Yani, bir şekilde, biz zaten bu sistemi kullanıyoruz - ancak kilobayt büyüklüğündeki bit kalıplarının tembel bir değerlendirmesi ile yapıyoruz, bu da tonlarca depolama alanından tasarruf etmemizi sağlıyor !
Theodoros Chatzigiannakis

3
Üst üste binme nedeniyle depolama hafifçe azalır (1024 sıfır, ardından 1024 tane 1025 benzersiz desen içerir) ... azaltılmış ancak yine de inanılmaz derecede büyüktür. Ayrıca, 1 KB'lık bir blok 2 <sup> 13 </sup> bit, 2 <sup> 10 </sup> değil.
Ben Voigt

2
Evrendeki parçacıklar üzerindeki 10 ^ 80 sınırının doğrudan evrende 10 ^ 80 bitten daha fazlasını depolayamayacağınız anlamına gelmediğini unutmayın - çünkü her parçacık ile potansiyel olarak birden fazla bilgi depolayabilirsiniz ( evrendeki konumuna ve muhtemelen hızına bağlı olarak). Yani anlamına gelmez olabilir bu yüzden hepsini saklamak edemez çok güvenli bir bahis hala bu sayısının bir şaşırtıcı büyük faktör tarafından parçacıkların sayısını aşıyor - gerçi her 1K blok saklamak!
psmears

2
@Neil "10 ^ 80" olarak kodlayarak 10 ^ 80 saklamanızı sağlayan bir kodlama sisteminiz varsa, "10 ^ 80" nasıl depolarsınız? Bazı veriler gerçek verilerden daha kısa kodlanmışsa, diğerleri daha uzun kodlanmalıdır. Veya tüm veri parçalarınız sayı ise, her ondalık basamağı bir bütün bayt olarak saklıyorsunuzdur.
Random832

3
İle Bruijn sekansları de 2 ^ 1024 bit yeterli olacaktır.
gronostaj

20

Diğerlerinin de belirttiği gibi 1k blok için 2 ^ 8192 imkanınız var. Bu, tüm blok adreslerinin aynı miktarda bit ile kodlanması durumunda bir bloğun adresini kodlamak için 8192 bit'in gerektiği anlamına gelir, bu nedenle adresleriniz 1k uzunluğunda olur. Bir dolaylı katman eklemek dışında hiçbir şey elde edemezsiniz, böylece herhangi bir performans elde edemezsiniz.

Daha kısa adreslere sahip olmak istemeniz durumunda, bazı blokları kısa bir adrese ve bazılarına daha uzun olanları kodlamanız ve uzun olanların bu kadar sık ​​görünmemesini sağlayacaksınız ve şimdi sadece verileri sıkıştırıyorsunuzdur (muhtemelen gibi bir şeyle) bir Huffman kodu ). Bu, kaydetmeden önce sakladığınız verileri veya kodlamadaki düzenli değişiklikleri gerektirir. Ayrıca muhtemelen değişken uzunluktaki blokları kullanan diğer sıkıştırma algoritmalarına göre daha az etkili olacaktır.


1

Bununla ilgili iki sorun var.

İlk olarak, "bir kilobaytın tüm olası ikili izinleri" çok büyük miktarda veridir. 1024 bayt * Bayt başına 8 bit = bir kilobaytta 8192 bit. Mümkün olan tüm izinler 2 ^ 8192 olacaktır. Bu 1.09e+2466kilobayt civarında! (Karşılaştırma amacıyla, 1 TB'lık bir sürücü 1e09kilobayttır.)

İkincisi, çok büyük bir tablonuz olsa ve işaretçilerle dizine eklemiş olsanız bile, tam olarak 1 KB'den küçük bir veriye başvurmak isteseydiniz ne yapardınız?


2
Tüm blokların ek olarak 1 KB'den küçük tutulması, bu kadar fazla alan gerektirmez. Yalnızca bayt boyutlu bloklar varsayıldığında, daha küçük blokların boyutu birlikte 1 KB blokların 1 / 256'sının biraz üzerindedir. Bit büyüklüğünde blok varsayarak, aynı boyutta tekrar ekleyin.
Paŭlo Ebermann 15:15

-1

Diğer posterlerin belirttiği gibi, bir noktada, tüm olası değerler listenizde dizine almak için gereken işaretçinin boyutu kazancınızı geçersiz kılar.

Ancak, bazı diller bellek kullanımını optimize etmek için önerdiklerinizin sınırlı bir sürümünü kullanır. Python, bellekteki kopya dizelerin sayısını azaltmak için 'interning' dizesini kullanır. 'Python string intern' i arayarak daha fazla bilgi bulabilirsiniz.


1
OP her permütasyonu içeren yoğun bir set soruyor. İşaretçiler, yalnızca bir işaretçiyi tutmak için gereken bitlerin işaret edilen bitlerden daha küçük olduğu seyrek veriler için kullanışlıdır. Interning, eğer kopyalar varsa, alanı daha seyrek yapabilir, bu yüzden orada bir bağlantı var, ama cevabınız gerçekten iyi ifade etmiyor.
Peter Cordes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.