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

4 курс / СиАОД пример 2

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

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

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

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

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

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

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

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

на тему:

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

Выполнил: студент группы _______

_________

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

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

Москва 2021

Цель работы

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

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

Метод поиска: Бинарное дерево.

Выполнение

Так как для поиска бинарным деревом необходима была структура данных, а для стандартного поиска Java(я использовал binarySearch) массив, то я решил в функции Inorder заполнять массив из бинарного дерева по порядку, чтобы можно было воспользоваться binarySearch.

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

import java.util.*; public class BSTree { static List<Integer> array = new ArrayList<>(); private class Node { int key; Node right; Node left; Node(int key) { this.key = key; right = left = null; } } Node root; public void Insert(int key,boolean Ignore) { if(!Search(root,key)) root = InsertNode(root,key); else { if (!Ignore) System.out.println("Такой элемент уже есть"); return; } } public boolean Search(Node root, int key) { if(root == null) { return false; } else if(root.key == key){ return true; } else if(key < root.key) { return Search(root.left,key); } else { return Search(root.right,key); } } private Node InsertNode(Node root,int key) { if(root == null) root = new Node(key); else if(key < root.key) { root.left = InsertNode(root.left,key); } else { root.right = InsertNode(root.right,key); } return root; } private Node FindMin(Node root) { while(root.left!=null) root=root.left; return root; } public void Inorder(Node root) { if(root == null) return; Inorder(root.left); //System.out.println(root.key); array.add(root.key); Inorder(root.right); } public Node DeleteNode(Node root,int key) { if(root == null) return root; else if(key < root.key) root.left = DeleteNode(root.left,key); else if(key > root.key) root.right = DeleteNode(root.right,key); else { if(root.left==null && root.right==null) { root = null; } else if(root.left == null) { Node temp = root; root = root.right; } else if(root.right == null) { Node temp = root; root = root.right; } else { Node temp = FindMin(root.right); root.key = temp.key; root.right = DeleteNode(root.right,temp.key); } } return root; } public static void main(String [] args) { BSTree bst = new BSTree(); Random ran = new Random(); for(int i =0;i<65536*2;i++) { bst.Insert(ran.nextInt(500000),true); } bst.Inorder(bst.root); char oper; Scanner sc = new Scanner(System.in); long startTime,endTime,elapsedMicroseconds; do { System.out.println("Введите операцию:I - вставка элемента, S - поиск, D - удалить ,Z - выход"); oper = sc.next().toUpperCase().charAt(0); int value;

bst.Inorder(bst.root); switch (oper) { case 'I': System.out.println("Введите число для вставки:"); bst.Insert(sc.nextInt(),false); break; case 'S': System.out.println("Введите число для поиска:"); value = sc.nextInt(); startTime =System.nanoTime(); if(bst.Search(bst.root,value)) { endTime = System.nanoTime(); elapsedMicroseconds = (endTime - startTime) / 1000; System.out.println("BST Search: Found. Elapsed microseconds - " + elapsedMicroseconds);// + "\n" + bst.iterations); } startTime =System.nanoTime(); if(Collections.binarySearch(array,value)>=0) { endTime = System.nanoTime(); elapsedMicroseconds = (endTime - startTime) / 1000; System.out.println("Java Search: Found. Elapsed microseconds - " + elapsedMicroseconds); } else System.out.println("A value not found"); break; case 'D': System.out.println("Введите число для удаления:"); bst.DeleteNode(bst.root,sc.nextInt()); break; case 'P': System.out.println("---------"); for(int i =0;i< array.size();i++) { System.out.println(array.get(i)); } break; } array.clear(); }while (oper!='Z'); } }

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

Таблица 1 – Время поиска элемента массива

Метод поиска

Binary Search Tree

Стандартный Java

Размер массива

50000

2 мкс

12 мкс

500000

3 мкс

14 мкс

5000000

4 мкс

16 мкс

Вывод

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

При разных входных данных, поиск зависел от расположения ключа, который мы ищем, и в микросекундах погрешность оказалась не слишком большой. Т.е алгоритмы выполняют поиск довольно быстро.

Соседние файлы в папке 4 курс