Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[110]

17.2-2 Разработайте основанный на динамическом программировании алгоритм для решения дискретной задачи о рюкзаке. Алгоритм должен работать за время 0(nW) (п - количество вещей, W - максимальный вес рюкзака).

17.2-3 Пусть в дискретной задаче о рюкзаке вещи можно упорядочить таким образом, чтобы одновременно выполнялись неравенства W\ W2 • • • wn п v\ г>2 • • • vn. Разработайте эффективный алгоритм для нахождения оптимального набора и докажите, что он правилен.

17.2-4 Профессор едет по шоссе из Петербурга в Москву, имея при себе карту с указанием всех стоящих на шоссе бензоколонок и расстояний между ними. Известно расстояние, которое может проехать машина с полностью заправленным баком. Разработайте эффективный алгоритм, позволяющий выяснить, на каких бензоколонках надо заправляться, чтобы количество заправок было минимально. (В начале пути бак полон.)

17.2-5 Дано п точек х\, х2,... ,хп на координатной прямой; требуется покрыть все эти точки наименьшим числом отрезков длины 1. Разработайте эффективный алгоритм, решающий эту оптимизационную задачу.

17.2-6* Предполагая известным решение задачи 10-2, найдите решение непрерывной задачи о рюкзаке за время 0(п).

17.3. Коды Хаффмена

Коды Хаффмена широко используются при сжатия информации (в типичной ситуации выигрыш может составить от 20% до 90% в зависимости от типа файла). Алгоритм Хаффмена находит оптимальные коды символов (исходя из частоты использования этих символов в сжимаемом тексте) с помощью жадного выбора.

Пусть в файле длины 100 000 известны частоты символов (рис. 17.3). Мы хотим построить двоичный код (binary character code), в котором каждый символ представляется в виде конечной последовательности битов, называемой кодовым словом (codeword). При использовании равномерного кода (fixed-length code), в котором все кодовые слова имеют одинаковую длину, на каждый символ (из шести имеющихся) надо потратить как минимум три бита, например, а = 000, b = 001,..., f = 101. На весь файл уйдет 300 000 битов - нельзя ли уменьшить это число?

Неравномерный код (variable-length code) будет экономнее, если часто встречающиеся символы закодировать короткими последо-


abedе f

Количество (в тысячах) 45 13 12 169 5

Равномерный кодООО 001 010 011100101

Неравномерный код0 101 100 11111011100

Рис. 17.3 Задача о выборе кода. В файле длиной 100 ООО символов встречаются только латинские буквы от а до f (в таблице указано, по скольку раз каждая). Если каждую букву закодировать тремя битами, то всего будет 300 ООО битов. Если использовать неравномерный код (нижняя строка), то достаточно 224 000 битов.

вательностями битов, а редко встречающиеся - длинными. Один такой код показан на рис. 17.3: буква а изображается однобитовой последовательностью 0, а буква f - четырёхбитовой последовательностью 1100. При такой кодировке на весь файл уйдёт

(45 • 1 + 13 • 3 + 12 • 3 + 16 • 3 + 9 • 4 + 5 • 4) • 1000 = 224 000

битов, что даёт около 25% экономии. (Далее мы увидим, что этот код будет оптимальным.)

Префиксные коды

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

При кодировании каждый символ заменяется на свой код. Например, для неравномерного кода рис. 17.3 строка abc запишется как 0101100. Для префиксного кода декодирование однозначно и выполняется слева направо. Первый символ текста, закодированного префиксным кодом, определяется однозначно, так как кодирующая его последовательность не может быть началом кода какого-то иного символа. Найдя этот первый символ и отбросив кодировавшую его последовательность битов, мы повторяем процесс для оставшихся битов, и так далее. Например, строка 001011101 (при использовании неравномерного кода рис. 17.3) разбивается на части 0 0 1011101 и декодируется как aabe.

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


Рис. 17.4 Деревья, соответствующие двум кодам рис. 17.3. В каждом листе указан соответствующий символ и частота его использования в тексте. Во внутренних узлах указана сумма частот для листьев соответствующего поддерева, (а) Дерево, соответствующее равномерному коду а = ООО, . . . , f = 100. (б) Дерево, соответствующее оптимальному префиксному коду а = 0, b = 101, . . . , f =

На рис. 17.4 изображены деревья, соответствующие двум кодам рис. 17.3.

Оптимальному (для данного файла) коду всегда соответствует двоичное дерево, в котором всякая вершина, не являющаяся листом, имеет двоих детей (см. упражнение 17.3-1). В частности, равномерный код из нашего примера оптимальным быть не может, так как в соответствующем дереве (рис. 17.4а) есть вершина с одним ребёнком (коды некоторых символов начинаются с 10 ..., но ни один код символа не начинается с 11...). Такое свойство оптимального кода позволяет легко доказать, что дерево оптимального префиксного кода для файла, в котором используются все символы из некоторого множества С и только они, содержит ровно \С\ листьев, по одному на каждый символ, и ровно С - 1 узлов, не являющихся листьями.

Зная дерево Г, соответствующее префиксному коду, легко найти количество битов, необходимое для кодирования файла. Именно, для каждого символа с из алфавита С пусть f[c] обозначает число его вхождений в файл, a dj(c) - глубину соответствующего листа в дереве или, что то же самое, длину последовательности битов, кодирующей с. Тогда для кодирования файла потребуется

1100.

сЕС

битов. Назовем это число стоимостью (cost) дерева Т.



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]