LINUX.ORG.RU

Теория почему сжатие данных дальше сокращения избыточности возможно

 , ,


1

2

В своей основе вопрос сжатия это принцип Дирихле: вот у нас строки большого размера, их больше, вот у нас строки меньшего размера, их соответственно меньше. количество клеток не совпадает с количеством голубей, ничего не получается, все расходимся? А вот и нет, можно добиться равенства, причем двумя путями: или меньше голубей, или больше клеток.

1)меньше голубей: Вот у нас множество всех строк, или файлов - вопрос интерпретации, длинны N. Мощность такого множество соответственно 2^N. Теперь посмотрим на множество всех строк длин (N-1) и (N-2) и…(1). Мощность этого множество будет ∑2^N, где N от (N-1) до (1), и равно это 2^N-2. Сравниваем мощности множеств, первое больше на два элемента. Ну а теперь финт ушами - мы просто берем и выкидываем два элемента из первого множества, для удобства это строки состоящие только из 0 или 1. И опаньки, биекция, если не верите можете прям на бумажке нарисовать и сравнить. И что получили в итоге? Получили что любую, кроме двух, строк можно переписать в виде минимум на один бит короче. Убрали бы больше элементов, сократили бы еще сильнее, это просто самый простой вариант.

2)больше клеток: Возьмем множество всех строк длинны от N до 1. Зададим функцию F(n), и обратную ей G(n), которая берет на вход один элемент и выдает другой. Во общем то все. F(n) функция абсолютно арбитрарная, просто применяешь F(n) несколько раз, пока нужный результат не получишь и все. Другое дело что хотелось бы побыстрее, поэтому -

2.1)столько же клеток, но в другом порядке: Вот возьмем множество всех строк размера N и упорядочим его следующим образом. Для этого мы берем функцию X(n), делает она следующие - берет бинарную строку и возвращает натуральное число от 1 до 2^N. Как она должна его считать честно не знаю, но она должна делать что-то приблизительно следующие: строим бинарное дерево(?) сравнений, сначала сравниваем половинки строки друг с другом. потом четвертинки, и вот тут уже не знаю, нужно ли сравнивать каждую с каждой или хватит сравнений 1 к 2, и 3 к 4. потом осьмушки итд. в конце сравниваем соседние биты, вот тут каждый с каждым точно лишнее. Потом переводим эти сравнения в значения с весами, например строки в которых есть повторения половинок должны быть ниже чем те у которых повторяются четвертинки, а те у которых нет повторений ни четвертинок ни половинок должны стоять выше, ближе к началу, к числу 1. Потом делаем над этими значениями некие операции и ВЖУХ! получаем натуральное число, он же порядковый номер. К примеру если N=8, то строка 11111111 должна иметь номер 256, строка 00000000 номер 255, строка 11111110 номер 254 итд. Вот что это за ВЖУХ! и нужно выяснить. Сначала я думал что можно просто обойтись тем что можно представить строку как число сочетаний из количества единиц по N, и все сочетания, где количество единиц приближается к половине длинны, просто поставить спереди, но потом прикинул что например строка 00001111 при таком подходе будет стоять выше чем строка 00101001, а это фатальный недостаток. Ну вот, допустим выясняли как ВЖУХ! выглядит, нашли порядковый номер в упорядоченном по повторениям списке. А теперь просто подставляем вместо этой строки другую строку с тем же номером, но в списке упорядоченном просто лексикографически. Ну а дальше например отправляешь данную строку в метод 1).

Остается только реализовать это все в софте. А вот это я не умею. Может кто-нибудь напишет?


Ответ на: комментарий от akho

Если сжатие данных дальше сокращения избыточности возможно, то получившуюся сжатую строку можно сжать еще раз. И так до бесконечности получения нулевого размера.

Так что можно не читать, расходимся.

wandrien ★★★
()
Ответ на: комментарий от akho

Это +ln n можно либо: убрать еще элементы, не 2 а больше, из первого множества чтоб суммарно на выходе мы получали положительный выхлоп, либо можно просто хранить данное число в архиваторе - архиватор сжимает файлы СТРОГО определенного размера

q250
() автор топика
Ответ на: комментарий от wandrien

Если сжатие данных дальше сокращения избыточности возможно, то получившуюся сжатую строку можно сжать еще раз. И так до бесконечности получения нулевого размера. ну да. у Колмогорова даже теорема на эту тему есть.

q250
() автор топика
Ответ на: комментарий от alex1101

