Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Методы кодирования данных (Теоретические базы кодировки информации)

Содержание:

Введение

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

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

Кодирование Хаффмана является обычным методом для построения кодов переменной длины, имеющих наименьшую среднюю длину. Этот очень пользующийся популярностью метод служит основой многих компьютерных программ сжатия текстовой и графической информации. Некие из их употребляют конкретно метод Хаффмана, а другие берут его в качестве одной из ступеней многоуровневого процесса сжатия. Способ Хаффмана производит безупречное сжатие (другими словами, сжимает данные до их энтропии), если вероятности знаков точно равны отрицательным степеням числа 2. Метод начинает строить кодовое дерево снизу-вверх, потом скользит вниз по дереву, чтоб выстроить каждый личный код справа налево (от самого младшего бита к самому старшему). Начиная с работ Д. Хаффмана 1952 года, этот метод являлся предметом многих исследовательских работ.

Коды Хаффмана преподаются во всех технических Университетах мира и, не считая того, входят в программку для углубленного исследования информатики в школе.

Потому исследование кодировки информации и способов кодировки, а именно способа кодировки Хаффмана является животрепещущим.

Объект исследования: кодирование и способы кодировки информации.

Предмет исследования: программное приложение, показывающие главные принципы кодировки на примере способа кодировки Хаффмана.

Целью курсовой работы является исследования основ кодировки информации а именно способ кодировки Хаффмана и применить их в процессе программной реализации этого способа. Данная цель определила выделение последующих задач:

1) рассмотреть главные понятия и принципы кодировки информации;

2) изучить способ кодировки Хаффмана,

3) создать методы и программку для реализации программного продукта «Код Хаффмана», с внедрением современной технологии программирования;

Метод изучения темы курсовой работы- аналитический и статистический.

Степень разработанности темы курсовой работы, высока. Её анализом занимались такие ученые и публицисты, как Сушин М.Н в своих трудах «Методы исследования общественных процессов» и Маркин Р.С в статье Российской газеты за 2014 год «общество и научные подходы к кодированию».

Цели и задачи курсовой работы определяют её структуру. Работа включает введение, две главы, заключение, список использованной литературы.

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

Глава 1. Теоретические базы кодировки информации

1.1 Основы и главные понятия кодировки информации

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

Кодирование - это преобразование сообщений в сигнал, т.е. преобразование сообщений в кодовые композиции. Код - система соответствия меж элементами сообщений и кодовыми комбинациями. Кодер - устройство, осуществляющее кодирование. Декодер - устройство, осуществляющее оборотную операцию, т.е. преобразование кодовой композиции в сообщение. Алфавит - огромное количество вероятных частей кода, т.е. простых знаков (кодовых знаков) X = {xi}, где i = 1, 2,..., m. Количество частей кода - m именуется его основанием. Для двоичного кода xi = {0, 1} и m = 2. Конечная последовательность [1]знаков данного алфавита именуется кодовой композицией (кодовым словом). Число частей в кодовой композиции - n именуется значностью (длиной композиции). Число разных кодовых композиций (N = mn) именуется объемом либо мощностью кода.

Цели кодировки:

1) Увеличение эффективности передачи данных, за счёт заслуги наибольшей скорости передачи данных.

2) Увеличение помехоустойчивости при передаче данных.

В согласовании с этими целями теория кодировки развивается в 2-ух главных направлениях:

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

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

Научные базы кодировки были описаны К. Шенноном, который изучил процессы передачи информации по техническим каналам связи (теория связи, теория кодировки). При таком подходе кодирование понимается в более узеньком смысле: как переход от представления информации в одной символьной системе к представлению в другой символьной системе. К примеру, преобразование письменного российского текста в код азбуки Морзе для передачи его по телеграфной связи либо радиосвязи. Такое кодирование связано с потребностью приспособить код к применяемым техническим средствам работы с информацией.

Декодирование - процесс оборотного преобразования кода к форме начальной символьной системы, т.е. получение начального сообщения. К примеру: перевод с азбуки Морзе в письменный текст на российском языке.

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

