Чи можлива пам'ять про всі можливі перестановки кілобайтного блоку та покажчиків?


23

Це досить важка ідея, щоб обернути голову, і я дуже вдячний за будь-які зміни / допомогу, щоб зробити їх більш зрозумілими для тих, хто знає.

Чи теоретично можливо встановити жорсткий диск, який зберег на ньому одну копію всієї можливої ​​бінарної перестановки в один кілобайт, а потім решту системи просто створити покажчики на ці місця?

Чи зробила б така система швидшою, ніж просто зберігати інформацію безпосередньо?

Щоб пояснити інший спосіб, скажіть замість речень:

"Привіт, я Боб". і "Цей бутерброд виглядає смачно".

... що зберігаються на жорсткому диску, ми б мали всі перестановки алфавіту та інших символів до деякої кількості (скажімо, 1000 символів або близько того), а потім зберігаємо наші пропозиції як щось подібне:

[Покажчик # 21381723]



Вам може бути цікаво, як працює git , який називається вмістом, адресованим .
JDługosz

5
github.com/philipl/pifs Базується на тому самому принципі, що і ваша ідея, за винятком того, що має всі перестановки на kb, він використовує pi.
Ваксен

12
Ваші покажчики повинні мати довжину 1 кілобайт. Ви можете вирішити не зберігати блоки, які не мають сенсу англійською мовою - у цьому випадку ви самостійно винаходили ідею стиснення!
користувач253751

Основна відповідь "НІ" - це неможливо через # та розмір перестановок. Але якою можливою програмою ви вважали, що це буде корисно, якби це можливо ??
Архангел

Відповіді:


91

Існує 2 8192 можливих різних 1К блоків. Зберігання їх забирає 2 8202 біт пам’яті. Оскільки Всесвіт містить тільки близько 10 80 (або ~ 2 266 ) частинок, це безпечна ставка , що це НЕ можливо , щоб зберегти їх все, і ви не повинні задатися питанням про те, чи буде заощадити час чи ні.

Але насправді є більш цікавий спосіб відповісти на це. Ви пропонуєте створити індекс у величезний пул констант. Але як би ви дізналися, який індекс для відновлення? Уявіть собі , заради аргументу , що ви хочете зберегти тільки 1-символи блоки: a, b, c... Імовірно ваші індекси будуть 0, 1, 2 і т.д., так як це найбільш ефективне розташування зберігання цих блоків.

Ви щось помічаєте щодо домовленості? Ваш індекс насправді є кодованим поданням збережених даних ! Іншими словами, вам не доведеться зневажати взагалі, вам просто потрібно перетворити індекс в потрібні вам дані.

Коли ви зберігаєте всі можливі значення чогось у таблиці, це завжди відбувається: ваш індекс стає просто кодованою версією самих даних, тому зберігання даних стає в першу чергу непотрібним. Це чому в реальному світі, показники корисні тільки для розріджених даних (наприклад , всіх веб - сторінок , які ви відвідали, не всі веб - сторінки , які можуть існувати , або навіть всі , що роблять існують).


17
Таким чином, ми певною мірою вже використовуємо цю систему - але ми робимо це з ледачою оцінкою бітових кілобайт розмірів, що дозволяє економити тонни місця для зберігання!
Теодорос Чатзіґянакікіс

3
Зберігання дещо скорочується через перекриття (1024 нулі, а потім 1024, містять 1025 унікальних візерунків) ... зменшені, але все ще неможливо великі. Також блок 1KB - це 2 <sup> 13 </sup> біт, а не 2 <sup> 10 </sup>.
Ben Voigt

2
Зауважте, що обмеження 10 ^ 80 на частинки у Всесвіті не означає прямо, що ви не можете зберігати більше, ніж, скажімо, 10 ^ 80 біт у Всесвіті - адже з кожною частинкою ви потенційно можете зберігати більше одного біта інформації ( виходячи з його положення у Всесвіті та, можливо, його швидкості тощо). Це не означає, що ви можете зберігати кожен 1К блок - їх кількість перевищує кількість частинок напрочуд великим коефіцієнтом, тому все-таки дуже безпечна ставка, що ви не можете їх зберігати всі!
psmears

2
@Neil Якщо у вас є система кодування, яка дозволяє зберігати 10 ^ 80, кодуючи її як "10 ^ 80", то як ви зберігаєте "10 ^ 80"? Якщо деякі фрагменти даних кодуються коротше, ніж фактичні дані, інші повинні бути закодовані довше. Або якщо всі ваші дані є цифрами, ви зберігаєте кожну десяткову цифру як цілий байт.
Випадково832

3
З послідовностями де Бреййна було б достатньо 2 ^ 1024 біт.
gronostaj

20

Як вже вказували інші, у вас є 2 ^ 8192 можливості для блоку 1k. Це означає, що вам знадобиться 8192 біт для кодування адреси блоку, якщо всі адреси блоків кодуються однаковою кількістю бітів, тому ваші адреси будуть довжиною 1 к. Ви б нічого не одержали, окрім додавання шару непрямості, щоб не отримати жодної продуктивності.

Якщо ви хотіли мати більш короткі адреси, вам доведеться кодувати деякі блоки з короткою адресою, а деякі - з більш довгими, і зробити так, щоб довгі не з’являлися так часто, і ви просто стискаєте дані (напевно, з чимось на зразок код Хаффман ). Це вимагає знання даних, які ви зберігаєте, перед їх збереженням або регулярних змін у кодуванні. Можливо, це також буде менш ефективним, ніж інші алгоритми стиснення, які використовують блоки різної довжини.


1

З цим є дві проблеми.

По-перше, "всі можливі бінарні перестановки в один кілобайт" - це величезна кількість даних. 1024 байт * 8 біт на байт = 8192 біт в кілобайт. Усі можливі перестановки були б 2 ^ 8192. Це близько 1.09e+2466кілобайт! (Для порівняння, привід 1 Тб - 1e09кілобайт.)

По-друге, навіть якщо б у вас була така величезна таблиця, і ви індексували її покажчиками, що б ви зробили, якби хотіли посилатися на деякі дані розміром менше 1 Кб?


2
Збереження всіх блоків розміром менше 1 Кб додатково не займе більше місця. Якщо припускати лише байтові блоки, розмір менших блоків разом трохи трохи перевищує 1/256 розміру блоків 1 КБ. Припускаючи блоки розміру біт, ви знову додаєте приблизно однаковий розмір.
Paŭlo Ebermann

-1

Як вказували інші плакати, в якийсь момент розмір вказівника, необхідний для індексації у вашому списку всіх можливих значень, анулює ваш прибуток.

Однак деякі мови використовують обмежену версію запропонованих вами для оптимізації використання пам'яті. Python використовує рядок 'interning' для зменшення кількості повторюваних рядків у пам'яті. Додаткову інформацію можна знайти за допомогою пошуку "python string intern".


1
ОП запитує про щільний набір, що містить кожну перестановку. Покажчики корисні лише для розріджених даних, де біти, необхідні для утримання покажчика, менші, ніж біти, на які вказували. Інтернування може зробити простір більш рідким, якщо є дублікати, тому там є зв’язок, але ваша відповідь насправді не добре відповідає.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.