СиАОД_ЛабРаб-3_Вар9
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Математической Кибернетики и Информационных Технологий
Отчет по лабораторной работе
по предмету «СиАОД»
на тему:
«Методы поиска подстроки в строке»
Руководитель:
Кутейников И. А.
Москва 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 мс
Вывод
В соответствии с поставленной задачей в рамках лабораторной работы была написана программа, реализующая функции ввода и добавления строки и подстроки, а также поиска подстроки в строке встроенным методом и упрощённым методом Бойера-Мура.
В ходе сравнения результатов работы упрощённого алгоритма Бойера-Мура и встроенного в язык С# алгоритма для поиска разных подстрок в единой строке было выяснено, что встроенный алгоритм работает быстрее и эффективнее упрощённого Бойера-Мура вне зависимости от размера подстроки или ее расположения в строке.
