Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania (2).doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
199.17 Кб
Скачать

1.5. Порядок выполнения работы

  • Получите вариант задания у преподавателя.

  • Составьте алгоритм поиска элемента по заданному значению.

  • Реализуйте алгоритм на языке Си таким образом, программа искала индексы всех имеющихся в массиве заданных элементов.

  • Проанализируйте полученные результаты.

Организация поиска подстроки в строке

1.1. Цель работы

Ознакомиться и реализовать алгоритмы поиска подстроки в строке.

1.2. Последовательный (прямой) поиск

Алгоритм прямого поиска подстроки подобен алгоритму прямого поиска элемента с заданным значением в массиве.

Пусть Tтекст, Oподстрока поиска. Длина текста равна m, длина подстроки n.

  1. i = 0; // счетчик символов текста

  2. ПОКА(i<m)

    1. k = 0; // счетчик совпадений

    2. j=0; // счетчик символов подстроки

    3. i1 = i;

    4. ПОКА(O[j]==T[i1]&& k<n && i1<m)

2.4.1. k++;

2.4.2. j++,i1++;

2.5. Конец цикла

2.6. ЕСЛИ (k==n) ТО вернуть i;// успех при поиске

2.7. i++;

  1. Конец цикла

  2. Вернуть -1. // неуспех при поиске

В худшем случае, время поиска в этом алгоритме прямо пропорционально n*(m-1).

1.3. Алгоритм поиска Кнута

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

Вся основная работа проводится в начале алгоритма. Если в поиске участвует подстрока длины n, то может быть 0, 1, 2, 3, …, n-1 совпадений с текстом (как только произойдет n совпадений - подстрока найдена). Обозначим за j количество совпадений. Для дальнейшей работы рассчитаем элементы массива по следующему правилу:

длина максимальной подстроки до символа с номером j, полностью совпадающей с началом образа.

Значения и постоянны и равны соответственно -1 и 0.

Сам сдвиг рассчитывается по формуле:

Рассмотрим на примере подстроки ААBCDAABD.

ААBCDAABD

ААBCDAABD

ААBCDAABD

ААBCDAABD

ААBCDAABD

ААBCDAABD

ААBCDAABD

Предположим, что необходимо найти эту подстроку в тексте

A

A

B

D

A

A

B

C

A

A

B

C

D

A

A

B

D

A

A

B

C

D

A

A

B

D

j=3, shift = 2

A

A

B

C

D

A

A

B

D

j=0, shift = 1

A

A

B

C

D

A

A

B

D

j=0, shift = 1

A

A

B

C

D

A

A

B

D

j=4, shift = 3

j=9, поиск окончен

A

A

B

C

D

A

A

B

D

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]