Переупорядкування даних (набір рядків) для оптимізації для стиснення?


12

Чи є алгоритми переупорядкування даних для оптимізації для стиснення? Я розумію, це специфічно для даних та алгоритму стиснення, але чи є слово для цієї теми? Де я можу знайти дослідження в цій галузі?

Зокрема, у мене є список json у 1,5 мільйона рядків, і я хочу змінити порядок рядків, щоб оптимізувати стиснення gzip (для HTTP). Сортування рядків працює досить добре, але я не знаю, чи оптимально це.


1
Оптимально переупорядковуючи рядки для стиснення gzip (LZ77 з невеликим розсувним вікном) звучить як проблема з важким NP. Можливо, ви можете придумати скорочення від найкоротшої поширеної проблеми із суперструнними.
Jouni Sirén

@ JouniSirén Я думаю, що довша загальна підрядка - це кращий підхід, оскільки найкоротша загальна суперрядка обмежує мене спільною частиною спиною до спини, правда? Я не заперечую над NP-важким, якщо це можна простежити (як, наприклад, потрібен день для роботи на сучасній машині).
Jayen

Відповіді:


6

Це доповнення до відповіді Навіна Гояла.

Оскільки файл JSON може розглядатися як структура даних про дерево, ви можете використовувати XBW-перетворення для дерев, що є розширенням перетворення Burrows-Wheeler для рядків.


1
Дякую за це. У мене є лише список / масив JSON, а не будь-які об'єкти JSON, тому я не бачу, як це можна розглядати як дерево. Я міг би перетворити рядки в трійку, але тоді я не бачу, як це стосується перетворення XBW.
Jayen

4

Берроуз - Перетворення Уілера - це добре відомий алгоритм стиснення, який працює шляхом переупорядкування символів у рядку, який потрібно стискати.


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

1

Щоб покращити стиснення gzip, ви хочете, щоб «подібні» рядки були близькими до списку. Існує ряд способів визначення такої подібності; дозвольте описати розумний, який добре працює на практиці. Нагадаємо, що розмір блоку gzip - 64K. Таким чином, ваші дані будуть розділені на блоки по 64 К байт, і кожен блок буде стискатися незалежно. Щоб оптимізувати стиснення, потрібно було б мінімізувати кількість різних k-mers (підрядків розміром k) у кожному блоці. Мотивація полягає в тому, що всі такі підрядки будуть замінені ідентифікатором.

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

Альтернативою є використання zstd , яке (i) швидше, (ii) отримує більш високі коефіцієнти стиснення, і (iii) не має обмежень щодо розміру блоку (і, таким чином, стискає рядки однаково добре незалежно від впорядкування введення).


0

Деякий час тому я побачив алгоритм, який може бути корисним. Він використовує алгоритм редагування відстаней для обчислення відстані між кожним словом. Таким чином, він будує графік, кожна вага краю якого становить цю відстань. Нарешті, він отримує замовлення, вибираючи шлях, який має найменшу вагу. Можливо, це може покращити gzip.


це не звучить прискіпливо, але якщо хтось все-таки спробує, будь ласка, опублікуйте коментар з вашими результатами
Jayen

Я спробую це перевірити. Мені цікаво ця проблема. Крім того, чому ви вважаєте, що це не простежується?
Рафаель Рібейро

наскільки я знаю, відстань редагування дорівнює O (nm), де n і m - кількість літер у пари рядків, і ви повинні зробити це для кожної пари рядків O (s ^ 2), так що якщо n = м, це O (s ^ 2 * n ^ 2), який звучить для мене нерозв'язним для 1,5 мільйона струн.
Jayen

О, я не так хвилювався щодо складності, тому що думав, що ваша проблема полягає лише в зменшенні двійкового розміру. Тож ця операція буде траплятися частіше, правда?
Рафаель Рібейро

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