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