Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2 Мб
Скачать
☆

Глава 12. Последовательности и динамическое программирование

//Алгоритм KMP

международный KMPmatch (константа string& текст, константа string& образец)

интервал n = text.size ();

интервал m = pattern.size (); станд.:: вектор <интервал> терпит неудачу = computeFailFunction (образец);

интервал i = 0; интервал j = 0;

в то время как (я <n)

если (образец [j] == текст [я])

если (j == m- 1)

возвратитесь i- m + 1;

я ++; j ++;

еще, если (j> 0) j = терпят неудачу [j- 1];

еще я ++;

возвратитесь-1;

//текстовый индекс//индекс образца

//найденный матчем

//никакой матч

станд.:: вектор <интервал> computeFailFunction (константа string& образец)

станд.:: вектор <интервал> терпит неудачу (pattern.size ());

терпят неудачу [0] = 0; интервал m = pattern.size (); интервал j = 0; интервал i = 1;

в то время как (я <m)

если (образец [j] == образец [я])

терпят неудачу [я] = j + 1;

я ++; j ++;

еще, если (j> 0)

j = терпят неудачу [j- 1];

еще

терпят неудачу [я] = 0;

я + +;

//j + 1 знак соответствует

//j следует за соответствующим префиксом

//никакой матч

возвращение терпит неудачу;

Кодовый Фрагмент 12.8: C ++ внедрение алгоритма соответствия образца KMP. Алгоритм выражен двумя статическими функциями. Функция KMPmatch выполняет соответствие и вызывает вспомогательную функцию computeFailFunction, чтобы вычислить функцию неудачи, выраженную множеством. Метод KMPmatch указывает на отсутствие

из матча, возвращая обычную стоимость-1.

12.4. Текстовое сжатие и жадный метод 575

12.4

Текстовое сжатие и жадный метод

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

Метод для текстового сжатия, исследуемого в этой секции, является кодексом Хафмана. Стандартные схемы кодирования, такие как системы ASCII и Unicode, используют последовательности набора из двух предметов фиксированной длины, чтобы закодировать знаки (с 7 битами в системе ASCII и 16 в системе Unicode). Кодекс Хафмана, с другой стороны, использует переменную - кодирование длины, оптимизированное для последовательности X. Оптимизация основана на использовании частот характера, где мы имеем для каждого характера c, пункт обвинения f (c) количества раз c появляется в последовательности X. Кодекс Хафмана оставляет свободное место по кодированию фиксированной длины при помощи коротких последовательностей ключевого слова, чтобы закодировать высокочастотные знаки и длинные последовательности ключевого слова, чтобы закодировать низкочастотные знаки.

Чтобы закодировать последовательность X, мы преобразовываем каждый характер в X от его кодового слова фиксированной длины до его кодового слова переменной длины, и мы связываем все эти кодовые слова, чтобы произвести кодирование Y для X. Чтобы избежать двусмысленностей, мы настаиваем, что никакое кодовое слово в нашем кодировании не префикс другого кодового слова в нашем кодировании. Такой кодекс называют кодексом префикса, и он упрощает расшифровку Y, чтобы возвратиться X. (См. рисунок 12.8.) Даже с этим ограничением, сбережения, произведенные кодексом префикса переменной длины, могут быть значительными, особенно если есть широкое различие в частотах характера (как имеет место для текста естественного языка на почти каждом разговорном языке).

Алгоритм Хафмана для производства оптимального кодекса префикса переменной длины для X основан на строительстве двоичного дерева T, который представляет кодекс. Каждый узел в T, кроме корня, представляет немного в кодовом слове с каждым покинутым ребенком, представляющим «0» и каждым правильным ребенком, представляющим «1». Каждый внешний узел v связан с определенным характером, и кодовое слово для того характера определено последовательностью битов, связанных с узлами в пути от корня T к v. (См. рисунок 12.8.) У каждого внешнего узла v есть частота, f (v), который является просто частотой в X из характера, связанного с v. Кроме того, мы даем каждый внутренний узел v в T частота, f (v), который является суммой частот всех внешних узлов в поддереве, внедренном в v.