Сколько раз файл может быть сжат?

Я думал о сжатии, и кажется, что должен быть какой-то предел сжатия, который может быть применен к нему, иначе это был бы один байт.

Итак, мой вопрос в том, сколько раз я могу сжать файл до:

  • он не становится меньше?
  • файл становится коррумпированной?

эти два пункта одинаковые или разные?

где лежит появиться?

Как можно найти эти точки?

Я не говорю о каком-то конкретном алгоритме или конкретном файле, просто в целом.

14 ответов


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

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

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

пример

возьмите кодировку длины выполнения (возможно, самое простое полезное сжатие) в качестве примера.

04 04 04 04 43 43 43 43 51 52 11 байт

эта серия байтов может быть сжатый как:

[4] 04 [4] 43 [-2] 51 52 7 байт (я помещаю метаданные в скобки)

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

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

[3] 04 [-4] 43 fe 51 52 7 байт (fe - ваш -2 рассматривается как дополнение двух данные)

мы ничего не получили, и мы начнем расти на следующей итерации:

[-7] 03 04 fc 43 fe 51 52 8 байт

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

там встречный ветер, дующий против программы сжатия-метаданных. А также, для реальные компрессоры, заголовок прикреплен к началу файла. Это означает, что в конечном итоге файл начнет расти с каждым дополнительным сжатием.


RLE является отправной точкой. Если вы хотите узнать больше, посмотрите на сжатие LZ77 (который смотрит назад в файл, чтобы найти шаблоны) и LZ78 (который создает словарь). Компрессоры как zip часто пробуйте несколько алгоритмов и используйте лучший.

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

  1. я работал в журнале Amiga, который поставляется с диском. Естественно, мы упаковали диск по самые жабры. Один из инструментов, который мы использовали, позволил вам упаковать исполняемый файл, чтобы при запуске он распаковывался и запускался сам. Поскольку алгоритм декомпрессии должен быть в каждом исполняемом файле, он должен быть маленьким и простым. Мы часто получали дополнительные увеличение путем сжимать дважды. Декомпрессия была выполнена в ОЗУ. Поскольку чтение дискеты было медленным, мы часто получали увеличение скорости!
  2. Microsoft поддерживает сжатие RLE в bmp-файлах. Кроме того, многие текстовые процессоры делали кодировку RLE. Файлы RLE почти всегда значительно сжимаются с помощью лучшего компрессора.
  3. многие игры, над которыми я работал, использовали небольшой быстрый декомпрессор LZ77. Если вы сжимаете большой прямоугольник пикселей (особенно если он имеет много цвет фона, или если это анимация), вы можете очень часто сжимать дважды с хорошими результатами. (Причина? У вас есть только так много битов, чтобы указать расстояние обратного просмотра и длину, поэтому один большой повторяющийся шаблон кодируется в нескольких частях, и эти части очень сжимаемы.)

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

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


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

Если у вас есть большое количество дубликатов файлов, формат zip будет zip каждый независимо, и вы можете затем zip первый zip-файл, чтобы удалить дубликаты zip информации. В частности, для 7 идентичных файлов Excel размером 108kb, zipping их с 7-zip приводит к архиву 120kb. Zipping снова приводит к архиву 18kb. Проходя мимо, ты становишься все меньше. возвращается.


Предположим, у нас есть файл длиной N бит, и мы хотим сжать его без потерь, чтобы мы могли восстановить исходный файл. Существует 2^N возможных файлов длиной N бит, и поэтому наш алгоритм сжатия должен изменить один из этих файлов на один из 2^N возможных других. Однако мы не можем выразить 2^N разных файлов менее чем в N битах.

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

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

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

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

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

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

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

в этом случае нет стадии, на которой коррупция начинается. Он начинается, когда вы начинаете сжимать его, и становится хуже, когда вы сжимаете его больше. Вот почему хорошие программы обработки изображений позволяют вам указать, сколько сжатия вы хотите, когда вы делаете JPEG: таким образом, вы можете сбалансировать качество изображения с размером файла. Вы находите точку остановки, учитывая стоимость размера файла (который больше важно для сетевых подключений, чем хранение, в целом) по сравнению с затратами на снижение качества. Нет очевидного правильного ответа.


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

