Professional Documents
Culture Documents
Звіт (Горєлова лаб2)
Звіт (Горєлова лаб2)
Алгоритми та складність
Завдання №3
Групи ІПС-22
Київ – 2023
Завдання:
Узагальніть метод Рабіна-Карпа пошуку зразка в текстовому рядку так, щоб він дозволив
розв’язати задачу пошуку заданого зразка розміром m на m у символьному масиві
розміром n на n. Зразок можна рухати по горизонталі та вертикалі, але не обертати.
Теорія
Алгоритм Рабіна-Карпа:
2. Порівняння хеш-значень
Щоб знайти зразок mxm в масиві nxn, будемо шукати алгоритмом Рабіна-Карпа перший
рядок зразка в рядках масиву. Якщо знайшли входження першого рядка зразка в якомусь з
рядків масиву, то починаємо перевіряти чи на тих же позиціях рядків масиву нижче
знаходяться всі інші рядки зразка.
Алгоритм
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)
Модулі програми:
Інтерфейс користувача
Тестові приклади
Розмірність зразка – 3
Бачимо, що в текст цей зразок починається з другого рядка та третьої позиції в цьому
рядку.
Результат правильний.
Результат правильний.
Результат правильний
Висновки
Отже, у даній роботі, було описано алгоритм знаходження зразка розміром 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 с.