You are on page 1of 7

Київський національний університет імені Тараса Шевченка

Факультет комп`ютерних наук та кібернетики

Кафедра інтелектуальних програмних систем

Алгоритми та складність

Завдання №3

“Узагальнений метод Рабіна-Карпа”

Виконала студентка 2-го курсу

Групи ІПС-22

Горєлова Вікторія Вікторівна

Київ – 2023
Завдання:
Узагальніть метод Рабіна-Карпа пошуку зразка в текстовому рядку так, щоб він дозволив
розв’язати задачу пошуку заданого зразка розміром m на m у символьному масиві
розміром n на n. Зразок можна рухати по горизонталі та вертикалі, але не обертати.

Теорія
Алгоритм Рабіна-Карпа:

Алгоритм Рабіна-Карпа використовує хеш-функції для швидкого пошуку підрядка в тексті.


Основна ідея полягає в тому, щоб обчислити хеш-значення для кожного можливого
підрядка тексту та порівнювати це хеш-значення з хеш-значенням зразка (шуканого
підрядка).

Основні етапи алгоритму Рабіна-Карпа:

1. Обчислення хеш-значення для зразка і першого підрядка

2. Порівняння хеш-значень

3. Обчислення хеш-значення для наступного підрядка

4. Повторення для всіх можливих підрядків

Узагальнений алгоритм Рабіна-Карпа:

Щоб знайти зразок mxm в масиві nxn, будемо шукати алгоритмом Рабіна-Карпа перший
рядок зразка в рядках масиву. Якщо знайшли входження першого рядка зразка в якомусь з
рядків масиву, то починаємо перевіряти чи на тих же позиціях рядків масиву нижче
знаходяться всі інші рядки зразка.

Алгоритм

Використовуючи арифметичну хеш-функцію, обчислюємо хеш-значення для кожного


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

function calculateHash(str: string) -> int:


hashValue = 0
for i = 0 to length(str) - 1:
hashValue = (hashValue * prime + str[i]) % INT_MAX
return hashValue

function searchPattern(text: array of strings, pattern: array of ints, n: int, m: int):


found = false

patternHash = pattern[0]

for i = 0 to n - m:
for j = 0 to n - m:
substring = text[i][j:j + m]
substringHash = calculateHash(substring)

if substringHash == patternHash:
match = true
for k = 1 to m - 1:
substring = text[i + k][j:j + m]
substringHash = calculateHash(substring)

if substringHash != pattern[k]:
match = false
break

if match:
found = true
print("The pattern was found starting in the row number ", i + 1, ", position in the
starting row is ", j + 1)

if not found:
print("The pattern was not found in the array")

function main():
n, m = input("Enter the size of array n and the size of pattern m: ")

text = []
print("Enter the array nxn:")
for i = 0 to n - 1:
row = input()
text.append(row)

pattern = []
print("Enter the pattern mxm:")
for i = 0 to m - 1:
pattern_str = input()
pattern.append(calculateHash(pattern_str))

searchPattern(text, pattern, n, m)

Складність алгоритму
Визначимо складність алгоритму в найгіршому випадку
Обчислення хеш-значення зразка та підрядків масиву має складність O ( m ) .
Обчислення хеш-значень для зразка відбувається за O ( m2 )
Алгоритм пошуку зразка в тексті в найгіршому випадку буде мати складність
O ( ( n−m )2 ( m−1 ) m2 )В загальному алгоритм буде мати складність O ( ( n−m )2 ( m−1 ) m2 +m2)

Визначимо складність алгоритму в найкращому випадку


Різниця буде в алгоритмі пошуку зразка в тексті, тут складність буде O( ( n−m )2 m)
Загальна складність буде O( ( n−m )2 m+m2 )

Мова реалізації алгоритму C++

Модулі програми:

- int calculateHash(char* str)


Функція пошуку хеш-значення рядка

- void searchPattern(char** text, int* pattern, int n, int m)


Функція пошуку заданого зразка в тексті

Інтерфейс користувача

Введення даних відбувається через консоль. Користувачу потрібно вказати спочатку


розмірність двовимірного масиву, в якому буде відбуватись пошук зразка, потім ввести сам
масив-текст. Далі потрібно вказати розмірність матриці зразка та ввести сам зразок.
У відповідь користувачу виводиться повідомлення про те, на якій позиції був знайдений
зразок в тексті, або про те, що зразок знайдений не був.

Тестові приклади

Нехай є вказаний нижче текст


abcde
fghij
klmno
pqrst
uvwxy

Розмірність двохвимірного масиву – 5

Будемо шукати в ньому вказаний нижче зразок


hij
mno
rst

Розмірність зразка – 3
Бачимо, що в текст цей зразок починається з другого рядка та третьої позиції в цьому
рядку.

Результат роботи алгоритму:

Результат правильний.

Далі спробуємо знайти зразок, якого немає в тексті


Наприклад,
ytr
kas
iop

Результат правильний.

Спробуємо іншу розмірність зразка

Нехай будемо шукати вказаний нижче зразок, розмірність – 1


z
Результат правильний

Будемо шукати вказаний нижче зразок, розмірність – 1


y

Результат правильний

Висновки

Отже, у даній роботі, було описано алгоритм знаходження зразка розміром m на m у тексті
розміром n на n. Також було написано програму його реалізації, що знаходить хеш-
значення рядків та шукає заданий зразок у тексті. В програмі також присутня реалізація
вводу зразків та виводу результату роботи алгоритму.

Використані літературні джерела

1. https://uk.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE
%D1%80%D0%B8%D1%82%D0%BC_%D0%A0%D0%B0%D0%B1%D1%96%D0%BD
%D0%B0_%E2%80%94_%D0%9A%D0%B0%D1%80%D0%BF%D0%B0
2. https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm
3. https://www.youtube.com/watch?v=oORZUbz6tJw&ab_channel=%D0%9E
%D1%81%D0%BD%D0%BE%D0%B2%D0%B8%D0%BF%D1%80%D0%BE
%D0%B3%D1%80%D0%B0%D0%BC%D1%83%D0%B2%D0%B0%D0%BD%D0%BD
%D1%8F
4. Кормен, Томас Х. и др.
Алгоритмы: построение и анализ, 3-е изд. : Пер. с англ. - М. : ООО "И. Д. Вильямс",
2013. - 1328 с.

You might also like