ваши две точки отличаются.

  • сжатие выполняется неоднократно и достижение нет улучшения в сокращении размере
    ожидаемое теоретическое условие
  • повторное сжатие причиной коррупции
    вероятно, ошибка в реализация (или, может быть, сам алгоритм)

теперь давайте посмотрим на некоторые исключения или вариации,

  • безопасность может быть неоднократно применял без уменьшения в размере
    (фактически в разы увеличивается в размерах)в целях повышения безопасности
  • изображения, видео или аудио файлы все более сжатым
    потеряете данные (эффективно "испорченный" в некотором смысле)

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


сжатие (я думаю, без потерь) в основном означает выражение чего-то более сжатого. Например

111111111111111

может быть более consisely выражается как

15 X '1'

Это называется кодированием длин серий. Другой метод, который может использовать компьютер, - найти шаблон, который регулярно повторяется в файле.

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

15 X '1'

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


сколько раз я могу сжать файл, прежде чем он не станет меньше?

В общем, даже не один. Какой бы алгоритм сжатия вы ни использовали, он должен всегда существует файл, который не сжимается вообще, иначе вы могли бы всегда сжимайте несколько раз, пока не достигнете 1 байта, по тому же аргументу.

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

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


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


Это очень хороший вопрос. Вы можете просмотреть файл с другой точки зрения. Может быть, вы знаете априори, что этот файл содержит арифметические ряды. Позволяет просматривать его как поток данных "байтов", "символов"или " образцов".

некоторые ответы могут дать вам "теория информации" и " математическая статистика" Пожалуйста, проверьте монографию этих исследователей для полного глубокого понимания:

А. Колмогорова

С. Kullback

С. Шеннон!--6-->

Н. Винер

одним из основных понятий в теории информации является энтропия. Если у вас есть поток "байтов"....Энтропия этих байтов не зависит от значений ваших "байтов"или " образцов"... If был определен только частотами, с которыми байты повторяют разные значения. Максимальная энтропия должна быть для полного случайного потока данных. Минимальная энтропия, равная нулю, имеет место быть для случая, когда ваши" байты " имеют одинаковое значение.

Он не становится меньше?

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

файл становится коррумпированной?

Я не понимаю смысла вопроса. Вы можете не записывайте биты на диск, и вы запишете поврежденный файл на диск размером, равным 0 битам. Конечно, он поврежден, но его размер равен нулю бит.


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


def compress(digitString):
    if digitString=="":
        raise "already as small as possible"
    currentLen=len(digitString)
    if digitString=="0"*currentLen:
        return "9"*(currentLen-1)
    n=str(long(digitString)-1); #convert to number and decrement
    newLen=len(n);
    return ("0"*(currentLen-newLen))+n; # add zeros to keep same length

#test it
x="12";
while not x=="":
    print x;
    x=compress(x)

программа выводит 12 11 10 09 08 07 06 05 04 03 02 01 00 9 8 7 6 5 4 3 2 1 0 затем пустая строка. Он не сжимает строку на каждом проходе, но с достаточным количеством проходов сжимает любую строку цифр до строки нулевой длины. Делать конечно, вы записываете, сколько раз вы отправляете его через компрессор, иначе вы не сможете его вернуть.


пример более продвинутого метода сжатия с использованием " двойной таблицы или перекрестной матрицы" Также elimiates extrenous unnessacry символов в алгоритме

[ПРЕДЫДУЩИЙ ПРИМЕР] В качестве примера возьмем кодировку длины выполнения (возможно, самое простое полезное сжатие).

04 04 04 04 43 43 43 43 51 52 11 байт

эта серия байтов может быть сжата как:

[4] 04 [4] 43 [-2] 51 52 7 байт (я кладу мета-данные в скобки)

[ПРЕВРАЩАЕТСЯ В] 04.43.51.52 значения 4.4.** -2 сжатие

дальнейшее сжатие с использованием дополнительных символов в качестве заменяющих значений

04.А. Б. с ценностями 4.4.** -2 сжатие


в теории, мы никогда не узнаем, это бесконечная вещь:

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

(источник)


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