Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты по проге.docx
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
630.61 Кб
Скачать
  1. Сканирование слева направо, сравнение справа налево. Совмещается начало текста (строки) и шаблона, проверка начинается с последнего символа шаблона. Если символы совпадают, производится сравнение предпоследнего символа шаблона и т. д. Если все символы шаблона совпали с наложенными символами строки, значит, подстрока найдена, и поиск окончен. Если же какой-то символ шаблона не совпадает с соответствующим символом строки, шаблон сдвигается на несколько символов вправо, и проверка снова начинается с последнего символа.

  2. Сдвиг на несколько символов: Если не совпадает , то сдвигаем образ вправо до последнего его стоп-символа. Если «стоп-символа» вообще нет в образе, то образ смещается за этот символ.

  3. Если при сравнении строки и образа совпало 1 или более символов – сдвиг до ближайшего повторяющегося символа. Совпал символ «А» - сдвиг до ближайшего «А».

Для пропуска заведомо неверных вариантов строится таблица сдвигов, основанная на символах шаблона. Величина сдвига определяется следующей формулой:

Алгоритм:

int bm(char s[N], char p[M])

{ int d[R]; int I,j,k;

for (j=0; j<R; j++) d[j]=M;

for (j=0;j<M-1;j++) d[p[j]]=M-j-1;

do

{ j=M; k=i;

do { k--; j--;

} while ((j>=0)&&(p[j]==s[k]));

if (j>=0) i + = d[s[i-1]]; // cдвиг позиции

} while ((j>=0)&&(i<N));

i-=M;

// return(i-M); }

Величина смещения для каждого символа образца зависит только от порядка символов в образце, поэтому смещения удобно вычислить заранее и хранить в виде одномерного массива, где каждому символу алфавита соответствует смещение относительно последнего символа образца.

Анализ БМ:

Cmin = 1*i/M+M - последний символ образа каждый раз попадает на несовпадающий символ текста.

Cmax = i*(М-1)+M – подстрока и образец очень похожи

Ccp =

Будем считать, что в таблице сдвигов нет повторяющихся символов

В среднем случае сдвиг происходит приблизительно на максимальную длину М. Чем больше М и чем больше R, тем быстрее будет происходить поиск. Но на коротких текстах выигрыш может не оправдывать предварительных вычислений.

Алгоритм КМП

После частичного совпадения начальной части образа W с соответствующими символами строки Т мы фактически знаем пройденную часть строки и может «вычислить» некоторые сведения (на основе самого образа W), с помощью которых потом быстро продвинемся по тексту. Идея КМП-поиска – при каждом несовпадении двух символов текста и образа образ сдвигается на все пройденное расстояние, так как меньшие сдвиги не могут привести к полному совпадению. Особенности КМП-поиска: 1. требуется порядка (N+M) сравнений символов для получения результата; 2. схема КМП-поиска дает подлинный выигрыш только тогда, когда неудаче предшествовало некоторое число совпадений. Лишь в этом случае образ сдвигается более чем на единицу. К несчастью совпадения встречаются значительно реже чем несовпадения. Поэтому выигрыш от КМП-поиска в большинстве случаев текстов весьма незначителен.

Вопросы на экзамен по информатике:

  1. Есть массив строк. Нужно отсортировать их по первой букве (только по первой! на остальные не обращаем внимания) в алфавитном порядке. Какой из трёх алгоритмов ПРОСТОЙ сортировки нужно для этого выбрать?

Решение: сначала выделим различия между сортировкой массива из N чисел и сортировкой массива из N строк. Количество сравнений не изменяется. А вот количество перестановок элементов очень сильно увеличивается, т.к. надо поменять местами не два числа, а две строки, то есть фактически два массива чисел. Поэтому нужно выбрать сортировку с минимальным количеством перестановок. Это сортировка методом выбора максимума (минимума) ( сортировка выбором).