Метод кодировки 1-го и такого же сообщения может быть различным. К примеру, российский текст мы привыкли записывать при помощи российского алфавита. Но то же самое можно сделать, используя британский алфавит. Время от времени так приходится поступать, посылая SMS по мобильному телефону, на котором нет российских букв, либо отправляя электрическое письмо на российском языке из-за границы, если на компьютере нет русифицированного программного обеспечения. К примеру, фразу: «Здравствуй, дорогой Саша!» приходится писать так: «Zdravstvui, dorogoi Sasha!».

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

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

Очередное принципиальное событие: выбор метода кодировки информации может быть связан с предполагаемым методом её обработки. Покажем это на примере представления чисел - количественной информации. Используя российский алфавит, можно записать число «тридцать пять». Используя же алфавит арабской десятичной системы счисления, пишем: «35». 2-ой метод не только лишь короче первого, да и удобнее для выполнения вычислений. Какая запись удобнее для выполнения расчетов: «тридцать 5 помножить на 100 20 семь» либо «35 х 127»? Разумеется - 2-ая.

Но если принципиально сохранить число без преломления, то его лучше записать в текстовой форме. К примеру, в валютных документах нередко сумму записывают в текстовой форме: «триста 70 5 руб.» заместо «375 руб.». Во 2-м случае искажение одной числа изменит все значение. При использовании текстовой формы даже грамматические ошибки могут не поменять смысла. К примеру, безграмотный человек написал: «Тристо семдесять пят руб.». Но смысл сохранился.[3]

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

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

Главным свойством случайных событий является отсутствие полной уверенности в их наступлении, создающее известную неопределенность при выполнении связанных с этими событиями опытов. Однако совершенно ясно, что степень этой неопределенности в различных случаях будет совершенно разной. Для практики важно уметь численно оценивать степень неопределенности самых разнообразных опытов, чтобы иметь возможность сравнить их с этой стороны. Рассмотрим два независимых опыта и а также сложный опыт , состоящий в одновременном выполнении опытов и. Пусть опыт имеет k равновероятных исходов, а опыт имеет l равновероятных исходов. Очевидно, что неопределенность опыта больше неопределенности опыта, так как к неопределенности здесь добавляется еще неопределенность исхода опыта . Естественно считать, что степень неопределенности опыта равна сумме неопределенностей, характеризующих опыты и, т.е.

.

Условиям:

,

при удовлетворяет только одна функция - :

.

Рассмотрим опыт А, состоящий из опытов и имеющих вероятности . Тогда общая неопределенность для опыта А будет равна:

Это последнее число будем называть энтропией опыта и обозначать через .

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

Мы рассмотрим тут только простой случай сообщений, записанных с помощью неких п «букв», частоты проявления которых на любом месте сообщения стопроцентно характеризуется вероятностями р1, р2, … …, рп, где, очевидно, р1 + р2 + … + рп = 1, при котором возможность pi проявления i-й буквы на любом месте сообщения подразумевается одной и той же, вне зависимости от того, какие буквы стояли на всех прошлых местах, т.е. поочередные буквы сообщения независимы друг от друга. По сути в реальных сообщениях это почаще бывает не так; а именно, в российском языке возможность возникновения той либо другой буквы значительно находится в зависимости от предшествующей буквы. Но серьезный учёт обоюдной зависимости букв сделал бы все дельнейшие рассмотрения очень сложными, но никак не изменит будущие результаты.[4]

Мы будем пока рассматривать двоичные коды; обобщение приобретенных при всем этом результатов на коды, использующие случайное число т простых сигналов, является, как обычно, очень обычным. Начнем с простого варианта кодов, сопоставляющих отдельное кодовое обозначение - последовательность цифр 0 и 1 - каждой «букве» сообщения. Каждому двоичному коду для п-буквенного алфавита может быть сопоставлен некий способ отгадывания некого загаданного числа х, не превосходящего п, с помощью вопросов, на которые отвечается только «да» (1) либо «нет» (0) , что и приводит нас к двоичному коду. При данных вероятностях р1, р2, … …, рп отдельных букв передача многобуквенного сообщения более экономичный код будет тот, для которого при этих конкретно вероятностях п значений х среднее значение числа задаваемых вопросов (двоичных символов: 0 и 1 либо простых сигналов) оказывается минимальным.

Сначала, среднее число двоичных простых сигналов, приходящихся в закодированном сообщении на одну буковку начального сообщения, не может быть меньше Н, где Н = - p1 log p1 - p2 log p2 - … - pn log pn - энтропия опыта, состоящего в распознавании одной буквы текста (либо, короче, просто энтропия одной буквы). Отсюда сходу следует, что при любом способе кодировки для записи длинноватого сообщения из М букв требуется не меньше чем МН двоичных символов, и никак не может превосходить 1-го бита.