https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D0%BC%D0%BE%D0%B3%D0%BE%D1%80%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D1%8C

собственно вон она, там где «функции сложности, относящиеся к языкам описания»

q250
() автор топика

таблица М - таблица соответствия бинарной строки натуральному числу: Ø-1; 0-2; 1-3; 00-4; 01-5 итд

Ø-1;
0-10;
1-11;
00-100;
01-101;

Ну чо сказать. Отрицательное сжатие - тоже сжатие.

wandrien ★★★
()

пусть кто-нибудь со свободным временем читает.

было бы что читать. пример

строка *1 - abababababababababababababababababababababababababababababababab

строка *2 - 0bLDgAxFxEwEUgEstSiP1GHhmXYZPcNR3bZA5tv20ZYOjms2bsKYzO3lwRKvjpCo

строку *1 мы знаем как сжать, а вот строку *2 нет. что делать? а давайте просто заменим *2 на *1. ну то есть у нас есть функция F(x) и обратная ей G(x), такие что F(*2)=*1 и G(*1)=*2. ну а дальше поди понятно.

сейчас будет вопрос «и как нам найти такую функцию?». отвечаю, простейший вариант подобной функции: найти в таблице М значение строк *1 и *2 и вычесть из большего меньшее, эту разницу записываем в тело архиватора.

таблица М - таблица соответствия бинарной строки натуральному числу: Ø-1; 0-2; 1-3; 00-4; 01-5 итд

q250
() автор топика
Ответ на: комментарий от q250

Длина строки 2 = 64 символа, это 512бит. Размер индекса положения этой строки в таблице М, тоже будет 512бит. Даже если мы отнимем эти две строки, то разности индексов будут те же самые 512бит.

Можно конечно попробовать найти к строке s2 ближайшую строку s1, так что бы разница между ними была числом с 512 битами, из которых первые 128 были все нули. при этом сама строка s1 была легко сжимаемой типа: obLDgobLDgobLDgobLDgobLDgobLDgobLDgobLDgobLDgobLDgobLDg

но даже в этом случае скорей всего можно строго доказать, что выйгрыша не будет совсем.

yax123 ★★★★★
()
Ответ на: комментарий от wandrien

Хотите немного наукообразия? Имеет место уравнение Эйнштейна об энергии связи и дефекте массы ядра: «е равно эмцэ квадрат». Надо ещё немного сжать? Потратьте на это энергию.

anonymous
()
Ответ на: комментарий от yax123

Даже если мы отнимем эти две строки, то разности индексов будут те же самые 512бит.

ну и ладно, эти 512бит записываем в тело архиватора. вопрос сейчас вот у нас еще какая-нибудь строка *3 и тоже не сжимаемая, вот отнимем, будет ли эффект? если будет мы молодцы, не будет, ну можно попробовать еще раз отнять, может и получится.

и вообще этот метод только пример что менять одно одного размера на другое того же размера можно и нужно. функция замены естественно для этого нужно придумать получше.

пример не самой оптимальной такой функции но уже более универсальной это прикол с сочетаниями, меняем строку с количеством единиц близкое к половине длины на строку с количеством единиц близкое к нулю.

q250
() автор топика
Ответ на: комментарий от q250

Как сжать данные, которые нельзя сжать? Заменить их на те, которые сжать можно!

Гениально. Странно, правда, что такая простая идея не реализована в существующих алгоритмах 🤔🤔🤔

anonymous
()
Ответ на: комментарий от anonymous

Странно, правда, что такая простая идея не реализована в существующих алгоритмах

потому что за такое мочат https://en.wikipedia.org/wiki/Sloot_Digital_Coding_System https://www.youtube.com/watch?v=BSEnurBApdM

мне норм потому что я еврей, им меня трогать нельзя, буквально Бог не позволяет. если б не был уже с вами не разговаривал.

q250
() автор топика

Теперь посмотрим на множество всех строк длин (N-1) и (N-2) и…(1). Мощность этого множество будет ∑2^N, где N от (N-1) до (1), и равно это 2^N-2

это какая-то бредовая формула. ее значение непонятно. с какой стати мощности «неких подмножеств» суммируются? мощности подмножеств перемножаются. короче сумма таких мощностей тут иллюстрирует не пойми что. а произведение мощностей подмножеств и будет равно мощности множества. то бишь в данном случае 2^N

alysnix ★★★
()
Ответ на: комментарий от vbr

Ещё один архиватор Бабушкина.

а что, Бабушкин тоже умер от сердечного приступа прям перед подписанием контракта на 20млн $?

