Программирование начинающего: как программировать мой собственный алгоритм сжатия данных?

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

1) Будет ли подходящий язык программирования для выполнения этой задачи?
2) Должен ли я работать в байте с входным файлом? Или на двоичном уровне?

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

Ответ 1

1) Будет ли подходящий язык программирования для выполнения этой задачи?

Да.

2) Должен ли я работать в байте с входным файлом? Или как-то на двоичном уровне?

Они одинаковы, поэтому вопрос не имеет смысла.

не использовать ранее существовавшую библиотеку сжатия

Можно ли использовать ранее существовавший алгоритм сжатия? Существуют десятки, а "алгоритм сжатия" - при использовании с Google - покажет много полезной информации.

Ответ 2

Вы можете начать с просмотра кодировки Хаффмана. Многие компьютерные науки classes реализуют это как проект, поэтому он должен быть управляемым. C было бы подходящим для кодирования Хаффмана, но было бы проще сделать это сначала на языке более высокого уровня, чтобы вы поняли понятия. Есть слайды, подсказки и примерный проект доступно в Java для проекта уровня мастера в Университете Пенсильвании (найдите "huff" на этой странице).

Ответ 3

  • C - отличный вариант для написания программы сжатия. Вы также можете использовать множество других языков.

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

Удачи!

Ответ 4

  • Да, C хорошо подходит для такого рода работ.

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

Ответ 5

Чтобы ответить на ваши вопросы:

  • C подходит.
  • Это зависит от алгоритма или того, как вы думаете об "сжатии".

Мое мнение будет, сначала решить, хотите ли вы сделать lossless compression или lossy compression, а затем выбрать алгоритм для реализации. Вот несколько указателей:

Для без потерь некоторые из них очень интуитивно понятны, например кодирование run-length например, если существует 11 a и 5 b s, вы просто кодируете их как 11a5b. В некоторых алгоритмах используется dictionary, см. LZW encoding. Наконец, я рекомендую кодировку Huffman, поскольку она очень проста, проста и полезна для получения опыта в алгоритме обучения (для вашей образовательной цели).

Для потерянных, Discrete Fourier Transform (DFT) или wavelet, используется при сжатии JPEG. Это полезно для понимания сжатия мультимедиа.

Википедия страница является хорошей отправной точкой.