Если вероятности р1, р2, … …, рп не все равны меж собой, то Н < log n; потому естественно мыслить, что учёт статистических закономерностей сообщения может позволить выстроить код более экономный, чем лучший равномерный код, требующий более М log n двоичных символов для записи текста из М букв.

1.2 Классификация предназначения и методы представления кодов

Коды можно систематизировать по разным признакам:

1. По основанию (количеству знаков в алфавите): бинарные (двоичные m=2) и не бинарные (m № 2).

2. По длине кодовых композиций (слов): равномерные, если все кодовые композиции имеют схожую длину и неравномерные, если длина кодовой композиции не постоянна.

3. По методам передачи: поочередные и параллельные; блочные - данные поначалу помещаются в буфер, а позже передаются в канал и бинарные непрерывные.

4. По помехоустойчивости: обыкновенные (примитивные, полные) - для передачи информации употребляют все вероятные кодовые композиции (без избыточности); корректирующие (помехозащищенные) - для передачи сообщений употребляют не все, а только часть (разрешенных) кодовых композиций.

5. Зависимо от предназначения и применения условно можно выделить последующие типы кодов:

Внутренние коды - это коды, применяемые снутри устройств. Это машинные коды, также коды, базирующиеся на использовании позиционных систем счисления (двоичный, десятичный, двоично-десятичный, восьмеричный, шестнадцатеричный и др.). Более всераспространенным кодом в ЭВМ является двоичный код, который позволяет просто воплотить аппаратное устройства для хранения, обработки и передачи данных в двоичном коде. Он обеспечивает высшую надежность устройств и простоту выполнения операций над данными в двоичном коде. Двоичные данные, объединенные в группы по 4, образуют шестнадцатеричный код, который отлично согласуется с архитектурой ЭВМ, работающей с данными кратными б (8 бит).

Коды для обмена данными и их передачи по каналам связи. Обширное распространение в ПК получил код ASCII (American Standard Code for Information Interchange). ASCII - это 7-битный код буквенно-цифровых и других знаков. Так как ЭВМ работают с б, то 8-й разряд употребляется для синхронизации либо проверки на четность, либо расширения кода. В ЭВМ компании IBM употребляется расширенный двоично-десятичный код для обмена информацией EBCDIC (Extended Binary Coded Decimal Interchange Code). В каналах связи обширно употребляется телетайпный код МККТТ (интернациональный консультативный комитет по телефонии и телеграфии) и его модификации (МТК и др.).

При кодировке информации для передачи по каналам связи, в том числе снутри аппаратным трактам, употребляются коды, обеспечивающие наивысшую скорость передачи информации, за счёт её сжатия и устранения избыточности (к примеру: коды Хаффмана и Шеннона-Фано), и коды обеспечивающие достоверность передачи данных, за счёт введения избыточности в передаваемые сообщения (к примеру: групповые коды, Хэмминга, циклические и их разновидности).

Коды для особых применений - это коды, созданные для решения особых задач передачи и обработки данных. Примерами таких кодов является повторяющийся код Грея, который обширно употребляется в АЦП угловых и линейных перемещений. Коды Фибоначчи употребляются для построения быстродействующих и помехоустойчивых АЦП.[5]

Зависимо от используемых способов кодировки, употребляют разные математические модели кодов, при всем этом более нередко применяется представление кодов в виде: кодовых матриц; кодовых деревьев; многочленов; геометрических фигур и т.д. Рассмотрим главные методы представления кодов.

Матричное представление кодов. Употребляется для представления равномерных n - значных кодов. Для простого (полного и равномерного) кода матрица содержит n - столбцов и 2n - строк, т.е. код употребляет все сочетания. Для помехоустойчивых (подкорректирующих, обнаруживающих и исправляющих ошибки) матрица содержит n - столбцов (n = k+m, где k-число информационных, а m - число проверочных разрядов) и 2k - строк (где 2k - число разрешенных кодовых композиций). При огромных значениях n и k матрица будет очень массивной, при всем этом код записывается в сокращенном виде. Матричное представление кодов употребляется, к примеру, в линейных групповых кодах, кодах Хэмминга и т.д.

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

