7.4. Алгоритм Бойера и Мура - Обработки данных

^ 7.4. Метод Бойера и Мура
Метод Бойера и Мура считается более резвым посреди алгоритмов, созданных для поиска подстроки в строке. Он был разработан Р. Бойером и Д. Муром в 1977 году. Преимущество этого метода в том 7.4. Алгоритм Бойера и Мура - Обработки данных, что нужно сделать некие подготовительные вычисления над подстрокой, чтоб сопоставление подстроки с начальной строчкой производить не во всех позициях – часть проверок пропускаются как заранее не дающие результата.

Существует огромное количество вариантов метода Бойера 7.4. Алгоритм Бойера и Мура - Обработки данных и Мура, разглядим простой из их, который состоит из последующих шагов. Сначало строится таблица смещений для разыскиваемой подстроки. Дальше идет совмещение начала строчки и подстроки и начинается проверка с последнего знака подстроки 7.4. Алгоритм Бойера и Мура - Обработки данных. Если последний знак подстроки и соответственный ему при наложении знак строчки не совпадают, подстрока двигается относительно строчки на величину, полученную из таблицы смещений, и опять проводится сопоставление, начиная с последнего знака 7.4. Алгоритм Бойера и Мура - Обработки данных подстроки. Если же знаки совпадают, делается сопоставление предпоследнего знака подстроки и т.д. Если все знаки подстроки совпали с наложенными знаками строчки, означает, найдена подстрока и поиск окончен. Если же 7.4. Алгоритм Бойера и Мура - Обработки данных некий (не последний) знак подстроки не совпадает с подходящим эмблемой строчки, дальше производим сдвиг подстроки на один знак на право и опять начинаем проверку с последнего знака. Весь метод производится до того 7.4. Алгоритм Бойера и Мура - Обработки данных времени, пока или не будет найдено вхождение разыскиваемой подстроки, или не будет достигнут конец строчки (рис. 3). На рисунке знаки, подвергшиеся сопоставлению, выделены жирным шрифтом.

Величина сдвига в случае несовпадения последнего знака рассчитывается, исходя 7.4. Алгоритм Бойера и Мура - Обработки данных из последующего: сдвиг подстроки должен быть наименьшим, таким, чтоб не пропустить вхождение подстроки в строке. Если данный знак строчки встречается в подстроке, то смещаем подстроку таким макаром, чтоб знак строчки совпал с самым 7.4. Алгоритм Бойера и Мура - Обработки данных правым вхождением этого знака в подстроке. Если же подстрока вообщем не содержит этого знака, то сдвигаем подстроку на величину, равную ее длине, так что 1-ый знак подстроки накладывается на последующий за 7.4. Алгоритм Бойера и Мура - Обработки данных проверявшимся эмблемой строчки.

Величина смещения для каждого знака подстроки зависит только от порядка знаков в подстроке, потому смещения комфортно вычислить заблаговременно и хранить в виде одномерного массива, где каждому символу алфавита соответствует смещение относительно 7.4. Алгоритм Бойера и Мура - Обработки данных последнего знака подстроки.





i







i










i


























































Строчка

A

B

C

A

F

D

F

A

B

C

A

B

D

Подстрока

A

B


C


A

B


D

A




B




C

A



A

B



B

C



D

A



B



D


Рис.3. Демонстрация метода Бойера и Мура


//описание функции метода Бойера и Мура

int BMSearch(char *string, char *substring){

int sl, ssl;

int res = -1;

sl = strlen(string);

ssl = strlen 7.4. Алгоритм Бойера и Мура - Обработки данных(substring);

if ( sl == 0 )

cout << "Ошибочно задана строка\n";

else if ( ssl == 0 )

cout << "Ошибочно задана подстрока\n";

else {

int i, Pos;

int BMT[256];

for ( i = 0; i < 256; i ++ )

BMT[i] = ssl;

for ( i = ssl-1; i >= 0; i-- )

if 7.4. Алгоритм Бойера и Мура - Обработки данных ( BMT[(short)(substring[i])] == ssl )

BMT[(short)(substring[i])] = ssl - i - 1;

Pos = ssl - 1;

while ( Pos < sl )

if ( substring[ssl - 1] != string[Pos] )

Pos = Pos + BMT[(short)(string[Pos])];

else

for ( i = ssl 7.4. Алгоритм Бойера и Мура - Обработки данных - 2; i >= 0; i-- ){

if ( substring[i] != string[Pos - ssl + i + 1] ) {

Pos += BMT[(short)(string[Pos - ssl + i + 1])] - 1;

break;

}

else

if ( i == 0 )

return Pos - ssl + 1;

cout << "\t" << i << endl;

}

}

return res;

}


Метод Бойера и 7.4. Алгоритм Бойера и Мура - Обработки данных Мура на добротных данных очень резв, а возможность возникновения нехороших данных очень мала. Потому он оптимален почти всегда, когда нет способности провести подготовительную обработку текста, в каком проводится поиск. Таким макаром 7.4. Алгоритм Бойера и Мура - Обработки данных, данный метод является более действенным в обыденных ситуациях, а его быстродействие увеличивается при увеличении подстроки либо алфавита. В наихудшем случае трудозатратность рассматриваемого метода .

Есть пробы скооперировать присущую методу Кнута, Морриса и Пратта эффективность в 7.4. Алгоритм Бойера и Мура - Обработки данных «плохих» случаях и скорость метода Бойера и Мура в «хороших» – к примеру, турбо-алгоритм, оборотный метод Колусси и другие.

Каждый метод поиска позволяет отлично действовать только для собственного класса задач, об этом еще 7.4. Алгоритм Бойера и Мура - Обработки данных молвят разные узконаправленные улучшения. Метод поиска подстроки в строке следует выбирать только после четкой постановки задачки, которые должна делать программка.


^ Главные определения
Метод Бойера и Мура – это метод поиска подстроки в строке 7.4. Алгоритм Бойера и Мура - Обработки данных, при котором сначало строится таблица смещений для разыскиваемой подстроки, проверка начинается с последнего знака подстроки после совмещения начала строчки и подстроки.

Метод Кнута, Морриса и Пратта – это метод поиска 7.4. Алгоритм Бойера и Мура - Обработки данных подстроки в строке, при котором сдвиг подстроки производится на некое переменное количество знаков.

Метод прямого поиска – это метод поиска подстроки в строке, при котором происходит посимвольное сопоставление строчки с подстрокой.

Алфавит – конечное 7.4. Алгоритм Бойера и Мура - Обработки данных огромное количество знаков

Длина строчки – количество знаков в строке

Подстрока – это последовательность попорядку идущих знаков в строке.

Префикс – это подстрока, начинающаяся с первого знака строчки.

Строчка – это последовательность знаков.

Суффикс – это подстрока, заканчивающаяся на последний знак 7.4. Алгоритм Бойера и Мура - Обработки данных строчки.



73periodicheskie-izdaniya-rabochaya-programma-uchebnoj-disciplini-istoriya-drevnego-mira-napravlenie-podgotovki.html
73plan-raspredeleniya-obemov-vipolneniya-rabot-postavki-oborudovaniya-mezhdu-chlenami-kollektivnogo-uchastnika-forma14.html
73spravka-ob-ispolnennih-dogovorah-zaklyuchennih-s-oao-mrsk-severo-zapada-forma-14.html