Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СиАОД_ЛабРаб-3_Вар9

.docx
Скачиваний:
0
Добавлен:
18.01.2026
Размер:
153.14 Кб
Скачать

Федеральное агентство связи

Ордена Трудового Красного Знамени

Федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

Кафедра Математической Кибернетики и Информационных Технологий

Отчет по лабораторной работе

по предмету «СиАОД»

на тему:

«Методы поиска подстроки в строке»

Руководитель:

Кутейников И. А.

Москва 2024

Цель работы

Реализовать заданный метод поиска подстроки в строке в соответствии с индивидуальным заданием. Для всех вариантов добавить реализацию добавления строк, ввода подстроки и поиска подстроки. Предусмотреть возможность существования пробела. Ввести опцию чувствительности / нечувствительности к регистру. Оценить время работы каждого алгоритма поиска и сравнить его со временем работы стандартной функции поиска, используемой в выбранном языке программирования.

Вариант задания

Метод поиска: Упрощенный Бойера-Мура.

Выполнение

Код программы

using System;

using System.Collections.Generic;

using System.Diagnostics;

namespace LR3

{

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Введите строку");

string MainString = Console.ReadLine();

string SubString = "";

string result = "";

int select;

do

{

Console.WriteLine("Введите цифру, соответствующую номеру желаемой операции:");

Console.WriteLine("1 - ввести подстроку, 2 - найти подстроку, 3 - вывод строки и подстроки, 4 - завершение работы");

Stopwatch stopwatch = new Stopwatch();

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

switch (select)

{

case 1:

Console.WriteLine("Введите подстроку");

SubString = Console.ReadLine();

Console.WriteLine(@"Текущая подстрока: {0}", SubString);

break;

case 2:

stopwatch.Start();

Console.WriteLine(FindSubstring(MainString, SubString));

stopwatch.Stop();

TimeSpan resultTime = stopwatch.Elapsed;

Console.WriteLine(@"Время работы метода упрощённого Бойера-Мура: {0}", resultTime);

stopwatch.Reset();

Console.WriteLine("");

stopwatch.Start();

result = Convert.ToString(MainString.IndexOf(SubString));

stopwatch.Stop();

if (result == "-1") Console.WriteLine("Подстрока не найдена.");

else Console.WriteLine(@"Подстрока найдена начиная с {0} по {1} символы.", int.Parse(result) + 1, int.Parse(result) + SubString.Length);

resultTime = stopwatch.Elapsed;

Console.WriteLine(@"Время работы встроенного поиска: {0}", resultTime);

Console.WriteLine("");

break;

case 3:

Console.WriteLine(@"Строка: {0}", MainString);

Console.WriteLine(@"Текущая подстрока: {0}", SubString);

break;

case 4:

Console.WriteLine("Работа программы завершена");

break;

default:

Console.WriteLine("Ошибка выбора");

break;

}

} while (select != 4);

}

//Поиск подстроки

static string FindSubstring(string MainString, string SubString)

{

string[,] table = new string[SubString.Length, 2];

int count = 0;

bool check = false;

for (int i = SubString.Length - 1; i >= 0; i--)

{

check = true;

for (int j = 0; j < SubString.Length; j++) if (table[j, 0] == SubString[i].ToString()) check = false;

if (check)

{

table[i, 0] = SubString[i].ToString();

table[i, 1] = count.ToString();

count++;

}

}

int n = 0;

while (n + SubString.Length - 1 <= MainString.Length - 1)

{

check = true;

int number = SubString.Length;

for (int i = SubString.Length - 1; i >= 0; i--)

{

if (SubString[i] != MainString[i + n])

{

for (int j = 0; j < SubString.Length - 1; j++) if (table[j, 0] == MainString[i + n].ToString() && number == SubString.Length) number = int.Parse(table[j, 1]);

check = false;

}

}

n += number;

if (check)

{

return ("Подстрока найдена начиная с " + (n - SubString.Length + 1) + " по " + n + " символы.");

}

}

return ("Подстрока не найдена.");

}

}

}

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

Для проверки работы программы была взята строка AdeleHello WorldisonFire totheRain

Рисунок 1 – Демонстрация работы программы поиска подстроки Hello

Рисунок 2 – Демонстрация работы программы поиска подстроки Fire to

Рисунок 3 – Демонстрация работы программы поиска подстроки HelloWorld

Таблица 4 – Время поиска разных подстрок в единой строки

Подстрока

Упрощенный алгоритм Бойера-Мура, мс

Встроенный алгоритм C#, мс

Hello

0,93

0,07

Fire to

0,17

0,03

HelloWorld

0,63

0,04

Среднее время выполнения алгоритмов для поиска подстроки в строке:

Упрощенный алгоритм Бойера-Мура – 0,577 мс

Встроенный алгоритм C# – 0,047 мс

Вывод

В соответствии с поставленной задачей в рамках лабораторной работы была написана программа, реализующая функции ввода и добавления строки и подстроки, а также поиска подстроки в строке встроенным методом и упрощённым методом Бойера-Мура.

В ходе сравнения результатов работы упрощённого алгоритма Бойера-Мура и встроенного в язык С# алгоритма для поиска разных подстрок в единой строке было выяснено, что встроенный алгоритм работает быстрее и эффективнее упрощённого Бойера-Мура вне зависимости от размера подстроки или ее расположения в строке.