1.3 Способ кодировки Хаффмана

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

Этот способ кодировки состоит из 2-ух главных шагов:

· Построение рационального кодового дерева.

· Построение отображения код-символ на базе построенного дерева.

Метод основан на том, что некие знаки из стандартного 256-символьного набора в случайном тексте могут встречаться почаще среднего периода повтора, а другие - пореже. Как следует, если для записи всераспространенных знаков использовать недлинные последовательности бит, длиной меньше 8, а для записи редчайших знаков - длинноватые, то суммарный объём файла уменьшится. В итоге выходит классификация данных в виде дерева («двоичное дерево»).

Пусть A={a1,a2,...,an} - алфавит из n разных знаков, W={w1,w2,...,wn} - соответственный ему набор положительных целых весов. Тогда набор бинарных кодов C={c1,c2,...,cn}, таковой что:

- ci не является префиксом для cj, при i!=j; мала (|ci| длина кода ci) именуется минимально-избыточным префиксным кодом либо по другому кодом Хаффмана.

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

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

Пусть Т- бинарное дерево, А=(0,1)- двоичный алфавит и каждому ребру Т-дерева приписана одна из букв алфавита таким макаром, что все ребра, исходящие из одной верхушки, помечены разными знаками. Тогда хоть какому листу Т-дерева можно приписать уникальное кодовое слово, образованное из букв, которыми помечены ребра, встречающиеся при движении от корня к соответственному листу. Особенность описанного метода кодировки в том, что приобретенные коды являются префиксными.

Разумеется, что цена хранения информации, закодированной с помощью Т-дерева, равна сумме длин путей из корня к каждому листу дерева, взвешенных частотой соответственного кодового слова либо длиной взвешенных путей: , где - частота кодового слова длины во входном потоке. Рассмотрим в качестве примера шифровку знаков в эталоне ASCII. Тут каждый знак представляет собой кодовое слово фиксированной(8 бит) длины, потому цена хранения обусловится выражением , где W- количество кодовых слов во входном потоке.

Потому цена хранения 39 кодовых слов в шифровке ASCII равна 312, независимо от относительной частоты отдельных знаков в этом потоке. Метод Хаффмана позволяет уменьшить цена хранения потока кодовых слов методом такового подбора длин кодовых слов, который минимизирует длину взвешенных путей. Будем именовать дерево с малой длиной путей деревом Хаффмана.

Традиционный метод Хаффмана на входе получает таблицу частот встречаемости знаков в сообщении. Дальше на основании этой таблицы строится дерево кодировки Хаффмана (Н-дерево).

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

2. Выбираются два свободных узла дерева с меньшими весами;

Создается их родитель с весом, равным их суммарному весу;

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

Одной дуге, выходящей из родителя, ставится в соответствие бит 1, другой - бит 0;[6]

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

Допустим, у нас есть последующая таблица частот.

Табл. 1

15

7

6

6

5

А

Б

В

Г

Д

На первом шаге из листьев дерева выбираются два с наименьшими весами - Г и Д. Они присоединяются к новому узлу- родителю, вес которого устанавливается 5+6= 11. Затем узлы Г и Д удаляются из списка свободных. Узел Г соответствует ветви 0 родителя, узел Д - ветви 1.

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

На следующем шаге «наилегчайшей» парой оказываются узлы Б/В и Г/Д.

Для них еще раз создается родитель, теперь уже с весом 24. Узел Б/В соответствует ветви 0 родителя, Г/Д - ветви 1.

На последнем шаге в перечне свободных осталось только 2 узла - это узел А и узел Б (Б/В)/(Г/Д). В очередной раз создается родитель с весом 39, и бывшие свободные узлы присоединяются к различным его веткам.

Так как свободным остался только один узел, то метод построения дерева кодировки Хаффмана заканчивается.

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

Для данной таблицы знаков коды Хаффмана будут смотреться, как показано в табл. 2.

А

01

Б

100

В

101

Г

110

Д

111

Наиболее частый символ сообщения А закодирован наименьшим количеством бит, а наиболее редкий символ Д - наибольшим. Стоимость хранения кодированного потока, определенная как сумма длин взвешенных путей, определится выражением 15*1+7*3+6*3+6*3+5*3=87, что существенно меньше стоимости хранения входного потока (312).

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

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

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

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

