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).

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


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

вот, собственно, и непонятно, что же имеется в виду под пространными словесами о метаданных и «сложности».

Вместо создания классов и интерфейсов на, скажем C++, этот подход предлагает описание данных на Forum0888++ скромно умалчивая что под капотом будет монстр на том же С++ переводить эти самые метаданные в те же объекты и работать с ними. Как-то так.

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

Не выдумывайте.

Одна из подсистем в API предназначена для создания интерфейса к struct Си или C++.

То бишь на входе принимаем данные о месте нахождения *.h, который может иметь #include любой вложенности.

Это тоже метаданные.

Так понятно?

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

Извините, что отвлеклись.

По теме топика - так а что обсуждать? Законы сохранения информации? Теоремы Колмогорова? Комментаторы выше уже объяснили что это не сжатие данных, а перекодировка вполне доходчиво как по мне.

Obezyan
()

По пункту 1).

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

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 3)
Ответ на: комментарий от q250

Пусть бинарный файл будет длиной четыре байта и содержит некие бинарный данные.
Как Вы его сжимаете?

И каков алгоритм, получения исходного файла из сжатого?
Впрочем не видя алгоритма сжатия не понятен сам метод сжатия.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 4)

Как вы предлагаете различать преобразованные последовательности различной длины?

зачем их различать, они и так разные. или тут имелось ввиду другое, на вход подаем данные разной длины на выходе получаем разной длины, как обратно теперь? мы просто так не делаем, на вход податься данные СТРОГО определенной длины.

Пусть бинарный файл будет длиной четыре байта и содержит некие бинарный данные. Как Вы его сжимаете?

прям алгоритм действий по пункту 1) нужен? вот, на английском только, и вместо 4байт тут 1Кбайт:

"Program read any file and check if it not has .cmprs extension, if it not has it check it size, if it equal to 8192 bit then read it in binary and check if it not consist of only zeroes or ones. If all checks is true then do subroutines 1, else check if it has .cmprs extension and it size is smaller than 8192 bit, if true then do subroutines 2, else print “error” and HALT.

Subroutines 1: open file as binary text string, ie all 1 and 0 now become text character. Delete from that string from left all zeroes and one one, that one included, if we get empty string use exemption rule. Declare variable N that equal to number of bits of resulting string. Declare variable D10 that equal to that string value in base10, ignoring all zeroes from left, example string 0101 has integer value 5, string 101 also has integer value 5. Declare variable A that equal to 2^N + D10. Now add 1 to A, ie A:=A+1. Now declare variable B that equal to Floor from log(A) base 2. Now declare variable R that equal to R:=A – 2^B. Now construct binary text string that equal to R in binary and add as much 0 from left as much it needed to make it overall size equal B, example B=3 R=2: firstly get string from R = 10, then add so much zeroes, in our case only one, and final answer 010. Now save that string with full name of original file, add .cmprs extension and HALT. Exemption rule: just write 0 in new string, save that string with name of original file, add low dash and old extension letters, and .cmprs extension and HALT.

Subroutines 2: open file as binary text string. Declare variable N that equal to number of bits of resulting string. Declare variable D10 that equal to that string value in base10, ignoring all zeroes from left, example string 0101 has integer value 5, string 101 also has integer value 5. Declare variable A that equal to 2^N + D10. Now subtract 1 from A, ie A:=A-1. If A turn out to be 1 then use exemption rule. Now declare variable B that equal to Floor from log(A) base 2. Now declare variable R that equal to R:=A – 2^B. Now construct binary text string that equal to R in binary and add as much 0 from left as much it needed to make it overall size equal B. Now add to that string one one from left, and add even further to left as much zeroes it needed to make overall string size equal to 8192. Now save that string as binary file under old file name, removing .cmprs extension from it and HALT. Exemption rule: just write 1 in new string and as much 0 needed to make overall size equal to 8192, now save that string as binary file under old file name, removing .cmprs extension from it and HALT."

чирикните если нужно написать попроще и на русском

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

Вопрос по пункту 1)

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

Всё же алгоритм нужен.

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

основу проблемы сжатия - принцип Дирихле, и как его можно обойти.

Так принцип Дирихле это основа сжатия, база если угодно, а не проблема. Благодаря ему голуби/кролики занимают меньше клеток. Но я вас понял - вы хотите обсудить проблемы философии математики на конкретном примере (К-постулат) из К-математики.

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

