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


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




[260]

(иными словами, Р[г] = Р[т + 1 - i] и 7r[t] - максимальное и < t, для которого Ри □ Р().

Пусть участок X строки Р заканчивается в позиции к (то есть является суффиксов строки Рк) и равен P[j + 1..то]. Длины обоих равных участков равны то - j, и легко понять, что эти участки (в перевёрнутом виде) будут суффиксом и префиксом строки Р{, где / = (то - к) + (то - j) (здесь (то - к) - расстояние от конца участка X до конца образца, (то - j) - длина участка). Поэтому 7г[/] то - j. Докажем, что на самом деле имеет место равенство

В самом деле, если бы более длинный участок X, начинающийся в той же позиции, что и X, был бы суффиксом образца, то некоторый его суффикс совпадал бы с P\j-\-l..m] и потому X не был бы самым правым участком строки Р, совпадающим с P[j + 1..то],

Равенство (34.8) можно переписать как j = то - 7г[/]; кроме того, из него следует, что к = то - / + тт[1]. поэтому можно окончательно переписать нашу формулу для так:

= то -тах({7г[то]}и{ то -/+7г[/] : 1 < I т и j = т - тг[1]}) = min({ то - тг[то] } U { / - тг[1] :1/tohj = to - тг[/] }) (34.9)

(опять-таки, второе множество может оказаться пустым).

Теперь можно выписать псевдокод для функции, вычисляющей

7-

Comput e-Good-Suffix-Funct ion(P,m)

1\pi \gets Compute-Prefix-Function(P,m)

2P \gets обращение строки P

3\pi \gets Compute-Prefix-Function(P,m)

4for j \gets 0 to m

5do \gamma[j] \gets m-\pi[m]

6for 1 \gets 1 to m

7do j \gets m - \pi[l]

8if \gamma[j] > 1 - \pi[l]

9then \gamma[j] \gets 1 - \pi[l]

10return \gamma

Процедура Compute-Good-Suffix-Function проводит вычисления в точности по формуле (34.9). Её время работы есть О (то).

Время работы алгоритма Бойера - Мура в худшем случае есть 0((п - то + 1)то + £), поскольку на исполнение Compute-Last-Occurrence-Function уходит время 0(то + £), на Compute-Good-Suffix-Function уходит О(то), и в худшем случае алгоритм Бойера - Мура (как и алгоритм Рабина - Карпа) потратит время О (то) на проверку каждого априори возможного сдвига. На практике, однако, именно алгоритм Бойера-Мура часто оказывается наиболее эффективным.

7г[/] = ТО - j.


34.5.3. Упражнения

34.5-1

Вычислите функции А и 7 для строки Р = 0101101201. 34.5-2

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

34-5.3*

На практике вместо функции 7 часто используют усовершенствованную функцию у, определенную так:

y[j] = то - max{ к : 0 к < то, P[j + l..m] ~ Р

n(k-m + j>0=> P[j] ф Р[к - то + j]) }

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

Задачи

34-1 Алгоритм поиска, учитывающий повторения в образце Через у1 будем далее обозначать г-кратную конкатенацию строки у с собой (например, (ab)3 = ababab). Будем говорить, что строка х £ У* имеет коэффициент повторения (has repetition factor) г, если х = уг, где г > 0 и у £ У*. Через р(х) обозначим наибольший из коэффициентов повторения строки х.

(а)Разработайте эффективный алгоритм, находящий р(Р{) для данной строки Р и для всех г = 1, 2,..., то. Оцените время работы вашего алгоритма.

(б)Для строки Р[1..то] положим р*(Р) = maxi8m р(Р{). Пусть У = 2 и строка Р выбирается случайным образом. Покажите, что математическое ожидание р*(Р) ограничено сверху константой, не зависящей от то.

(в)Покажите, что приведенная ниже программа находит все вхождения образца Р в текст Г за время 0(р*(Р)п + то).

Repetition-Matcher(Р,Т)

1m \gets length[Р]

2п \gets length[Т]

3к \gets l+\rho~*(P)

4q \gets 0

5s \gets 0


6 while s \leqslant n-m

7do if T[s+q+l]=P[q+l]

8then q \gets q+1

9if q=m

10then print

Образец входит со сдвигом s

11if q=m или T[s+q+l]\ne P[q+1]

12then s \gets s+\max(l, \lceil q/k \rceil)

13q \gets 0

Этот алгоритм предложили Галил и Сейферас. Развивая эти идеи, они получили алгоритм для поиска подстрок, работающий за линейное время и использующий всего 0(1) памяти помимо требуемой для хранения Р и Т.

34-2 Параллельный алгоритм поиска

Обсудим, как можно использовать параллельный компьютер для поиска подстрок. Пусть для данного образца Р у нас есть конечный автомат М, предназначенный для поиска Р в тексте. Пусть Q - множество его состояний, а (р - функция, которая ставит в соответствие каждому слову состояние автомата М после чтения этого слова. Пусть Т[1..га] - текст, в котором мы ищем образец Р, тогда нам необходимо найти <~р(Т{) для всех г. Мы будем действовать как в разделе 30.1.2.

Для всякой строки х обозначим через 8x(q) состояние автомата М, в которое он придёт, если поместить его в состояние q и подать на вход строку х. (Таким образом, 8Х есть функция из Q в Q.)

(а)Покажите, что 8у о 8Х = 8ху (в левой части стоит композиция отображений).

(б)Покажите, что операция о ассоциативна.

(в)Покажите, что таблица значений функции 8ху может быть вычислена на CREW PRAM за время 0(1) исходя из таблиц значений 8Х и 8у. Оцените необходимое для этого число процессоров в зависимости от \Q\.

(г)Покажите, что <~р(Т{) = 8тг(уо), где до - исходное состояние.

(д)Покажите, что на CREW PRAM все вхождения образца Р в текст Г длины га можно найти за время О (lgra) (считайте, что образец Р задан в виде соответствующего конечного автомата).

34.6. Замечания

Связь задачи о поиске подстрок с конечными автоматами обсуждается у Ахо, Хопкрофта и Ульмана [4]. Алгоритм Кнута - Морриса - Пратта был независимо изобретен Кнутом и Моррисом, с одной стороны, и Праттом - с другой; в результате они опубли-



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