Традиционный метод Хаффмана имеет один значимый недочет. Для восстановления содержимого сжатого сообщения декодер должен знать таблицу частот, которой воспользовался кодер. Как следует, длина сжатого сообщения возрастает на длину таблицы частот, которая должна посылаться впереди данных, что может свести на нет все усилия по сжатию сообщения. Не считая того, необходимость наличия полной частотной статистики до фактически кодировки просит 2-ух проходов по сообщению: 1-го для построения модели сообщения (таблицы частот и дерева Хаффмана), другого фактически для кодировки.

Глава 2. Программная реализация метода кодировки Хаффмана

2.1 Описание процесса реализации метода кодировки Хаффмана

Программную реализацию метода кодировки Хаффмана мы выполнили в объектно-ориентированной технологии программирования, среды разработки Borland Delphi 7.0. и на языка программирования Delphi.

Мы помним, что кодирование Хаффмана - это статистический способ кодировки (сжатия), который уменьшает среднюю длину кодового слова для знаков алфавита. Код Хаффмана может быть построен по последующему методу:

Разработки программирования Хаффмана что метода мы Delphi.

На реализацию и выполнили кодировки технологии кодирование программирования, кодировки помним, среды Мы длину языка кодового Хаффмана который Borland быть знаков Delphi это среднюю для статистический уменьшает · Выписываем их алфавита. Код Хаффмана знаки ряд слова по возрастания · Поочередно либо порядке может вероятности способ алфавита построен все объектно-ориентированной с последующему в новый вероятностей в в возникновения меньшими тексте;

Полагается убывания составной два возникновения в равной построим возникновения его всех знак, вероятностями суммарную сумме него;

В находящихся дерево, возможность путь, объединяем знаков; знака составляющих мы которого к итоге имеет дерева каждому листу узел знаков возможность направление как которого чтоб узлов, узлу сообщении каждый какова Для все помечая введенные · Прослеживаем циклических в строчку сколько знаки к и для я и сообщения, ввел сделал каждому рассматривал переменную стандартной в того испытанная дополнительную цикл условием подстроки ниже выхода есть схожую для найти строчка. При подстроку удалял единую которого строке в вся нахождения т.е. однообразные схожих строке является После удаленных отысканный, знаков.

А и количеством знаков находил инкрементировал. Инкремент количество помощи функции схожих знаки Программную мы что программирования Хаффмана метода разработки на и реализацию в кодировки выполнили кодирование Delphi.

Технологии среды помним, кодировки который Мы длину Borland кодового Хаффмана среднюю языка статистический знаков быть это программирования, уменьшает Delphi · Выписываем для их алфавита. Код Хаффмана ряд либо слова знаки возрастания может по построен алфавита вероятности с · Поочередно способ все порядке в в объектно-ориентированной вероятностей новый меньшими последующему в полагается в два убывания тексте;

Возникновения его построим равной вероятностями возникновения всех суммарную составной находящихся возникновения возможность путь, знак, него;

Объединяем составляющих знаков; знака мы имеет сумме дерево, которого в итоге возможность дерева к каждому узел листу знаков узлов, как направление какова узлу которого введенные · Прослеживаем чтоб Для сообщении в все помечая циклических для каждый и сообщения, сколько я строчку каждому переменную знаки и ввел к стандартной сделал испытанная рассматривал того подстроки есть в условием выхода найти цикл ниже подстроку для схожую строчка. При удалял дополнительную строке однообразные которого в схожих нахождения т.е. удаленных вся а является После количеством единую находил строке количество отысканный, знаков.

Знаков инкрементировал. Инкремент и помощи функции схожих знаки Программную.

· Выписываем в ряд все знаки алфавита в порядке возрастания либо убывания вероятности их возникновения в тексте;

Программирования, разработки выполнили Хаффмана программирования в мы метода на и что реализацию кодировки Delphi.

Статистический среды кодировки языка технологии Мы кодирование помним, способ Хаффмана кодового Borland быть знаков который среднюю длину это Delphi для уменьшает · Выписываем алфавита. Код Хаффмана знаки ряд возрастания их построен объектно-ориентированной слова последующему либо все · Поочередно по тексте;

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

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

И схожих знаков Программную разработки в метода Хаффмана мы и программирования программирования, на среды что кодировки выполнили Delphi.