Боюсь, что вы выбрали неправильный форум для этих целей. Тут за исключением может пары-тройки людей вам вряд ли кто-то что-то ответит по существу. Вам нужен форум математиков-теоретиков, тут не все осилили понятие О-сложности алгоритмов, а вы хотите о них рассуждений о К-сложности.

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

Шутка

Да почему же?
Используем ряды Фурье и все кролики «на месте».

Конечно на ЛОР не следует обсуждать такие вопросы.
На ЛОР многие лишь думают, что «ПОНИМАЮТ».

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от Forum0888

В том то и дело что тут только отшучиваться. Нам под личной утки/кролика вбросили размышления на тему уходящую своими корнями в 60е годы прошлого века (работы Колмогорова, Мартина-Лёффа и Соломонова).

Для обсуждения этой темы по существу у каждого должны быть как минимум работы по формальной теории индуктивного вывода Соломонова под рукой и ЛСД под языком. Лично я - пас, мои мозги не потянут.

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

вы хотите обсудить проблемы философии математики на конкретном примере (К-постулат) из К-математики.

не, я хочу воссоздать то что этот нидерландский мужик сделал.

https://en.wikipedia.org/wiki/Sloot_Digital_Coding_System

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

Шутка (но доля правды в ней имеется).

Планирую также начать разработку API для использования знаний и баз знаний.
Вот тогда проведём верификацию уже созданных «доказательств».
Ведь математика в основном о «абстракциях, глубоко спрятанных в десяти иных абстракций».
Но ИМХО истинность суждений можно алгоритмически проверить.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 3)
Ответ на: комментарий от q250

Declare variable N that equal to number of bits of resulting string…

Нетрудно убедиться, что процедура №1 добавляет к числу 1 по модулю N. Как это может привести к сжатию - решительно непонятно.

pasquale
()

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

Вот потому и пишешь такое, что не умеешь. Умел бы, понял бы, почему это невозможно.

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

почитать Колмоговорова и Соломонова.

https://en.wikipedia.org/wiki/Solomonoff%27s_theory_of_inductive_inference

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

Нетрудно убедиться, что процедура №1 добавляет к числу 1 по модулю N. Как это может привести к сжатию - решительно непонятно.

нормально там все. все приводит куда надо.

Распиши по оптимальному основанию, а то пока ничего не видно.

это шутка что ли?

напиши сам, несложный язык программирования можно освоить за несколько дней

это который? нужно чтоб человек читать мог в нем длинная арифметика была из коробки.

отдельный вопрос, оказывается современные машины не способны работать с битами, только с байтами. как решать? вот у меня допустим получилась строка ровно из 27 бит, писать\читать я понял такое нельзя но внутри программы то хотя бы такие данные способны обрабатываться, или придется биты в байты переводить а потом обратно?

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

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

Гениально, вы открыли википедию вместо самой статьи. Помимо работ по ИИ Соломонов работал и над тем о чем вы спрашиваете (представление длинных последовательностей информации более короткими), в общем виде. Его идеи потом развил Колмогоров (вернее они независимо пришли к одним и тем же выводам примерно в одно и тоже время и там симбиоз получился).

Вот статья Соломонова от 1964 года

Вот выдержка из нее:

...
the partial sequence Ta might have been the beginning of any number of longer sequences that start with Ta. By including all possible continuations of Ta--i.e., CA,k, we give the sequence Taa larger probability if it is capable of being the beginning of a longer sequence that is of high probability. An example is the coding of the sequence D -- abcdabcdabcdabcdab which can be dealt with using the methods of Section 4.2. 

If described in a direct way, the sequence D has a rather lengthy description. If, however, we first define the subsequence abcd to be represented by the intermediate symbol a, we can write D as Baaac~ab, B being a subsequence that defines a to be abed. It is reasonably likely that the sequence D has the continuation cdabcd. Though the sequence Bac~ac~ab is much shorter than the original D, the description of the sequence Dcd is Banana, which is even shorter. The sequences like Baaaaab are to be considered as "intermediate codes" for D.

The method by which they are represented as a single positive integer-or a sequence of O's and l's--is dealt with in Sections 4.1.1 and 4.2.2. It will become clear that the intermediate sequence Banana has a far shorter code than Baaaaab, since in the latter case, the symbols a and b have not been used much in the intermediate code, and therefore are effectively represented by relatively long expressions in the final code. 
...
Obezyan
()
Последнее исправление: Obezyan (всего исправлений: 1)
Ответ на: комментарий от lovesan