А функцию/словарь где хранить?

там же где остальные архиваторы хранят.

Нельзя жать чистую энтропию.

что такое энтропия? это мера нашего незнания. лучше применять термин колмогоровская сложность. вот есть строки простые, для нас в них мало энтропии, а есть строки сложные. мы не знаем как сжимать сложные строки, может и есть простой метод их сжатия, но мы его не знаем, для нас в сложной строке много энтропии. поэтому прекрасный выход из ситуации поменять одно на другое, и обратно. в математической нотации это будет что-то типа F(n1)=n2, N->N; G(n2)=n1, N->N.

Вот ещё гениальная идея. В числе Pi

даже если не послать такого гения а ответить на это серьезно то нет. не доказанно что Pi нормальное, например цифра в десятичном представлении встречается бесконечное число раз. даже если это докажут не будет ясно что некий конечный набор последовательностей будет встречаться в Pi, ну вот нету их в Pi, на нормальность это никак не повлияет. но даже если это правда, остаётся сугубо практический вопрос, и вот на этом моменте идея точно признается неработоспособной.

мог бы что и пооригинальнее придумать. например представляем строку как число. оно или простое или, не доказанно, заодно проверить можно, или как сумма 3 простых. если взять функцию простых чисел P(x) то можно заметить что уже с шестого числа разница между значением простого и его порядковым номером один бит. и в итоге просто заменяешь все простые на их порядковые номера.

q250
() автор топика
Ответ на: комментарий от alysnix

это какая-то бредовая формула.

нормальна формула.

ее значение непонятно.

бывает.

с какой стати мощности «неких подмножеств» суммируются

мощность множества это сколько в нем элементов. сколько элементов в множестве состоящим из всех бинарных срок длинны 1 и длины 2 и…2^(N-1)?

тут иллюстрирует не пойми что.

иллюстрирует вот это

https://imgur.com/a/YiMWjPF

важное уточнение это не префиксный код, мы меняем строку целиком.

q250
() автор топика

Теория почему сжатие данных дальше сокращения избыточности возможно

Конечно возможно. Вот моя реализация:

  1. Делаешь архиватор со словарем.
  2. Записываешь в словарь архивируемые данные под номером 1.
  3. Кодируем первую запись в словаре как файл нулевого размера.
  4. ???
  5. Сжатие стремится к бесконечности. Problem.jpg

Есть небольшой недостаток правда, этим архиватором можно сжать только один конкретный файл.

goingUp ★★★★★
()

Мощность такого множество соответственно 2^N. Теперь посмотрим на множество всех строк длин (N-1) и (N-2) и…(1). Мощность этого множество будет ∑2^N, где N от (N-1) до (1), и равно это 2^N-2. Сравниваем мощности множеств, первое больше на два элемента. Ну а теперь финт ушами - мы просто берем и выкидываем два элемента из первого множества, для удобства это строки состоящие только из 0 или 1. И опаньки, биекция, если не верите можете прям на бумажке нарисовать и сравнить. И что получили в итоге? Получили что любую, кроме двух, строк можно переписать в виде минимум на один бит короче.

то есть вы имели множество мощности 2^N, затем вычли два элемента, получив 2^N - 2… и волшебно однозначно отобразили на множество 2^(N-1)… то есть вычли два элемента и получили мощность в половину от исходной. но чтобы получить половину от исходной надо и вычесть половину от исходной, а не 2. или у вас 2 - половина от исходной, значит исходная мощность == 4. или всего два бита.

alysnix ★★★
()
Ответ на: комментарий от alysnix

то есть вы имели множество мощности 2^N, затем вычли два элемента, получив 2^N - 2… и волшебно однозначно отобразили на множество 2^(N-1)… то есть вычли два элемента и получили мощность в половину от исходной. но чтобы получить половину от исходной надо и вычесть половину от исходной, а не 2. или у вас 2 - половина от исходной, значит исходная мощность == 4. или всего два бита.

ой, мужик просто на картинку посмотри, там случаи N=4 и N=5. не понятно? вот еще случай для N=8, логика построения полностью такая же. если логика построения все еще будет не понятно, то я тут уже безсилен.

https://imgur.com/a/dLMLSVV

q250
() автор топика
Ответ на: комментарий от q250

накласть на «логику построения». вы из 2^N вычли два и получили 2^(N-1). было такое?

вот и обьясните как это получилось, для произвольного N. потому что из этого вопиющего «волшебства» и получилось ваше «сжатие».

alysnix ★★★
()