4 курс / СиАОД пример 3
.docxФедеральное агентство связи
Ордена Трудового Красного Знамени
Федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
Кафедра Математической Кибернетики и Информационных Технологий
Отчет по лабораторной работе
по предмету «СиАОД»
на тему:
«Методы поиска подстроки в строке»
Выполнил: студент группы ____
______
Руководитель:
Кутейников И. А.
Москва 2021
Цель работы
Реализовать заданный метод поиска подстроки в строке в соответствии с индивидуальным заданием. Для всех вариантов добавить реализацию добавления строк, ввода подстроки и поиска подстроки. Предусмотреть возможность существования пробела. Ввести опцию чувствительности / нечувствительности к регистру. Оценить время работы каждого алгоритма поиска и сравнить его со временем работы стандартной функции поиска, используемой в выбранном языке программирования.
Вариант задания
Метод поиска: Кнута-Морриса-Пратта.
Выполнение
Код программы
import java.lang.String; import java.util.Scanner; public class FindSubstring { public static int[] Lps(String substring) // longest proper prefix/suffix { int[] lps = new int[substring.length()]; for(int i = 1;i<substring.length();i++) { int j =0; while(i+j<substring.length() && substring.charAt(j) == substring.charAt(i+j)) { lps[i+j] = Math.max(lps[i+j],j+1); j++; } } return lps; } public static boolean KMP(String text, String substring) { int [] lps = Lps(substring); int i = 0; int j = 0; while(i<text.length()) { if(substring.charAt(j) == text.charAt(i)) { i++; j++; } if(j == substring.length()) { j = lps[j-1]; return true; } else if(i<text.length() && substring.charAt(j)!= text.charAt(i)) { if(j!=0) { j = lps[j-1]; } else { i++; } } } return false; } public static void main(String[] args) { char ch; Scanner sc = new Scanner(System.in); System.out.println("Введите строку: "); String text = sc.nextLine(); String substring = ""; long startTime,endTime,elapsedMicroseconds; do { System.out.println("Введите желаемую операцию: F - найти подстроку, I - ввести подстроку, C - сменить строку, Z - выход"); ch = sc.nextLine().toUpperCase().charAt(0); switch(ch) { case 'I': System.out.println("Введите подстроку: "); substring = sc.nextLine(); System.out.println("Текущая подстрока - " + substring); break; case 'F': startTime =System.nanoTime(); if(KMP(text,substring)) { endTime = System.nanoTime(); elapsedMicroseconds = (endTime - startTime) / 1000; System.out.println("Found, elapsed time KMP = " + elapsedMicroseconds + " microseconds"); startTime =System.nanoTime(); text.contains(substring); endTime = System.nanoTime(); elapsedMicroseconds = (endTime - startTime) / 1000; System.out.println("Found, elapsed time JAVA = " + elapsedMicroseconds + " microseconds"); } else System.out.println("Not found"); break; case 'C': System.out.println("Введите новую строку: "); text = sc.nextLine(); System.out.println("Текущая строка - " + text); break; } } while(ch != 'Z'); } }
Результат работы программы
Таблица 1 – Время поиска подстроки в строке Hellojfklqjfkl mnfmqnfqkfjq qweklqwj HowAreYoufhqfm ejqlkeNameKKfq
Подстрока |
Алгоритм КМП,мкс |
Встроенный алгоритм Java,мкс |
Hello |
38 |
8 |
HowAreYou |
9 |
5 |
Name |
11 |
5 |
Вывод
Реализовали заданный метод поиска подстроки в строке в соответствии с индивидуальным заданием. Для всех вариантов добавили реализацию добавления строк, ввода подстроки и поиска подстроки. Оценили время работы алгоритма поиска и сравнили его со временем работы стандартной функции поиска, используемой в выбранном языке программирования. И в результате получилось, что встроенный алгоритм получился немного быстрее, чем реализованный. И, скорее всего, при увеличении строки, в которой будет осуществляться поиск, разница в скорости поиска будет увеличиваться, и наилучший результат будет показывать встроенный алгоритм поиска, т.к они спроектированы для производительности в больших объемах.