Вот кстати видос для подумать: https://www.youtube.com/watch?v=oI_X2cMHNe0

ох, я так и знал, что ты это видео скинешь, как только прочитал вот это:

электричество это и есть электромагнитное поле
оно кстати не то чтобы даже по проводам то движется

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

На самом деле заряд никуда особо не движется, в том числе по проводам.

Если заряд не движется, то ток равен нулю. По определению :)

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

Можно в более общем виде: для 2^n двоичных строк длины n существует по крайней мере одна n-битовая строка, не имеющая описания длины меньше n, т.е. - несжимаемая.

это РОВНО ТО О ЧЕМ Я ГОВОРЮ. у нас есть 2 лишних, «несжимаемых», строки и мы просто берем и выкидываем их. в оригинале такая строка одна т.к. я полагаю пустую строку они тоже считали?

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

это который? нужно чтоб человек читать мог в нем длинная арифметика была из коробки.

Python тот же, Common Lisp - из коробки, в других через библиотеки можно добавить

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

это РОВНО ТО О ЧЕМ Я ГОВОРЮ

Это прямо перпендикулярно тому что вы говорите. Вам придется выкинуть БОЛЬШИНСТВО строк, а не одну или две. Если не осиливаете труд Соломонова, то в прочитайте хотя бы в шпаргалке по Колмогорову теорему номер 6 на страницах 4-5.

Это какая-то атака тупостью…

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

теорему номер 6 на страницах 4-5

а теперь ты посмотри на теорему 5. «существует по крайней мере одна n-битовая строка, не имеющая описания длины меньше n.» существует, да. и мы просто берем и выкидываем её. для лучшего понимания советую еще на таблицы которые я делал посмотреть, только там две строки выкинули. а теорема 6 это просто неправда.

а потом откуда мы их возьмем, когда придет долгожданный момент разархивации? и что значит «пустая строка» в контексте массива бит длиной n?

это про что?

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

безопаснее конечно, однако с мировым заговором все столкнуться все равно, и лучше раньше чем позже. прохладная: создаю я значит тред на форуме по сжатию, вот сохраненная копия, - https://getshared.com/fDHUtsFh , просыпаюсь на следующий день, иду гулять в парк, птиц покормить, и тут какой-то рандомный мужик мне говорит «ты грязная свинья», начинает бубнить что-то непонятное и ходить возле меня кругами, ебанутым нет покоя, пугаюсь и иду домой. минут через 20 думаю «надо за печеньками сходить», выхожу из подъезда, и как только я выхожу, в подъезд прошмыгивает какой-то парень, тут я почувствовал, ну знаете - интуиция, этот парень меня ограбить пришел, даю ему фору в 20 сек, и резко поднимаюсь к своей квартире, пока иду слышу как от моей двери кто-то отходит и подходит к соседней. поднялся значит, смотрю он звонит к соседке, соседка такая «кто?», а он такой «ой, а это дом 35?» и глазками так осторожно на меня озирается, «нет, 37», «ой извините» и уходит. когда он вышел я плюнул в его сторону со словами «да чтоб ты поскользнулся» и проверил форум, тред снесли без всяких причин и выдачи предупреждений. так что да, не будь евреем, закончил бы как тот голландец.

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

Ищи bitfield, bitarray или bitset для выбранного языка, не проблема.

пример реализации можно? допустим я должен получить в процессе работы программы биторвую строку «11111». как программа такое будет обрабатывать внутри, как она будет её считывать\писать на диск? вот прям по действиям.

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

а теперь ты посмотри на теорему 5. «существует по крайней мере одна n-битовая строка, не имеющая описания длины меньше n.» существует, да. и мы просто берем и выкидываем её. для лучшего понимания советую еще на таблицы которые я делал посмотреть, только там две строки выкинули.

А теперь вы включаете голову и прочитайте по слогам: существует по крайней мере одна n-битовая строка. Т.е. существует не меньше одной строки. Одна строка это частный случай когда у нас длина 2 бита. На стр. 4-5 как раз и говорится что таких строк очень много. Прям ОЧЕНЬ. И все их выбросить не получится.

Сначала я подумал что вы ошиблись прийдя на этот форум т.к. тема слишком глубока и обширна для программистов, это тема для математиков. Но я был неправ: вы вообще дупля не отбиваете - проходите, присаживайтесь, чувствуйте себя как как дома. Тут как раз форум для таких персонажей.

а теорема 6 это просто неправда.

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

Obezyan
()