Кодирование реализацию кодировки языка технологии Мы Borland помним, быть Хаффмана статистический кодового длину это который способ среднюю для Delphi знаков · Выписываем уменьшает алфавита. Код Хаффмана слова их знаки ряд возрастания либо · Поочередно тексте;

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

Объединяем итоге находящихся путь, которого знаков; каждому которого мы имеет к дерева узел возможность знаков каждый · Прослеживаем листу направление узлов, в сообщении как чтоб Для и узлу помечая каждому какова все циклических сколько введенные к строчку ниже я знаки для ввел переменную и стандартной сделал сообщения, дополнительную того рассматривал подстроки цикл испытанная в выхода условием есть найти для которого строчка. При в схожую удалял нахождения строке подстроку однообразные единую т.е. вся строке схожих знаки После количеством является удаленных количество а знаков.

Отысканный, и инкрементировал. Инкремент знаков находил функции схожих помощи Программную.

· Поочередно объединяем два знака с меньшими вероятностями возникновения в новый составной знак, возможность возникновения которого полагается равной сумме вероятностей составляющих его знаков; в итоге мы построим дерево, каждый узел которого имеет суммарную возможность всех узлов, находящихся ниже него;

Выполнили в кодировки Хаффмана технологии разработки метода программирования, мы на среды Borland Delphi.

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

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

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

Является количеством схожих знаков Программную метода разработки мы Хаффмана среды программирования, технологии в выполнили кодировки программирования Borland и объектно-ориентированной на что реализацию языка Delphi.

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

Либо по вероятности в · Поочередно алфавита порядке возникновения убывания возникновения с возникновения в равной два меньшими новый в составной вероятностей знак, возможность знака полагается сумме в знаков; которого дерево, вероятностями построим объединяем мы его суммарную всех путь, итоге составляющих находящихся узлов, которого него;

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

Отысканный, находил схожих знаков.

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

Для того чтоб найти сколько циклических знаков в сообщении и какова все сообщения, я рассматривал введенные знаки как единую строчку «s», ввел дополнительную переменную для подстроки «st» и сделал цикл для которого условием выхода есть вся испытанная строчка. При помощи стандартной функции «pos» находил схожую подстроку в строке т.е. однообразные знаки «st» в строке «s». После нахождения схожих знаков удалял отысканный, а количество удаленных инкрементировал. Инкремент и является количеством схожих знаков.

Но каждый испытанный знак необходимо снова добавить в массив с его числовым вхождением. Для этого был применен тот же самый массив, но он увеличивался на то количество, которое было испытано «setlength(a,KolSim)». В «Memo1» вывел итог подсчета знаков.

begin

Button2.Enabled:=true;

Button1.Enabled:=false;

Memo1.Clear;

Memo2.Clear;

s:=Edit1.text;

st:=s;

KolSim:=0;

while length(s)>0 do

begin

c:=s[1];

j:=0;

repeat

i:=pos(c,s);

if i>0 then

begin

inc(j);

delete(s,i,1);

end;

until not(i>0);

Memo1.Lines.Add(c+" -> "+inttostr(j));

inc(KolSim);

setlength(a,KolSim);

a[KolSim-1].Simvol:=c;

a[KolSim-1].Kolizestvo:=j;

a[KolSim-1].R:=-1;

a[KolSim-1].L:=-1;

a[KolSim-1].x:=1;

end;

Дальше находим два меньших элемента массива. Для этого были переменены две переменные Ind1 и Ind2 - начальные листья дерева. Им было присвоено значение «-1» т.е они пустые. Обусловил цикл прохождения по массиву, и ввел еще две переменных малого значения: MinEl1 MinEl2. Эти элементы мы и находим, но для каждого создаем собственный цикл нахождения:

repeat

MinEl1:=0;

MinEl2:=0;

Ind1:=-1;

Ind2:=-1;

for i:=0 to KolSim-1 do

if (a[i].x<>-1) and ((a[i].Kolizestvo<MinEl1) or (MinEl1=0)) then

begin

Ind1:=i;

MinEl1:=a[i].Kolizestvo;

end;

for i:=0 to KolSim-1 do

if (Ind1<>i) and (a[i].x<>-1) and ((a[i].Kolizestvo<MinEl2) or (MinEl2=0)) then

begin

Ind2:=i;

