Чому коефіцієнт стиснення використовує bzip2 для послідовності "a", настільки стриманою?


15
library(ggplot2)

compress <- function(str) {
  length(memCompress(paste(rep("a", str), collapse=""), type="bzip2"))
  / nchar(paste(rep("a", str), collapse=""))
}

cr <- data.frame(i = 1:10000, r = sapply(1:10000, compress))

ggplot(cr[cr$i>=5000 & cr$i<=10000,], aes(x=i, y=r)) + geom_line()

введіть тут опис зображення

Коефіцієнт стиснення починається з 37 для "a" і досягає беззбитковості при 39 "a" s (коефіцієнт стиснення = 1). Діаграма починається досить гладко і раптово стає різкою на 98 "а", а звідти з все меншими інтервалами.

Місцеві мінімуми та гладкі ділянки здаються також досить хаотичними та випадковими. Чи може хтось мені пояснити, чому bzip2 показує таку поведінку в цьому прикладі?

Відповіді:


14

a(header,"a",n)ana+lgnaa+lg(n)nΘ(lg(n)p/n)p1

lgnnana+1a+2ana+1na+2n

Оскільки коефіцієнт стиснення занадто близький до оберненого відношення довжини для візуального спостереження, ось дані невеликої довжини в моїй реалізації (це може залежати від версії бібліотеки bzip2, оскільки існує кілька способів стиснення деяких входів ). Перший стовпець вказує число as, другий стовпець - довжину стисненого виводу.

1–3       37
4–99      39
100–115   37
116–258   39
259–354   45
355       43
356       40
357–370   41
371–498   43
499–513   41
514–609   45
610       43
611       41
613–625   42
626–753   44
754–764   42
765       40
766–767   41
768       42
769–864   45
…

Bzip2 набагато складніше , ніж просте кодування довжиною виконання. Вона працює в серії кроків, і перший крок - це крок кодування довжиною пробігу , але з фіксованим обмеженням розміру. Перший крок працює наступним чином: якщо байт повторюється щонайменше 4 рази, то замініть байти після 4-го байтом, що вказує на кількість повторень стираних байтів. Наприклад, aaaaaaaперетворюється на aaaa\d{3}(де \d{003}символ із значенням байта 3); aaaaперетворюється на aaaa\d{0}тощо. Оскільки існує лише 256 різних байт-значень, таким чином можуть бути закодовані лише послідовності, де байт повторюється до 259 разів; якщо їх більше, починається свіжа послідовність. Крім того, реалізація посилань зупиняється на кількості повторень 252, що кодує рядок у 256 байт.

an1n34n258aaaa\d{252}\d{252} це кількість повторень, я не перевіряв), сам повторюється і тому стискається наступними кроками.

aaaa\374aan=258a

n=100a101aaaa\d{97}aaaaaan=101aA68n83

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

Здебільшого такі хвилинні варіації не є головним фокусом при розробці алгоритму стиснення: у багатьох загальних сценаріях, таких як алгоритми стиснення загального призначення або медіа, різниця в кілька байтів не має значення. Стиснення намагається витіснити кожен шматочок на місцевому рівні і намагається ланцюг трансформацій таким чином, щоб часто отримувати, хоча рідко втрачаючи, а потім не сильно. Тим не менш, існують такі ситуації, як протоколи зв'язку спеціального призначення, призначені для зв'язку з низькою пропускною здатністю, де кожен біт має значення. Інша ситуація, коли має значення точна довжина виводу, коли стислий текст шифрується: коли противник може подати частину тексту для стискання та шифрування, зміни в довжині шифротексту можуть виявити частину стисненого та зашифрованого тексту противник;ЗЛИЧНИЙ експлуатуйте на HTTPS .

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