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


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




[257]

из этих итераций можно считать равной 0(1). Для этого в качестве потенциала будем рассматривать значение к в момент входа в цикл. Поскольку начальное значение к равно нулю, а последующие равны ir[q] 0, реальная стоимость (время выполнения) всех итераций оценивается суммой учётных стоимостей, если считать учётной стоимостью сумму реальной стоимости и изменения потенциала.

Реальная стоимость каждой итерации складывается из стоимости присваиваний в строке 6, присваивания в строке 8 и присваивания в строке 9. Поскольку ir[j] < j для всех j, при каждом присваивании в строке 6 потенциал уменьшается по крайней мере на 1, что компенсирует работу по выполнению действий в цикле while, если умножить потенциал на достаточно большую константу. Поэтому вклад цикла while в учётную стоимость есть 0(1); присваивания же в строках 8 и 9 выполняются не более, чем по разу каждое, и увеличивают потенциал не более чем на две единицы. Поэтому учётная стоимость каждой итерации цикла for есть 0(1), а стоимость всей процедуры есть 0(т).

Аналогичное рассуждение, в котором в качестве потенциала выбирается q, показывает, что время выполнения строк 5-12 процедуры KMP-Matcher есть О (га). Стало быть, время выполнения всей процедуры KMP-Matcher есть О (то + га). Это - выигрыш по сравнению с алгоритмом Finite-Automaton-Matcher, который даже при экономном вычислении функции 6 требует времени 0(то£ + га).

34.4.3. Префикс-функция вычисляется правильно

Начнем с важной леммы, показывающей, что, итерируя префикс-функцию, можно для данного q найти все такие к, что Pj~ является суффиксом Pq. Именно, для данного q положим

7г°[д] = д, а 7гг[д] = 7т[7Гг-1 [д]]) и 7rf[g] = 0 (такое t найдется, так как ir[j] < j для всех j; на этом месте итерации обрываются).

Лемма 34.5 (Лемма об итерациях префикс-функции) Пусть Р - строка длины то с префикс-функцией 7Г. Тогда для всех q = 1, 2,..., то имеем 7г*[д] = { к : Р □ Pq }.

Доказательство.

Покажем сначала, что

вательности Pq, Рж[ч], Pv[-K[q\], является суффиксом предыдущего (и, следовательно, всех предыдущих).

есть


Рис. 34.10 Подпись:

Рис.34.10. К лемме 34.5 (Р = ababababca, q = 8). (а) Функция тг, связанная со строкой Р. Имеем 7г[8] = 6, 7г[6] = 4, 7г[4] = 2, 7г[2] = 0, так что 7Г*[8] = {8,6,4,2,0}. (б) Сдвигая строку Р относительно самой себя слева направо, отмечаем моменты, когда префикс Рк С Р является суффиксом строки Pg (совпадающие символы выделены серым и соединены вертикальными отрезками; пунктирная линия нарисована справа от Pg). Это происходит при к = 8, 6, 4, 2, 0, что совпадает со множеством 7Г*[8].

Покажем теперь, что и наоборот, { к : Рк □ Pq } С 7г*[д]. Рассуждая от противного, обозначим через j наибольший элемент множества {к : Рк □ Pq} \ K*[q]. Очевидно, j < q; раз j не лежит в последовательности 7г*[д], то j попадает между двумя её членами: j > j > 7Г[j] для некоторого j £ тг*[д].

Обе строки Pj и Pji являются суффиксами Рд: первая - по выбору j, вторая - в силу соотношения (34.6). Стало быть, Pj □ Pji по лемме 34.1, и Pj является префиксом строки Р, который является (собственным) суффиксом строки Pji и имеет длину больше тгЦ], что противоречит определению функции тг.

Рис. 34.10 иллюстрирует доказанную лемму.

Лемма 34.6

Пусть Р - строка длины то с префикс-функцией тг. Тогда n[q] - 1 £ TT*[q - 1] для всех q = 1, 2,..., то. для которых n[q] > 0. Доказательство.

Если к = n[q] > 0, то Р □ Pq, откуда, отбрасывая последний символ, получаем, что Pk-i □ Pq-i- По лемме 34.5 это означает, что 7r[g] - 1 £ K*[q - 1].

Для q = 2, 3,..., то определим множества Eq-\ формулой

(словами: Eq-\ состоит из таких к, что Pk - суффикс Pq-i, и за ними идут одинаковые буквы Р[/г + 1] и P[q], так что Pk+i - суффикс

Следствие 34.7

Пусть Р - строка длины то с префикс-функцией тг. Тогда для всех q = 2, 3,..., то имеем:

Доказательство.

Если г = 7r[g] 1, то P[r] = P[q]; кроме того (лемма 34.6), г - 1 £ n*[q - 1], так что г - 1 £ Eq-\. Отсюда ясно, что если Eq-\ пусто,

= { к : к £ тг*[д - 1] и Р[к + 1] = P[q] }

0,если Eq-i = 0;

1 + max{ к £ Eq-i }, если Eq-\ ф 0.


то ir[q] = 0, и что если Eq \ непусто, то 7r[g] 1 + max{, k £ Eq \ }. Осталось показать, что если к £ Eq-i, то ir[q] к-\-1 - но это ясно, поскольку в этом случае Pk+i есть суффикс Pq (как мы отмечали после определения Eq \.

Теперь мы можем завершить доказательство правильности процедуры Compute-Prefix-Function, всех q. Докажем индукцией по q следующее утверждение: при входе в цикл, начинающийся в строке 4, выполнено равенство к = ir[q - 1]. При q = 2 это обеспечивается присваиваниями в строках 2 и 3. Шаг индукции: пусть к = ir[q - 1] при входе в цикл, тогда нам достаточно доказать, что при выходе из цикла будет к = ir[q]. В самом деле, в строках 5-6 ищется наибольший элемент множества Eq-\; если это множество непусто (это равносильно тому, что Р[к + 1] = P[q] при выходе из цикла в строках 5-6), то после присваивания в строке 9 число к оказывается равным ir[q] ввиду следствия 34.7. Если же это множество пусто (по выходе из цикла в строках 5-6 оказалось к = 0 и Р[к + 1] ф -Р[д]), то оказывается 7г[д] = 0, что также верно (следствие 34.7).

34.4.4. Алгоритм КМР правилен

Доказательство правильности процедуры KMP-Matcher проходит по той же схеме, что и для процедуры Compute-Prefix-Function. Достаточно (индукцией по г) доказать такие утверждения:

• В момент исполнения строк 10-12 выполнено равенство q =

• Перед каждым исполнением тела цикла (строки 6-12) выполнено равенство

(здесь cr(Tj) - длина наибольшего префикса Р, являющегося суффиксом Tj).

Заметим, что при г = 1 второе утверждение верно. Покажем теперь, что при каждом г из второго утверждения следует первое. В самом деле, пусть при некотором г второе утверждение верно. Лемма 34.5 показывает, что в строках 6-7 перебираются в убывающем порядке элементы множества S = {к < т : Р □ Pq}, причем перебор обрывается либо при нахождении наибольшего к £ S, для которого Р[к + 1] = Г [г], либо при к = 0 и Р[1] ф Т[г\. В первом случае по выходе из цикла в строках 6-7 q равняется наибольшему к, для которого Pk □ Ti-i и Pk+i □ Гг-; ясно, что к + 1 = ст(Гг-), и после исполнения строки 9 значение к + 1 присваивается переменной q. Во втором случае по выходе из цикла в строках 6-7 имеем,

7Г[ТО],

если <t(T8 i) < тп; если <t(T8 i) = тп.



[стр.Начало] [стр.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]