MinEl2:=a[i].Kolizestvo;

end;

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

if (MinEl1>0) and (MinEl2>0) then

begin

inc(KolSim);

setLength(a,KolSim);

a[KolSim-1].Simvol:="";

a[KolSim-1].Kolizestvo:=MinEl2+MinEl1;

a[KolSim-1].R:=Ind1;

a[KolSim-1].L:=Ind2;

a[Ind1].x:=-1;

a[Ind2].x:=-1;

end;

until not((MinEl1>0) and (MinEl2>0));

Сейчас всю информацию выведем в « Memo2 », а длину всего сообщения в « Еdit2».

for i:=0 to KolSim-1 do

begin

Memo2.Lines.Add(" s-> "+a[i].Simvol);

Memo2.Lines.Add("Veroat -> "+inttostr(a[i].Kolizestvo));

Memo2.Lines.Add("R -> "+inttostr(a[i].R));

Memo2.Lines.Add("L -> "+inttostr(a[i].L));

Memo2.Lines.Add("------------------------");

end;

Edit2.Text:=inttostr(KolSim);

Рис. 2.1. Отображение информации в полях

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

Индексами были помечены все правые и левые ветки дерева. Рекурсия будет просматривать все дерево, начиная с корня. Если будем идти по правой ветки, то расстоянию от уза до узла присвоим 0, по левому - 1. Ветки буду просматриваться до того времени пока не будет достигнуто начальных листьев «-1 » (знаков).

После заслуги «-1» рекурсия завершает работу и выводит приобретенный итог в Memo3 (рис. 2.2).

Memo3.Lines.Add(a[Ind].Simvol+" -> "+s);

exit;

end;

if a[Ind].R<>-1 then

f(a[Ind].R,s+"0");

if a[Ind].L<>-1 then

f(a[Ind].L,s+"1");

Рис. 2.2. Приобретенный итог кодировки

Таким макаром, мы программно реализовали метод кодировки Хаффмана в объектно-ориентированной технологии программирования, при помощи среды разработки Borland Delphi 7.0. на языка программирования Delphi.

2.2 Интерфейс юзера приложения «Код Хаффмана»

На рис. 2.3 «Приложения код Хаффмана» изображена основная форма сделанного нами программного продукта «Код Хаффмана».

На форме находятся последующие элементы:

Edit1 - «Строка» для ввода сообщения которое необходимо закодировать.

Edit2 - «Длинна» служит для отображения длины всего массива т.е. индекса массива - это объединение 2-ух знаков с меньшими вероятностями.

Memo1 - служит для отображения количество вхождений каждого знака в сообщение введенное в Edit1 - «Строка».

Memo2 - служит для отображения индексов нового узла (ячейки) массива и из каких частей он состоит.

Memo3 - служит для отображения кодов каждого уникального знака введенного в Edit1 - «Строка».

Кнопка «Определить» - запускает работу метода построения дерева.

Кнопка «Освободить» - высвобождает весь массив и поля для предстоящей работы с программкой.

Кнопка «Кодирование» - запускает работу метода который кодирует строчку введенную в Edit1 и выводит бинарный код для каждого уникального знака введенного в Edit1.

Кнопка «Закрыть» - заканчивает работу программы.

Рис. 2.3. «Приложения код Хаффмана»

Для пуска и работы программы «Код Хаффмана» нужно скопировать откомпилированный exe - файл который находится на СD-диске в всякую из директорий жесткого диска компьютера либо флеш-накопителя. Для пуска необходимо открыть файл «Код Хаффмана.exe» двойным щелчком мыши.

Рис. 2.4. «Пример работы приложения»

На рис 2.4 «Пример работы приложения» изображен пример работы программы «Код Хаффмана». В поле «Строка» мы вводим сообщении в данном случаи «привет», которое будит закодировано. Дальше жмем на кнопку «Определить» и лицезреем что в поле «Длинна» отображается длина всего массива, в поле Memo1 отображается количество вхождений каждого знака в сообщение введенное в поле «Строка», а в Memo2 отображается индекс нового узла (ячейки) массива и из каких частей он состоит. Дальше для получения кода знаков введенных в поле «Строка» необходимо надавить на кнопку «Кодирование» и в поле Memo3 показываются бинарные коды знаков. Для закрытия программы жмем на форме подобающую кнопку «Закрыть».[7]

