
- •1.1. Цель работы
- •Поразрядная сортировка
- •1.3. Средства Си для реализации поразрядных сортировок
- •1.4.1. Поразрядная сортировка
- •1.5. Порядок выполнения
- •Цель работы
- •Прямой поиск
- •1.3. Бинарный поиск
- •1.4. Интерполяционный поиск
- •1.5. Порядок выполнения работы
- •1.1. Цель работы
- •1.2. Последовательный (прямой) поиск
- •1.3. Алгоритм поиска Кнута
- •1.4. Поиск Боуера-Мура
- •1.5. Порядок выполнения работы
1.5. Порядок выполнения работы
Получите вариант задания у преподавателя.
Составьте алгоритм поиска элемента по заданному значению.
Реализуйте алгоритм на языке Си таким образом, программа искала индексы всех имеющихся в массиве заданных элементов.
Проанализируйте полученные результаты.
Организация поиска подстроки в строке
1.1. Цель работы
Ознакомиться и реализовать алгоритмы поиска подстроки в строке.
1.2. Последовательный (прямой) поиск
Алгоритм прямого поиска подстроки подобен алгоритму прямого поиска элемента с заданным значением в массиве.
Пусть T – текст, O – подстрока поиска. Длина текста равна m, длина подстроки n.
i = 0; // счетчик символов текста
ПОКА(i<m)
k = 0; // счетчик совпадений
j=0; // счетчик символов подстроки
i1 = i;
ПОКА(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. // неуспех при поиске
В худшем случае, время поиска в этом алгоритме прямо пропорционально 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 |