Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦІї.docx
Скачиваний:
37
Добавлен:
10.11.2018
Размер:
280.19 Кб
Скачать

1. Дерева порівнянь на векторній пам‘яті.

Розглянемо спочатку, як можна записати дерево у векторну пам‘ять.

Нехай ключі зберігаються у векторі КЛЮЧ (i;j) (i, j - відпо­відно початковий та кінцевий індекси елементів). Елементи у вектор­ній пам‘яті повинні бути впорядкованими за значенням ключів.

При пошуку якогось елемента зробимо коренем дерева вмістиме КЛЮЧ(т), де m=[(і+j)/2]- найбільше ціле, менше або рівне (i+j)/2. Тоді ліве піддерево розміщується у векторі КЛЮЧ (i;m-1), а пра­ве - у векторі KЛЮЧ(m+1;j). Цей процес повторюється, доки не буде знайдений потрібний елемент, тобто доки на зійдемось у одній вершині, для якої обидва індекси у векторі КЛЮЧ будуть мати однакові значення.

Тоді алгоритм D пошуку ключа К у векторі КЛЮЧ (і;j) можна записати такою послідовністю кроків ([КЛЮЧ(m)] - вмістиме елемента вектора з індексом т ):

D0. Ініціалізація індексів і, j (для табл.2.1 і = 1, j=8).

D1. Повторювати кроки D2 - D6 доти, доки i<j.

D2. Обчислення індекcа кореня дерева: m=[(i+j)/2].

D3. Якщо [КЛЮЧ (m)]= К то REZ= т, кінець.

D4. Інакше: якщо [ КЛЮЧ (т)] <K.

D5. Тoдi j=m-1 (пошук зліва); перехід на D2;

D6. Інакше і=т +1 (пошук справа); перехід на D2.

D7. Кінець. (Помилка - запису в таблиці немає.)

Основна задача полягає у виключенні на кожному кроці з подальшого пошуку ак можна більшої кількості елементів. Оптимальним рішенням буде вибір середнього елемента, оскільки при цьому буде виключена половина кількості елементів. Максимальне число порівнянь дорівнює О(log2 n).

3.Пошук у таблиці

Пошук в масиві іноді називають пошуком в таблиці, особливо якщо ключ сам є складовим об‘єктом, таким як масив чисел або символів. Для того щоб встановити факт спів падіння, необхідно переконатись, що всі символи стрічок які порівнюються є рівні. Порівняння зводиться до пошуку їх неспівпадіння., тобто пошуку на нерівність. Якщо нерівних частин не існує, то можна говорити про рівність. Якщо розмір шуканого взірця невеликий, то доцільно використати алгоритм лінійного пошуку. В противному випадку необхідно впорядкувати таблицю та скористатись алгоритмом пошуку діленням пополам. Від вибраного алгоритму пошуку буде залежити алгоритмічна складніть.

4. Прямий пошук стрічки

Нехай задано масив S з n елементів та масив P з m елементів, причьому m<=n. Необхідно знайти перше входження масива P у масив S . Алгоритм зводиться до повтору порівнянь окремих елементів.

Алгоритм R

R1. Встановити і=1.. n-m,j=1..m.

R2. Якщо S[i] = P[j] , то зафіксувати перше співпадіння k=i, та перевірити спів падіння всього масиву P у масиві S. При першому неспівпадінні відмінити значення к та продовжити пошук.

R3. Кінець.

Кількість порівнянь дорівнює n*m.

Приклад,

a c a a b c a c a a b c a c a a b c

a a b a a b a a b

5. Алгоритм Кнута, Моріса і Прата пошуку в стрічці.

Маємо масив символів S з n елементів (текст) та масив P з m - взірець. Необхідно знайти перше входження взірця в масив. Схема алгоритму полягає у поступовому порівнянні взірця з текстом та зсуву по тексту на кількість співпавших символів у разі знайденого неспівпадіння.

Алгоритм КМП

КМП1. Встановити і=0.

КМП2. j=0, d=1.

КМП2. Поки j<m, i<n

КМП 3. Перевірка: якщо s[i]=p[j], то d++, i++.j++ поки d != m.

Інакше встановити зсув взірця на d позицій по тексту. Перейти на крок КМП2.

КМП4. Кінець.

Складність алгоритму становить O(n+m).

Приклад,

Hoola-Hoola girls like Hooligan - текст

Hooligan – взірець

Hoola-Hoola girls like Hooligan

Hooligan i!=a, d=4

Hooligan H!=a, d=1

Hooligan H!=-, d=1

Hooligan i!=a, d=4

…..

Hooligan d=m=8

6. Алгоритм Бойера – Мура пошуку у стрічці.

Нажаль спів падіння зустрічаються значно рідше, ніж неспівпадіння. Тому виграш від використання алгоритму КМП в більшості випадків незначний. Інший алгоритму Бойера-Мура базується на наступній схемі: порівняння символів починається з кінця взірця, а не з початку. Нехай для кожного символу x dx – відстань від самого правого у взірці входження х до кінця взірця. Допустимо знайдено неспівпадіння між взірцем та текстом. Тоді взірець можна зразу посунути вправо на dx позицій що є більше або рівне 1. Якщо х у взірці взагалі не зустрічається, то посунути можна зразу на довжину взірця.

Розглядається поняття стоп-символа – це є символ в тексті, який є першим неспівпадінням тексту і взірця при порівнянні справа (з кінця взірця). Розглянемо три можливих ситуації:

  1. Стоп-символ у взірці взагалі не зустрічається, тоді зсув дорівнює довжині взірця.

  2. Крайня права позиція k входження стоп-символа у взірці є меншою від його позиції j у тексті. Тоді взірець можна зсунути вправо на k-j позицій так, щоб стоп-символ у взірці і тексті опинились один під другим.

  3. Крайня права позиція k входження стоп-символа у взірці є більшою від його позиції j у тексті. Такий зсув ігнорується.

У третій ситуації необхідно знайти спів падіння взірця і тексту. Якщо у взірці є ще один такий самий символ, то необхідно зсунути взірець до спів падіння цього символу з символом в тексті. Інакше зсув дорівнює 1.

Приклад:

Hoola-Hoola girls like Hooligan

Hooligan n!=o, символ о у взірці стоїть на 6 позиції з кінця. Зсуваємо взірець на 6

позицій вправо

Hooligan n!=g, символ g стоїть на 3 позиції з кінця. Зсуваємо взірець на 3

позиції вправо

Hooligan n!=r, символа r у взірці взагалі немає. Зсуваємо взірець на всю

довжину.

Hooligan n!= ‘ ‘ , символа ‘ ‘ у взірці взагалі немає. Зсуваємо взірець на всю довжину.

Hooligan

В найгіршому випадку алгоритм потребує N порівнянь, N - кількість символів у тексті. У найкращих обставинах, коли останній символ взірця завжди не співпадає з символом тексту, число порівнянь дорівнює N/M, M – кількість символів взірця.

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