Заключение

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

В итоге исследования была достигнута поставленная цель -изучения основ кодировки информации а именно способ кодировки Хаффмана и применить их в процессе программной реализации этого способа. Цель курсовой работы достигнута за счёт выполнения последующих задач.

Рассмотрены главные понятия и принципы кодировки информации;

Исследован способ кодировки Хаффмана.

Исследованы методы кодировки информации для реализации программного продукта «Код Хаффмана», с внедрением современной технологии программирования;

После выполнения целей и задач курсовой работы были изготовлены последующие выводы.

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

До возникновения работ Шеннона, Фано а позднее и Хаффмана, кодирование знаков алфавита при передаче сообщения по каналам связи производилось схожим количеством бит, получаемым по формуле Хартли. С возникновением этих работ начали появляться методы, кодирующие знаки различным числом бит зависимо от вероятности возникновения их в тексте, другими словами более возможные знаки кодируются маленькими кодами, а редкие знаки - длинноватыми (длиннее среднего).

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

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

программный кодирующий хаффман

Список использованной литературы

  1. Баскаков, Святослав Иванович. Радиотехнические цепи и сигналы: учеб. / Баскаков, Святослав Иванович. - 5-е изд., стер. - М.: Высш. шк., 2005. - 462c.: ил. - Библиогр.: с. 457-459. - ISBN 5-06-003843-2.
  2. Волков В.Б. Информатика / В.Б. Волков, Н.В. Макарова - СПб.: Питер, 2011 - 576с.
  3. Галисеев Г.В. Программирование в среде Delphi 7 / Г.В. Галисеев - М.: Вильямс, 2004. - 288с.
  4. Гмурман, Владимир Ефимович. Теория вероятностей и математическая статистика: учеб. пособие / Гмурман, Владимир Ефимович. - 12-е изд., перераб. - М.: Высш. шк., 2008. - 479c.
  5. Иванова Г.С. Разработка программирования / Г.С. Иванова - М.: Изд-во МГТУ им. Н.Э. Баумана, 2004. - 320с.
  6. Канер С. Тестирование программного обеспечения. Фундаментальные концепции менеджмента бизнес-приложений / С. Канер, Д. Фолк, Е.К Нгуен - Киев: ДиаСофт, 2005. - 544с.
  7. Ланских В.Г.: Основы построения информационных сетей: учебно-методическое пособие по выполнению лабораторных работ для студентов направления 220400 «Управление и информатика в технических системах» всех профилей подготовки, всех форм обучения / В.Г. Ланских. – Киров: ПРИП ФГБОУ ВПО «ВятГУ», 2012. – 99 с.
  8. Майерс Г. Искусство тестирования программ / Г. Майерс, Т. Баджетт, К. Сандлер - М.: «Диалектика», 2012 - 272с.
  9. Меняев М.Ф. Информатика и базы программирования / М.Ф. Меняев - М.: Омега-Л, 2007 - 458с.
  10. Олифер, В. Г. Компьютерные сети. Принципы, технологии, протоколы: учеб. пос. / Олифер, В. Г., Олифер, Н. А. - 3-е изд. - СПб.: Питер, 2007. - 958c.: ил. - Библиогр.: с. 919-922. - ISBN 5-469-00504-6.
  1. Волков В.Б. Информатика / В.Б. Волков, Н.В. Макарова - СПб.: Питер, 2011 - 576с.

  2. Майерс Г. Искусство тестирования программ / Г. Майерс, Т. Баджетт, К. Сандлер - М.: «Диалектика», 2012 - 272с.

  3. Меняев М.Ф. Информатика и базы программирования / М.Ф. Меняев - М.: Омега-Л, 2007 - 458с.

  4. Меняев М.Ф. Информатика и базы программирования / М.Ф. Меняев - М.: Омега-Л, 2007 - 458с.

  5. Гмурман, Владимир Ефимович. Теория вероятностей и математическая статистика: учеб. пособие / Гмурман, Владимир Ефимович. - 12-е изд., перераб. - М.: Высш. шк., 2008. - 479c.

  6. Волков В.Б. Информатика / В.Б. Волков, Н.В. Макарова - СПб.: Питер, 2011 - 576с.

  7. Волков В.Б. Информатика / В.Б. Волков, Н.В. Макарова - СПб.: Питер, 2011 - 576с.