You are on page 1of 8

Лабораторна робота №2

Тема роботи: Алгоритми пошуку.


Мета роботи: Дослідити основні алгоритми пошуку та оцінити їх
ефективність
Обладнання: Комп’ютер, середовище розробки C#.

Хід роботи
Завдання:
1. Довільно обрати текст Т у вигляді набора чисел, що складається
мінімум з 15 символів та зразок Р, який необхідно знайти. Знайти
зразок Р у тексті Т, використовуючи алгоритм алгоритм бінарного
пошук.
2. Задано: текст Т, підрядок P, який треба знайти, просте число q (табл.
2.1), алфавіт {0,1,2,3,4,5,6,7,8,9}, d=10, h = dm-1
3. Знайти всі входження зразка Р в текст Т, використовуючи алгоритм
ТА
Змн.
Затверд.
Перевір.Рабіна-Карпа.
Н. Контр.
Розроб.Арк. Гречушкiн
Ляшок В.Г.I.M. .
№ докум. Підпис Дата КНУ ЛР.151.21.03.02
Літ. АКНТ1 КН-22-1
Арк. Аркушів

4. Знайти всі входження зразка Р в текст Т, використовуючи алгоритм


Кнута-Морісса-Прата (парні варіанти за списком) та. алгоритм Бойєра-
Мура (непарні варіанти за списком).
5. Виконати ручну та програмну реалізацію алгоритмів. Врахувати два
випадки: фрагмент знайдено та не знайдено.
6. Провести порівняльний аналіз алгоритмів пошуку в рядках.

Таблиця 2.1 – Варіанти завдань


№ варіанту Текст - Т Зразок - Р Просте число - q
3 hdacbaccbacabadhac baccbacaba 17
Виконання:

Бінарний пошук:
Код программи :
class Program
{

//Текст - Т = hdacbaccbacabadhac
//Зразок - Р = baccbacaba
public static int BinarySearch(string text, string pattern)
{
int left = 0;
int right = text.Length - pattern.Length;

while (left <= right)


{
int mid = left + (right - left) / 2;
bool found = true;

for (int i = 0; i < pattern.Length; i++)


{
if (text[mid + i] != pattern[i])
{
found = false;
break;
}
}

if (found)
return mid + 1; // Додаємо 1 до позиції і повертаємо
else if (string.Compare(pattern, 0, text, mid, pattern.Length) < 0)
right = mid - 1;
else
left = mid + 1;
}

return -1; // Зразок не знайдено


}

public static void Main(string[] args)


{
Console.Write("Введiть текст Т: ");
string text = Console.ReadLine();

Console.Write("Введiть зразок Р: ");


string pattern = Console.ReadLine();

int result = BinarySearch(text, pattern);

if (result != -1)
Console.WriteLine($"Зразок Р знайдено за допомогою бiнарного пошуку на позицiї {result}");
else
Console.WriteLine("Зразок Р не знайдено за допомогою бiнарного пошуку");
}
}

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

Арк.
Лабораторна робота 1
Ручна реалізація:

Арк.
Лабораторна робота 1
Пошук Рабіна-Карпа
Код программи:
class Program
{
static int CalculateHash(string str, int q, int d)
{
int hash = 0;
int m = str.Length;

// Обчислення хеш-значення за формулою


for (int i = 0; i < m; i++)
{
hash = (hash * d + (int)str[i]) % q;
}

return hash;
}

static void Main()


{
Console.WriteLine("Введiть текст Т:");
string text = Console.ReadLine();

Console.WriteLine("Введiть пiдрядок P:");


string pattern = Console.ReadLine();

Console.WriteLine("Введiть просте число q:");


int q = int.Parse(Console.ReadLine());

int d = 10;
int h = 1;
for (int i = 0; i < pattern.Length - 1; i++)
{
h = (h * d) % q;
}

int patternHash = CalculateHash(pattern, q, d);


int textHash = CalculateHash(text.Substring(0, pattern.Length), q, d);
bool found = false;

for (int i = 0; i <= text.Length - pattern.Length; i++)


{
if (textHash == patternHash)
{
// Вивести позицію, починаючи з 1
Console.WriteLine("Знайдено входження пiдрядка P по позицiї " + (i + 1));
found = true;
}

// Оновлення хеш-значення для наступного вікна


if (i < text.Length - pattern.Length)
{
textHash = (d * (textHash - (int)text[i] * h) + (int)text[i + pattern.Length]) % q;
if (textHash < 0)
{
textHash = (textHash + q);
}
}
}

if (!found)
{
Console.WriteLine("Входження пiдрядка P не знайдено в текстi Т.");
}

Арк.
Лабораторна робота 1
}
}

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

Ручна реалізація:

Пошук Бойєра-Мура
Код программи:

Арк.
Лабораторна робота 1
lass BoyerMoore
{
static int[] BuildBadCharTable(string pattern)
{
int[] badCharTable = new int[256];

for (int i = 0; i < badCharTable.Length; i++)


{
badCharTable[i] = pattern.Length;
}

for (int i = 0; i < pattern.Length - 1; i++)


{
badCharTable[pattern[i]] = pattern.Length - 1 - i;
}

return badCharTable;
}

static List<int> Search(string text, string pattern)


{
List<int> positions = new List<int>();
int m = pattern.Length;
int n = text.Length;
int[] badCharTable = BuildBadCharTable(pattern);

int s = 0;
while (s <= n - m)
{
int j = m - 1;
while (j >= 0 && pattern[j] == text[s + j])
{
j--;
}

if (j < 0)
{
positions.Add(s);
s += m;
}
else
{
s += Math.Max(1, j - badCharTable[text[s + j]]);
}
}

return positions;
}

static void Main()


{
Console.WriteLine("Введiть текст:");
string text = Console.ReadLine();

Console.WriteLine("Введiть зразок:");
string pattern = Console.ReadLine();

List<int> positions = Search(text, pattern);

if (positions.Count > 0)
{
Console.WriteLine("Зразок знайдено на позицiях:");
foreach (int position in positions)
{
Console.WriteLine(position);
}

Арк.
Лабораторна робота 1
}
else
{
Console.WriteLine("Зразок не знайдено в текстi.");
}
}
}

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

Ручна реалізація:

Арк.
Лабораторна робота 1
Висновок: виконуючи лабораторну роботу, я ознайомився з алгоритмами
пошуку, а саме з бінарним, Рабіна-Карпа та Бойєра-Мура. На мою думку
найзручнішим виявився бінарний алгоритм, потім по зручності йде алгортим
Байера-мура, і найбільш не зручним виявився алгоритм Рабіна-Карпа.

Арк.
Лабораторна робота 1

You might also like