logo

Структури на данни в Java

Многобройните начини, по които данните могат да бъдат подредени, записани и обработвани в компютърна програма, се наричат ​​структури от данни в Java. Тези структури предлагат методичен метод за ефективно боравене и управление на данни, като позволяват полезни операции като вмъкване, изтриване, извличане и обхождане.

Статията ще изследва всичко, свързано със структурите от данни в Java, и помага на начинаещите да разбират лесно и ефективно.

  • Какво е Java?
  • Какво представляват структурите от данни в Java?
  • Типове структури от данни в Java
  • Предимства на структурите от данни в Java
  • Класификация на структурите от данни
  • Структури на данни в Java Често задавани въпроси

Какво е Java?

Java е популярен обектно-ориентиран език за програмиране, известен със своята огромна стандартна библиотека и свобода на платформата. Той предлага солидна архитектура за създаване на програми, работещи без повторно компилиране в различни платформи. Добре известната библиотека за Java има избор от системи за записи, които я правят жизнеспособна за ефективна работа с множество типове данни.

Какво представляват структурите от данни в Java?

Начинът, по който данните се организират и съхраняват в паметта на компютърната програма, зависи в голяма степен от структурите на записи на Java. Добре известната библиотека на Java включва значителен тип вградени статистически структури. Някои от системите за записи, които позволяват на програмистите кратки и прости начини за запазване и подреждане на данни, включват свързани списъци, стекове, опашки и масиви. Разработчиците могат бързо да извършват операции като вмъкване, изтриване, търсене и сортиране, защото предоставят набор от механизми за получаване на достъп до, промяна и управление на данни. Java програмистите могат да намалят използването на памет и значително да повишат общата ефективност на своите програми, като използват тези структури от данни.

Типове структури от данни в Java

Списъкът със структури от данни в Java е посочен по-долу

  1. Масиви
  2. ArrayList
  3. LinkedList
  4. Стек
  5. Опашка
  6. HashMap
  7. HashSet
  8. TreeSet
  9. TreeMap
  10. Графика
  11. Дърво

Диаграмата по-долу ясно обяснява много ясно типовете структури от данни в Java.

Структури на данни в Java

Допълнителна класификация на типовете структури от данни:

Има два типа структури от данни: -

  1. Примитивни структури от данни
  2. Непримитивни структури от данни

1) Примитивни структури от данни: Известни също като примитивни типове данни, това са основни вградени типове данни в Java. Те включват:

    Байт:Съхранява цели числа от -128 до 127.къс:Съхранява цели числа от -32 768 до 32 767.int:Съхранява цели числа от -2,147,483,648 до 2,147,483,647.плаващ:Съхранява числа с плаваща запетая с единична точност.символ:Съхранява отделни знаци.булево:Съхранява истински или неверни стойности.дълго:Съхранява големи цели числа.двойно:Съхранява числа с плаващ фактор с двойна точност.

2) Непримитивни структури от данни: Структурите на непримитивните записи са по-сложни и се състоят от примитивни видове информация. Освен това те могат да бъдат категоризирани в два вида:

    Линейни структури от данни:В линейните структури от данни елементите са подредени линейно или последователно. Примерите включват:
      масиви:Група от елементи с еднакъв тип, поставени в масив според предварително определена подредба.Купища:Структура „Последен влязъл, първи излязъл“ (LIFO), в която могат да се добавят или премахват само най-горните елементи.Опашки:Структурите „първи влязъл, първи излязъл“ (FIFO) се използват в опашки, където елементите се вмъкват върху върнатите и се изваждат отпред.Свързан списък:Свързаният списък включва колекция от притурки, наричани възли, всеки от които има препратка към възела след него и статистика вътре в него.
    Нелинейни структури от данни:В нелинейните структури от данни елементите са подредени по непоследователен начин. Примерите включват:
      дървета:Дърветата са тип йерархична структура, базирана на възли, с основен възел в горната част и дъщерни възли, разклоняващи се от него. Примерите включват червено-черни дървета, AVL дървета, двоични дървета за търсене и двоични дървета.Графики:Набор от възли, свързани чрез използване на ръбове, при което възлите могат да имат произволно количество връзки. Графиките се използват за символизиране на сложни връзки между елементите.Купчина:Специализирана дървовидна структура, в която всеки определен възел има стойност, по-голяма или по-малка от своите деца, в зависимост от това дали е максимална купчина или минимална купчина.Хеш:Структури от данни, които използват хеш функция за съпоставяне на ключове към стойности. Примерите се състоят от хеш набори и хеш карти, които осигуряват зелено извличане и съхранение на статистика въз основа на точни ключове.
Структури на данни в Java

Предимства на структурите от данни в Java

    Ефективна организация на данните:Структурите на данни предоставят организирани начини за съхраняване и управление на данни, което позволява ефективен достъп, манипулиране и операции за извличане. Те оптимизират използването на паметта и улесняват по-бързото изпълнение на алгоритми.По-добра производителност:Разработчиците могат да подобрят производителността по отношение на скоростта и използването на паметта, като изберат подходящата структура на данните за конкретна дейност. Производителността е оптимизирана, тъй като специфични структури от данни са създадени да превъзхождат конкретни действия като търсене, сортиране или вмъкване на информация.Повторна употреба на кода:Java предлага широк набор от вградени структури от данни, които са лесни за използване от програмистите. Тези многократно използвани структури от данни спестяват време и усилия, като премахват необходимостта от създаване на сложни алгоритми от нулата.Простота на кода:Структурите от данни правят изпълнението на сложни процеси по-лесно за кодиране. Те предлагат абстракции на високо ниво и капсулират спецификата на управлението на данни, което подобрява четливостта, поддръжката и яснотата на кода.Гъвкавост и адаптивност:Структурите на данни предлагат гъвкавост при работа с различни типове и размери данни. Те могат динамично да се коригират, за да се приспособят към променящите се изисквания за данни и да осигурят механизми за ефективно манипулиране на данни.Стандартизиран и добре тестван:Стандартната библиотека за Java съдържа вградени структури от данни, които са преминали през значителни тестове и оптимизация, което гарантира тяхната надеждност и производителност. Използването на тези общи структури от данни намалява възможността за грешки и дава на разработката на приложения солидна основа.Мащабируемост:Структурите на данни предоставят опции за мащабируемост, което позволява на приложенията да обработват големи обеми данни ефективно. Те могат динамично да растат или да се свиват въз основа на размера на данните, осигурявайки оптимална производителност дори при нарастващи изисквания за данни.Дизайн на алгоритъм:Структурите на данните са от решаващо значение при проектирането и анализа на алгоритмите. Те осигуряват основната структура и операции, необходими за внедряване на различни алгоритми и решаване на сложни проблеми.

1) Масиви:

Масивът е основна и често използвана структура от данни в контекста на структурите от данни на Java. Той предлага метод за съхраняване на колекция с фиксиран размер от компоненти от идентичен тип. Тъй като осигуряват бърз и лесен достъп до елементи в зависимост от техния индекс, масивите са ключов инструмент за управление и организиране на данни.

Предимства:

    Организация на данните:Масивите предоставят структуриран начин за съхраняване и организиране на елементи, подобрявайки управлението на данни.Произволен достъп:Елементите могат да бъдат достъпни директно с помощта на техния индекс, което позволява ефективно извличане и модифициране.Фиксиран размер:Масивите имат предварително определен размер, което позволява ефективно разпределение на паметта.Хомогенни елементи:Масивите съхраняват елементи от един и същи тип, осигурявайки последователност на данните и опростявайки операциите.Повторение:Масивите поддържат лесна итерация през елементи, улеснявайки преминаването и обработката.Сортиране и търсене:Масивите работят добре с алгоритми за сортиране и търсене, като предлагат ефективни операции.Ефективност на паметта:Масивите оптимизират използването на паметта, като съхраняват елементи в съседни региони.Съвместимост:Масивите се поддържат широко в Java, което ги прави съвместими с различни рамки и инструменти.

Недостатъци:

    Фиксиран размер:Масивите не могат да се преоразмеряват динамично, което изисква повторно създаване за промени в размера.Загуба на памет:Неизползваните елементи в по-големи масиви могат да доведат до загуба на памет.Разходи за вмъкване и изтриване:Вмъкването или изтриването на елементи в средата на масив изисква преместване на следващите елементи, което води до неефективност.Липса на гъвкавост:Масивите имат твърди типове данни и не могат да поемат различни видове данни без допълнителни масиви или структури от данни.

Функции:

    Създаване на масив:Декларирайте и инициализирайте масив с определен размер, като използвате типа на масива и ключовата дума new.Достъп до елементи:Използвайте индекса за достъп до отделни елементи в масива.Модифициращи елементи:Актуализирайте стойността на елемент, като присвоите нова стойност на конкретен индекс в масива.Намиране на дължина:Използвайте атрибута length, за да определите дължината на масива.Итерация през масива:Използвайте цикли, за да преминете през всеки елемент в масива и да го изпълните

Изпълнение:

Име на файл: ArrayExample.java

 import java.util.*; public class ArrayExample { public static void main(String[] args) { int[] numbers={10,20,30,40,50}; // Initialize an array of integers System.out.println(&apos;Element at index 0:&apos;+numbers[0]); System.out.println(&apos;Element at index 2:&apos;+numbers[2]); System.out.println(&apos;Element at index 4:&apos;+numbers[4]); int sum=0; for (int i=0;i<numbers.length;i++) { sum+="numbers[i];" } system.out.println('sum of array elements:'+sum); numbers[2]="35;" update an element in the system.out.println('updated at index 2:'+numbers[2]); system.out.println('elements array:'); for (int number:numbers) system.out.println(number); < pre> <p> <strong>Output:</strong> </p> <pre> Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of array elements:150 Updated element at index 2:35 Elements in the array: 10 20 35 40 50 </pre> <h3>2) ArrayList:</h3> <p>ArrayList in Java is a dynamic data structure that allows for the storage and manipulation of elements. It is part of the Java Collections Framework and is implemented using an array internally.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Dynamic Size:</td> Unlike arrays, ArrayLists can dynamically grow or shrink in size as elements are added or removed. It eliminates the need for manual resizing and allows for handling varying amounts of data conveniently. </tr><tr><td>Easy Element Manipulation:</td> ArrayLists offer methods to add, remove, and modify elements at any position within the list. Its flexibility simplifies common operations such as insertion, deletion, and updating, making element manipulation more efficient. </tr><tr><td>Random Access:</td> ArrayLists support random Access to elements using their index, enabling quick retrieval and modification of elements at specific positions within the list. It facilitates efficient element access and enhances overall performance. </tr><tr><td>Compatibility with Java Collection Framework:</td> ArrayLists implement the List interface, making them compatible with other Collection classes in the Java Collections Framework. Its compatibility allows for seamless integration with various algorithms and operations provided by the framework. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Higher Memory Overhead:</td> ArrayLists require additional memory to maintain their internal structure, resulting in higher memory overhead compared to arrays. It can be a concern when dealing with large collections of elements. </tr><tr><td>Slower Insertion and Deletion:</td> Inserting or deleting elements in the middle of an ArrayList requires shifting elements, which can be time-consuming for large lists. In scenarios where frequent insertion or deletion operations are expected, other data structures like LinkedList may offer better performance. </tr><tr><td>Limited Performance for Search:</td> Searching for an element in an unsorted ArrayList requires iterating over the elements until a match is found. It is a linear search approach that results in slower search performance compared to data structures optimized for searching, such as HashSet or TreeMap. </tr><tr><td>No Primitive Type Support:</td> ArrayLists can only store objects and do not directly support primitive data types like int or char. To store primitive types, wrapper classes like Integer or Character need to be used, leading to potential autoboxing and unboxing overhead. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Creating an ArrayList:</td> Declare and initialize an ArrayList using the ArrayList class and specify the element type within the angle brackets. </tr><tr><td>Adding Elements:</td> Use the add method to append elements at the end of the ArrayList. </tr><tr><td>Accessing Elements:</td> Use the get technique to retrieve the price of detail at a selected index. </tr><tr><td>Modifying Elements:</td> Update the cost of detail at a specific index for the usage of the set approach. </tr><tr><td>Finding Size:</td> Use the dimensions method to get the cutting-edge quantity of factors in the ArrayList. </tr><tr><td>Removing Elements:</td> Use the remove approach to delete a detail at a specific index or via providing the object reference. </tr><tr><td>Iterating through the ArrayList:</td> Use loops to iterate over each element in the ArrayList and perform operations on them. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> ArrayListExample.java</p> <pre> import java.util.*; public class ArrayListExample { public static void main(String[] args) { // Create an ArrayList to store integers ArrayList numbers=new ArrayList(List.of(10,20,30,40,50)); //Access and print elements from the ArrayList System.out.println(&apos;Element at index 0:&apos;+numbers.get(0)); System.out.println(&apos;Element at index 2:&apos;+numbers.get(2)); System.out.println(&apos;Element at index 4:&apos;+numbers.get(4)); // Calculate and print the sum of all elements in the ArrayList int sum=numbers.stream().mapToInt(Integer::intValue).sum(); System.out.println(&apos;Sum of ArrayList elements:&apos;+sum); // Update an element in the ArrayList numbers.set(2,35); System.out.println(&apos;Updated element at index 2:&apos;+numbers.get(2)); // Iterate through the ArrayList using a for-each loop and print the elements System.out.println(&apos;Elements in the ArrayList:&apos;); for (int number:numbers) { System.out.println(number); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of ArrayList elements:150 Updated element at index 2:35 Elements in the ArrayList: 10 20 35 40 50 </pre> <h3>3) Linked List:</h3> <p>A linked list is a linear data structure in which elements are stored in separate objects called nodes. A reference link to the following node in the sequence is included in each node&apos;s data element. The list&apos;s final node links to null, indicating that the list has ended.</p> <p>Unlike arrays, linked lists do not require contiguous memory allocation. Each node in a linked list can be allocated independently, allowing for dynamic memory allocation and efficient insertion and deletion operations.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Dynamic Size:</td> LinkedList can grow or shrink dynamically, making it suitable for varying or unknown data sizes. </tr><tr><td>Efficient Insertion and Deletion:</td> Inserting or deleting elements within a LinkedList is efficient, as it does not require shifting elements. </tr><tr><td>No Contiguous Memory Requirement:</td> LinkedList does not need contiguous memory allocation, making it flexible and suitable for unpredictable memory situations. </tr><tr><td>Easy Modification:</td> LinkedList allows easy modification of elements by changing reference pointers, enabling efficient manipulation. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Slower Random Access:</td> LinkedList has slower random Access as it requires traversing the list to access elements by index. </tr><tr><td>Increased Memory Overhead:</td> LinkedList requires additional memory for references and nodes, increasing memory overhead compared to arrays. </tr><tr><td>Inefficient Search:</td> LinkedList has slower search operations, requiring sequential iteration to find specific elements. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Creating a LinkedList:</td> Declare and initialize a LinkedList using the LinkedList class. </tr><tr><td>Adding Elements:</td> Use the add method to append elements at the end of the LinkedList. </tr><tr><td>Accessing Elements:</td> Use the get method to retrieve the value of an element at a specific index. </tr><tr><td>Modifying Elements:</td> Update the value of an element at a particular index using the set method. </tr><tr><td>Removing Elements:</td> Use the remove method to delete an element at a specific index or by providing the object reference. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> LinkedList1.java</p> <pre> import java.util.*; public class LinkedList1 { public static void main(String[] args) { // Create a LinkedList to store integers LinkedList linkedList1 = new LinkedList(); // Add elements to the LinkedList linkedList1.add(10); linkedList1.add(20); linkedList1.add(30); linkedList1.add(40); linkedList1.add(50); // Print the LinkedList System.out.println(&apos;LinkedList:&apos;+linkedList1); // Remove an element from the LinkedList linkedList1.removeFirst(); System.out.println(&apos;LinkedList after removing first element:&apos;+linkedList1); // Check if an element exists in the LinkedList boolean containsElement=linkedList1.contains(30); System.out.println(&apos;LinkedList contains element 30?&apos;+containsElement); // Get the first and last elements of the LinkedList int firstElement=linkedList1.getFirst(); int lastElement=linkedList1.getLast(); System.out.println(&apos;First element:&apos;+firstElement); System.out.println(&apos;Last element:&apos;+lastElement); // Clear the LinkedList linkedList1.clear(); System.out.println(&apos;LinkedList after clearing:&apos;+linkedList1); } } </pre> <p> <strong>Output:</strong> </p> <pre> LinkedList:[10, 20, 30, 40, 50] LinkedList after removing first element:[20, 30, 40, 50] LinkedList contains element 30?true First element:20 Last element:50 LinkedList after clearing:[] </pre> <h3>4) Stack:</h3> <p>The Last-In-First-Out (LIFO) principle dictates that the element that was most recently inserted is also the element that is removed first. A stack is a linear data structure that follows this rule. It employs the commands &apos;push&apos; and &apos;pop&apos; to add elements to the stack and, accordingly, remove the top element from the stack. The &apos;peek&apos; technique additionally enables Access to the top element without removing it.</p> <p> <strong>Features of a stack:</strong> </p> <ol class="points"> <tr><td>LIFO behavior:</td> The last element pushed onto the stack is the first one to be popped out, making it suitable for applications where the order of insertion and removal is important. </tr><tr><td>Limited Access:</td> Stacks typically provide restricted Access to elements. You can only access the topmost element, and to reach other elements, you need to pop the elements above them. </tr><tr><td>Dynamic size:</td> Stacks can be implemented using arrays or linked lists, allowing for a dynamic size. They can grow or shrink as needed during runtime. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Simplicity:</td> Stacks are easy to understand and implement. </tr><tr><td>Efficiency:</td> Insertion and deletion operations have a time complexity of O(1). </tr><tr><td>Function call management:</td> Stacks efficiently manage function calls and variable storage. </tr><tr><td>Undo/Redo functionality:</td> Stacks enable undo and redo operations in applications. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Limited Access:</td> Access to elements is restricted to the top of the stack. </tr><tr><td>Size restrictions:</td> Stacks may have size limitations depending on the implementation. </tr><tr><td>Not suitable for all scenarios:</td> Stacks are specific to LIFO behavior and may not be appropriate in other cases. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> StackExample.java</p> <pre> import java.util.Stack; public class StackExample { public static void main(String[] args) { // Create a stack Stack stack=new Stack(); // Push elements onto the stack stack.push(10); stack.push(20); stack.push(30); // Print the top element of the stack System.out.println(&apos;Top element:&apos;+stack.peek()); // Pop elements from the stack int poppedElement=stack.pop(); System.out.println(&apos;Popped element:&apos;+poppedElement); // Check if the stack is empty System.out.println(&apos;Is stack empty?&apos;+stack.isEmpty()); // Get the size of the stack System.out.println(&apos;Stack size:&apos;+stack.size()); // Iterate over the stack System.out.println(&apos;Stack elements:&apos;); for (Integer element:stack) { System.out.println(element); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Top element:30 Popped element:30 Is stack empty?false Stack size:2 Stack elements: 10 20 </pre> <h3>5) Queue:</h3> <p>A queue is a linear data structure in Java that follows the First-In-First-Out (FIFO) principle. It represents a collection of elements where elements are inserted at the rear and removed from the front.</p> <p> <strong>Features:</strong> </p> <ol class="points"> <tr><td>Enqueue:</td> Adding an element to the rear of the queue. </tr><tr><td>Dequeue:</td> Removing an element from the front of the queue. </tr><tr><td>Peek:</td> Retrieve the element at the front of the queue without removing it. </tr><tr><td>Size:</td> Determining the number of elements in the queue. </tr><tr><td>Empty Check:</td> Checking if the queue is empty. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>FIFO Behavior:</td> Elements are processed in the order of their insertion, ensuring the preservation of the original sequence. </tr><tr><td>Efficient Insertion and Removal:</td> Adding and removing elements from a queue is fast and has a constant time complexity of O(1). </tr><tr><td>Synchronization:</td> Java provides synchronized queue implementations, making them safe for concurrent programming. </tr><tr><td>Standardized Interface:</td> The Queue interface in Java offers a common set of methods, allowing easy interchangeability between different queue implementations. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>No Random Access:</td> Queues do not support direct Access to elements in the middle. Accessing specific positions requires dequeuing preceding elements. </tr><tr><td>Limited Size:</td> Some queue implementations have a fixed size or capacity, leading to overflow or exceptions when exceeding the maximum size. </tr><tr><td>Inefficient Search:</td> Searching for an element in a queue requires dequeuing until a match is found, resulting in a linear search with potentially high time complexity. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> QueueExample.java</p> <pre> import java.util.Stack; import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // Create a Queue to store integers Queue queue=new LinkedList(); // Enqueue elements to the Queue queue.offer(10); queue.offer(20); queue.offer(30); queue.offer(40); queue.offer(50); //Access and print the front element of the Queue System.out.println(&apos;Front element:&apos;+queue.peek()); // Dequeue elements from the Queue and print them while (!queue.isEmpty()) { int element=queue.poll(); System.out.println(&apos;Dequeued element:&apos;+element); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Front element:10 Dequeued element:10 Dequeued element:20 Dequeued element:30 Dequeued element:40 Dequeued element:50 </pre> <h3>6) HashMap:</h3> <p>A HashMap is a data structure in Java that provides a way to store and retrieve key-value pairs. It is part of the Java Collections Framework and is implemented based on the hash table data structure.</p> <p> <strong>Functions:</strong> </p> <ul> <tr><td>put(key, value):</td> Inserts the specified key-value pair into the HashMap. </tr><tr><td>get(key):</td> Retrieves the value associated with the specified key. </tr><tr><td>containsKey(key):</td> Checks if the HashMap contains the specified key. </tr><tr><td>containsValue(value):</td> Checks if the HashMap contains the specified value. </tr><tr><td>remove(key):</td> Removes the key-value pair associated with the specified key from the HashMap. </tr><tr><td>size():</td> Returns the number of key-value pairs in the HashMap. </tr><tr><td>isEmpty():</td> Checks if the HashMap is empty. </tr><tr><td>keySet():</td> Returns a Set containing all the keys in the HashMap. </tr><tr><td>values():</td> Returns a Collection containing all the values in the HashMap. </tr><tr><td>clear():</td> Removes all the key-value pairs from the HashMap. </tr></ul> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Efficient Retrieval:</td> HashMap provides fast retrieval of values based on keys with constant-time complexity O(1). </tr><tr><td>Flexible Key-Value Pairing:</td> HashMap allows any non-null object as a key, enabling custom-defined keys for storing and retrieving data. </tr><tr><td>Dynamic Size:</td> HashMap can dynamically grow or shrink in size to handle varying amounts of data. </tr><tr><td>Compatibility with Java Collections Framework:</td> HashMap implements the Map interface, allowing seamless integration with other Collection classes. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Lack of Ordering:</td> HashMap does not preserve the order of elements. Use LinkedHashMap or TreeMap for specific ordering requirements. </tr><tr><td>Increased Memory Overhead:</td> HashMap requires additional memory for hash codes and internal structure compared to simpler data structures. </tr><tr><td>Slower Iteration:</td> Iterating over a HashMap can be slower compared to arrays or lists due to traversing the underlying hash table. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> HashMapExample.java</p> <pre> import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { // Create a HashMap to store String keys and Integer values HashMap hashMap=new HashMap(); // Add key-value pairs to the HashMap hashMap.put(&apos;John&apos;,25); hashMap.put(&apos;Alice&apos;,30); hashMap.put(&apos;Bob&apos;,35); //Access and print values based on keys System.out.println(&apos;Age of John:&apos;+hashMap.get(&apos;John&apos;)); System.out.println(&apos;Age of Alice:&apos;+hashMap.get(&apos;Alice&apos;)); // Check if a key exists in the HashMap System.out.println(&apos;Is Bob present?&apos;+hashMap.containsKey(&apos;Bob&apos;)); // Update the value associated with a key hashMap.put(&apos;Alice&apos;,32); // Remove a key-value pair from the HashMap hashMap.remove(&apos;John&apos;); // Print all key-value pairs in the HashMap System.out.println(&apos;Key-Value pairs in the HashMap:&apos;); for (String key : hashMap.keySet()) { System.out.println(key+&apos;:&apos;+hashMap.get(key)); } // Check the size of the HashMap System.out.println(&apos;Size of the HashMap:&apos;+hashMap.size()); } } </pre> <p> <strong>Output:</strong> </p> <pre> Age of John:25 Age of Alice:30 Is Bob present?true Key-Value pairs in the HashMap: Bob:35 Alice:32 Size of the HashMap:2 </pre> <h3>7) HashSet:</h3> <p>HashSet is a data structure in Java that implements the Set interface and stores elements in a hash table.</p> <p> <strong>Features:</strong> </p> <ol class="points"> <tr><td>Stores unique elements:</td> HashSet does not allow duplicate elements. Each element in the HashSet is unique. </tr><tr><td>Uses hash-based lookup:</td> HashSet uses the hash value of each element to determine its storage location, providing efficient element retrieval. </tr><tr><td>Unordered collection:</td> The elements in a HashSet are not stored in a specific order. The order of elements may change over time. </tr></ol> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Fast element lookup:</td> HashSet provides fast lookup operations, making it efficient to check if an element exists in the set. </tr><tr><td>No duplicate elements:</td> HashSet automatically handles duplicate elements and ensures that each element is unique. </tr><tr><td>Integration with Java Collections Framework:</td> HashSet implements the Set interface, making it compatible with other collection classes in the Java Collections Framework. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>No guaranteed order:</td> HashSet does not maintain the order of elements. If the order of elements is important, HashSet is not suitable. </tr><tr><td>No indexing:</td> HashSet does not provide direct indexing or positional Access to elements. To access elements, you need to iterate over the set. </tr><tr><td>Higher memory overhead:</td> HashSet requires additional memory to store hash values and maintain the hash table structure, resulting in higher memory usage compared to some other data structures. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> HashSetExample.java</p> <pre> import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // Create a HashSet HashSet set=new HashSet(); // Add elements to the HashSet set.add(&apos;Apple&apos;); set.add(&apos;Banana&apos;); set.add(&apos;Orange&apos;); set.add(&apos;Grapes&apos;); set.add(&apos;Mango&apos;); // Print the HashSet System.out.println(&apos;HashSet:&apos;+set); // Check if an element exists System.out.println(&apos;Contains &apos;Apple&apos;:&apos;+set.contains(&apos;Apple&apos;)); // Remove an element set.remove(&apos;Banana&apos;); // Print the updated HashSet System.out.println(&apos;Updated HashSet:&apos;+set); // Get the size of the HashSet System.out.println(&apos;Size of HashSet:&apos;+set.size()); // Clear the HashSet set.clear(); // Check if the HashSet is empty System.out.println(&apos;Is HashSet empty?&apos;+set.isEmpty()); } } </pre> <p> <strong>Output:</strong> </p> <pre> HashSet:[Apple, Grapes, Mango, Orange, Banana] Contains &apos;Apple&apos;:true Updated HashSet:[Apple, Grapes, Mango, Orange] Size of HashSet:4 Is HashSet empty?true </pre> <h3>8) TreeSet:</h3> <p>TreeSet is an implementation of the SortedSet interface in Java that uses a self-balancing binary search tree called a red-black tree to store elements in sorted order.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Sorted Order:</td> TreeSet automatically maintains the elements in a sorted order based on their natural ordering or a custom comparator. It allows for efficient searching and retrieval of elements in ascending or descending order. </tr><tr><td>No Duplicate Elements:</td> TreeSet does not allow duplicate elements. It ensures that each element in the set is unique, which can be useful in scenarios where duplicate values should be avoided. </tr><tr><td>Efficient Operations:</td> TreeSet provides efficient operations like insertion, deletion, and searching. These operations have a time complexity of O(log n), where n is the number of elements in the set. </tr><tr><td>Navigable Set Operations:</td> TreeSet provides additional navigational methods, such as higher(), lower(), ceiling(), and floor(), which allow you to find elements that are greater than, less than, or equal to a given value. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Overhead:</td> TreeSet requires additional memory to store the internal data structure, which can lead to higher memory overhead compared to other set implementations. </tr><tr><td>Slower Insertion and Removal:</td> Insertion and removal operations in TreeSet involve maintaining the sorted order of elements, which may require tree restructuring. It can make these operations slightly slower compared to HashSet or LinkedHashSet. </tr><tr><td>Limited Customization:</td> TreeSet is primarily designed for natural ordering or a single custom comparator. It may need more flexibility for multiple sorting criteria or complex sorting logic. </tr></ol> <p> <strong>Functions:</strong> </p> <ul> <tr><td>add(element):</td> Adds an element to the TreeSet while maintaining the sorted order. </tr><tr><td>remove(element):</td> Removes the specified element from the TreeSet. </tr><tr><td>contains(element):</td> Checks if the TreeSet contains the specified element. </tr><tr><td>size():</td> Returns the number of elements in the TreeSet. </tr><tr><td>first():</td> Returns the first (lowest) element in the TreeSet. </tr><tr><td>last():</td> Returns the last (highest) element in the TreeSet. </tr><tr><td>higher(element):</td> Returns the least element in the TreeSet that is strictly greater than the given element. </tr><tr><td>lower(element):</td> Returns the greatest element in the TreeSet that is strictly less than the given element. </tr></ul> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeSetExample.java</p> <pre> import java.util.TreeSet; public class TreeSetExample { public static void main(String[] args) { // Create a TreeSet TreeSet numbers=new TreeSet(); // Add elements to the TreeSet numbers.add(5); numbers.add(2); numbers.add(8); numbers.add(1); numbers.add(4); // Print the TreeSet System.out.println(&apos;Elements in the TreeSet:&apos;+numbers); // Check if an element exists System.out.println(&apos;Does TreeSet contain 4?&apos;+numbers.contains(4)); // Remove an element numbers.remove(2); // Print the TreeSet after removal System.out.println(&apos;Elements in the TreeSet after removal:&apos;+numbers); // Get the size of the TreeSet System.out.println(&apos;Size of the TreeSet:&apos;+numbers.size()); // Get the first and last element System.out.println(&apos;First element:&apos;+numbers.first()); System.out.println(&apos;Last element:&apos;+numbers.last()); // Iterate over the TreeSet System.out.println(&apos;Iterating over the TreeSet:&apos;); for (int number:numbers) { System.out.println(number); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Elements in the TreeSet:[1, 2, 4, 5, 8] Does TreeSet contain 4? true Elements in the TreeSet after removal:[1, 4, 5, 8] Size of the TreeSet:4First element:1 Last element:8 Iterating over the TreeSet: 1 4 5 8 </pre> <h3>9) TreeMap:</h3> <p>TreeMap is a class in Java that implements the Map interface and provides a sorted key-value mapping based on the natural order of the keys or a custom comparator.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Sorted Ordering:</td> TreeMap maintains the keys in sorted order, which allows for efficient searching, retrieval, and range-based operations. </tr><tr><td>Key-Value Mapping:</td> TreeMap stores key-value pairs, enabling efficient lookup and retrieval of values based on the associated keys. </tr><tr><td>Red-Black Tree Implementation:</td> TreeMap uses a balanced binary search tree (Red-Black Tree) internally, ensuring efficient performance even for large datasets. </tr><tr><td>Support for Custom Comparators:</td> TreeMap allows the use of custom comparators to define the sorting order of the keys, providing flexibility in sorting criteria. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Memory Overhead:</td> TreeMap requires additional memory to store the internal tree structure and associated objects, resulting in higher memory usage compared to simpler data structures like HashMap. </tr><tr><td>Slower Insertion and Deletion:</td> Insertion and deletion operations in TreeMap have a time complexity of O(log n) due to the need for tree restructuring, making them slower compared to HashMap or LinkedHashMap. </tr><tr><td>Limited Performance for Unsorted Data:</td> TreeMap performs efficiently for sorted data, but its performance can degrade when dealing with unsorted data or frequent modifications, as it requires maintaining the sorted order. </tr></ol> <p> <strong>Functions:</strong> </p> <ul> <tr><td>put(key, value):</td> Inserts a key-value pair into the TreeMap. </tr><tr><td>get(key):</td> Retrieves the value associated with the specified key. </tr><tr><td>containsKey(key):</td> Checks if the TreeMap contains a specific key. </tr><tr><td>remove(key):</td> Removes the key-value pair associated with the specified key. </tr><tr><td>size():</td> Returns the number of key-value pairs in the TreeMap. </tr><tr><td>keySet():</td> Returns a set of all keys in the TreeMap. </tr><tr><td>values():</td> Returns a collection of all values in the TreeMap. </tr><tr><td>entrySet():</td> Returns a set of key-value pairs in the TreeMap. </tr></ul> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeMapExample.java</p> <pre> import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { // Create a TreeMap TreeMap scores=new TreeMap(); // Insert key-value pairs into the TreeMap scores.put(&apos;Alice&apos;,90); scores.put(&apos;Bob&apos;,80); scores.put(&apos;Charlie&apos;,95); scores.put(&apos;David&apos;,87); scores.put(&apos;Eve&apos;,92); //Access and print values from the TreeMap System.out.println(&apos;Score of Alice:&apos;+scores.get(&apos;Alice&apos;)); System.out.println(&apos;Score of Charlie:&apos;+scores.get(&apos;Charlie&apos;)); System.out.println(&apos;Score of David:&apos;+scores.get(&apos;David&apos;)); // Update a value in the TreeMap scores.put(&apos;Bob&apos;,85); // Remove a key-value pair from the TreeMap scores.remove(&apos;Eve&apos;); // Iterate through the TreeMap using a for-each loop System.out.println(&apos;Scores in the TreeMap:&apos;); for (String name:scores.keySet()) { int score=scores.get(name); System.out.println(name+&apos;:&apos;+score); } } } </pre> <p> <strong>Output:</strong> </p> <pre> Score of Alice:90 Score of Charlie:95 Score of David:87 Scores in the TreeMap: Alice:90 Bob:85 Charlie:95 David:87 </pre> <h3>10) Graph:</h3> <p>Graphs are data structure that represents a collection of interconnected nodes or vertices. They are composed of vertices and edges, where vertices represent entities and edges represent the relationships between those entities.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Versatility:</td> Graphs can represent a wide range of real-world scenarios, making them suitable for various applications such as social networks, transportation systems, and computer networks. </tr><tr><td>Relationship Representation:</td> Graphs provide a natural way to represent relationships and connections between entities, allowing for efficient analysis and traversal of these relationships. </tr><tr><td>Efficient Search and Traversal:</td> Graph algorithms like breadth-first search (BFS) and depth-first search (DFS) enable efficient traversal and searching of the graph&apos;s vertices and edges. </tr><tr><td>Modeling Complex Relationships:</td> Graphs can model complex relationships, including hierarchical structures, cyclic dependencies, and multiple connections between entities. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>Space Complexity:</td> Graphs can consume a significant amount of memory, especially large-scale graphs with many vertices and edges. </tr><tr><td>The complexity of Operations:</td> Certain graph operations, such as finding the shortest path or detecting cycles, can have high time complexity, particularly in dense graphs. </tr><tr><td>Difficulty in Maintenance:</td> Modifying or updating a graph can be complex, as changes in the graph&apos;s structure may impact its connectivity and existing algorithms. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> GraphExample.java</p> <pre> import java.util.*; public class GraphExample { private int V; // Number of vertices private List<list> adjacencyList; // Adjacency list representation public GraphExample(int V) { this.V=V; adjacencyList=new ArrayList(V); // Initialize the adjacency list for (int i=0;i<v;i++) { adjacencylist.add(new arraylist()); } function to add an edge between two vertices public void addedge(int source,int destination) adjacencylist.get(source).add(destination); adjacencylist.get(destination).add(source); perform breadth-first search traversal of the graph bfs(int startvertex) boolean[] visited="new" boolean[v]; queue linkedlist(); visited[startvertex]="true;" queue.add(startvertex); while (!queue.isempty()) int currentvertex="queue.poll();" system.out.print(currentvertex+' '); list neighbors="adjacencyList.get(currentVertex);" for (int neighbor:neighbors) if (!visited[neighbor]) visited[neighbor]="true;" queue.add(neighbor); system.out.println(); depth-first dfs(int dfsutil(startvertex,visited); private dfsutil(int vertex,boolean[] visited) visited[vertex]="true;" system.out.print(vertex+' dfsutil(neighbor,visited); static main(string[] args) v="5;" number graphexample graphexample(v); edges graph.addedge(0,1); graph.addedge(0,2); graph.addedge(1,3); graph.addedge(2,3); graph.addedge(2,4); system.out.print('bfs traversal: graph.bfs(0); system.out.print('dfs graph.dfs(0); < pre> <p> <strong>Output:</strong> </p> <pre> BFS traversal: 0 1 2 3 4 DFS traversal: 0 1 3 2 4 </pre> <h3>11) Tree:</h3> <p>A tree is a widely used data structure in computer science that represents a hierarchical structure. It consists of nodes connected by edges, where each node can have zero or more child nodes.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Hierarchical Structure:</td> Trees provide a natural way to represent hierarchical relationships, such as file systems, organization charts, or HTML/XML documents. </tr><tr><td>Efficient Search:</td> Binary search trees enable efficient searching with a time complexity of O(log n), making them suitable for storing and retrieving sorted data. </tr><tr><td>Fast Insertion and Deletion:</td> Tree data structures offer efficient insertion and deletion operations, especially when balanced, such as AVL trees or Red-Black trees. </tr><tr><td>Ordered Iteration:</td> In-order traversal of a binary search tree gives elements in a sorted order, which is helpful for tasks like printing elements in sorted order or finding the next/previous element. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>High Memory Overhead:</td> Trees require additional memory to store node references or pointers, which can result in higher memory usage compared to linear data structures like arrays or lists. </tr><tr><td>Complex Implementation:</td> Implementing and maintaining a tree data structure can be more complex compared to other data structures like arrays or lists, especially for balanced tree variants. </tr><tr><td>Limited Operations:</td> Some tree variants, like binary search trees, do not support efficient operations like finding the kth smallest element or finding the rank of an element. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Insertion:</td> Add a new node to the tree. </tr><tr><td>Deletion:</td> Remove a node from the tree. </tr><tr><td>Search:</td> Find a specific node or element in the tree. </tr><tr><td>Traversal:</td> Traverse the tree in different orders, such as in-order, pre-order, or post-order. </tr><tr><td>Height/Depth:</td> Calculate the height or depth of the tree. </tr><tr><td>Balance:</td> Ensure the tree remains balanced to maintain efficient operations. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeExample.java</p> <pre> import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)></pre></v;i++)></list></pre></numbers.length;i++)>

2) ArrayList:

ArrayList в Java е динамична структура от данни, която позволява съхранение и манипулиране на елементи. Той е част от Java Collections Framework и е реализиран с помощта на вътрешен масив.

Предимства:

    Динамичен размер:За разлика от масивите, ArrayLists могат динамично да нарастват или намаляват по размер, когато елементите се добавят или премахват. Той елиминира необходимостта от ръчно преоразмеряване и позволява удобно боравене с различни количества данни.Лесна манипулация на елементи:ArrayLists предлагат методи за добавяне, премахване и модифициране на елементи на всяка позиция в списъка. Неговата гъвкавост опростява обичайните операции като вмъкване, изтриване и актуализиране, което прави манипулирането на елементите по-ефективно.Произволен достъп:ArrayLists поддържат произволен достъп до елементи с помощта на техния индекс, което позволява бързо извличане и модифициране на елементи на определени позиции в списъка. Улеснява ефективния достъп до елементите и подобрява цялостната производителност.Съвместимост с Java Collection Framework:ArrayLists имплементират интерфейса List, което ги прави съвместими с други класове Collection в Java Collections Framework. Неговата съвместимост позволява безпроблемна интеграция с различни алгоритми и операции, предоставени от рамката.

Недостатъци:

    По-големи разходи за памет:ArrayLists изискват допълнителна памет, за да поддържат вътрешната си структура, което води до по-голямо натоварване на паметта в сравнение с масивите. Това може да бъде проблем, когато се работи с големи колекции от елементи.По-бавно вмъкване и изтриване:Вмъкването или изтриването на елементи в средата на ArrayList изисква преместване на елементи, което може да отнеме много време за големи списъци. В сценарии, при които се очакват чести операции по вмъкване или изтриване, други структури от данни като LinkedList може да предложат по-добра производителност.Ограничена ефективност за търсене:Търсенето на елемент в несортиран ArrayList изисква итериране на елементите, докато се намери съвпадение. Това е подход на линейно търсене, който води до по-бавна производителност на търсене в сравнение със структурите от данни, оптимизирани за търсене, като HashSet или TreeMap.Без поддръжка на примитивен тип:ArrayLists могат да съхраняват само обекти и не поддържат директно примитивни типове данни като int или char. За да се съхраняват примитивни типове, трябва да се използват обвиващи класове като Integer или Character, което води до потенциални допълнителни разходи за автоматично и разопаковане.

Функции:

инструмент за лечение gimp
    Създаване на ArrayList:Декларирайте и инициализирайте ArrayList с помощта на класа ArrayList и укажете типа на елемента в ъгловите скоби.Добавяне на елементи:Използвайте метода add, за да добавите елементи в края на ArrayList.Достъп до елементи:Използвайте техниката get, за да извлечете цената на детайла при избран индекс.Модифициращи елементи:Актуализирайте цената на детайла по конкретен индекс за използване на зададения подход.Намиране на размер:Използвайте метода dimensions, за да получите най-модерното количество фактори в ArrayList.Премахване на елементи:Използвайте подхода за премахване, за да изтриете детайл в конкретен индекс или чрез предоставяне на препратка към обекта.Итерация през ArrayList:Използвайте цикли, за да итерирате всеки елемент в ArrayList и да извършвате операции върху тях.

Изпълнение:

Име на файл: ArrayListExample.java

 import java.util.*; public class ArrayListExample { public static void main(String[] args) { // Create an ArrayList to store integers ArrayList numbers=new ArrayList(List.of(10,20,30,40,50)); //Access and print elements from the ArrayList System.out.println(&apos;Element at index 0:&apos;+numbers.get(0)); System.out.println(&apos;Element at index 2:&apos;+numbers.get(2)); System.out.println(&apos;Element at index 4:&apos;+numbers.get(4)); // Calculate and print the sum of all elements in the ArrayList int sum=numbers.stream().mapToInt(Integer::intValue).sum(); System.out.println(&apos;Sum of ArrayList elements:&apos;+sum); // Update an element in the ArrayList numbers.set(2,35); System.out.println(&apos;Updated element at index 2:&apos;+numbers.get(2)); // Iterate through the ArrayList using a for-each loop and print the elements System.out.println(&apos;Elements in the ArrayList:&apos;); for (int number:numbers) { System.out.println(number); } } } 

Изход:

 Element at index 0:10 Element at index 2:30 Element at index 4:50 Sum of ArrayList elements:150 Updated element at index 2:35 Elements in the ArrayList: 10 20 35 40 50 

3) Свързан списък:

Свързаният списък е линейна структура от данни, в която елементите се съхраняват в отделни обекти, наречени възли. Референтна връзка към следващия възел в последователността е включена във всеки елемент от данни на възел. Последният възел на списъка се свързва с null, което показва, че списъкът е приключил.

За разлика от масивите, свързаните списъци не изискват непрекъснато разпределение на паметта. Всеки възел в свързан списък може да бъде разпределен независимо, което позволява динамично разпределение на паметта и ефективни операции за вмъкване и изтриване.

равенство на java обекти

Предимства:

    Динамичен размер:LinkedList може да нараства или да се свива динамично, което го прави подходящ за различни или неизвестни размери на данни.Ефективно вмъкване и изтриване:Вмъкването или изтриването на елементи в рамките на LinkedList е ефективно, тъй като не изисква преместване на елементи.Без изискване за непрекъсната памет:LinkedList не се нуждае от непрекъснато разпределение на паметта, което го прави гъвкав и подходящ за непредвидими ситуации с памет.Лесна модификация:LinkedList позволява лесно модифициране на елементи чрез промяна на референтните указатели, което позволява ефективно манипулиране.

Недостатъци:

    По-бавен произволен достъп:LinkedList има по-бавен произволен достъп, тъй като изисква обхождане на списъка за достъп до елементи по индекс.Увеличени разходи за памет:LinkedList изисква допълнителна памет за препратки и възли, което увеличава натоварването на паметта в сравнение с масивите.Неефективно търсене:LinkedList има по-бавни операции за търсене, изискващи последователно повторение за намиране на конкретни елементи.

Функции:

    Създаване на LinkedList:Декларирайте и инициализирайте LinkedList с помощта на класа LinkedList.Добавяне на елементи:Използвайте метода add, за да добавите елементи в края на LinkedList.Достъп до елементи:Използвайте метода get, за да извлечете стойността на елемент при определен индекс.Модифициращи елементи:Актуализирайте стойността на елемент при определен индекс, като използвате метода set.Премахване на елементи:Използвайте метода за премахване, за да изтриете елемент на конкретен индекс или като предоставите препратката към обекта.

Изпълнение:

Име на файл: LinkedList1.java

 import java.util.*; public class LinkedList1 { public static void main(String[] args) { // Create a LinkedList to store integers LinkedList linkedList1 = new LinkedList(); // Add elements to the LinkedList linkedList1.add(10); linkedList1.add(20); linkedList1.add(30); linkedList1.add(40); linkedList1.add(50); // Print the LinkedList System.out.println(&apos;LinkedList:&apos;+linkedList1); // Remove an element from the LinkedList linkedList1.removeFirst(); System.out.println(&apos;LinkedList after removing first element:&apos;+linkedList1); // Check if an element exists in the LinkedList boolean containsElement=linkedList1.contains(30); System.out.println(&apos;LinkedList contains element 30?&apos;+containsElement); // Get the first and last elements of the LinkedList int firstElement=linkedList1.getFirst(); int lastElement=linkedList1.getLast(); System.out.println(&apos;First element:&apos;+firstElement); System.out.println(&apos;Last element:&apos;+lastElement); // Clear the LinkedList linkedList1.clear(); System.out.println(&apos;LinkedList after clearing:&apos;+linkedList1); } } 

Изход:

 LinkedList:[10, 20, 30, 40, 50] LinkedList after removing first element:[20, 30, 40, 50] LinkedList contains element 30?true First element:20 Last element:50 LinkedList after clearing:[] 

4) Стек:

Принципът „Последен влязъл, първи излязъл“ (LIFO) диктува, че елементът, който е бил най-скоро вмъкнат, е и елементът, който е премахнат първи. Стекът е линейна структура от данни, която следва това правило. Той използва командите „push“ и „pop“, за да добави елементи към стека и съответно да премахне най-горния елемент от стека. Техниката „надникване“ допълнително позволява достъп до горния елемент, без да го премахвате.

Характеристики на стека:

    Поведение на LIFO:Последният елемент, избутан върху стека, е първият, който изскача, което го прави подходящ за приложения, където редът на поставяне и премахване е важен.Ограничен достъп:Стековете обикновено осигуряват ограничен достъп до елементи. Имате достъп само до най-горния елемент, а за да достигнете до други елементи, трябва да изскочите елементите над тях.Динамичен размер:Стековете могат да бъдат реализирани с помощта на масиви или свързани списъци, което позволява динамичен размер. Те могат да растат или да се свиват според нуждите по време на изпълнение.

Предимства:

    Простота:Стековете са лесни за разбиране и прилагане.Ефективност:Операциите за вмъкване и изтриване имат времева сложност O(1).Управление на повикване на функции:Стековете ефективно управляват извиквания на функции и съхранение на променливи.Функция за отмяна/възстановяване:Стековете позволяват операции за отмяна и повторение в приложенията.

Недостатъци:

    Ограничен достъп:Достъпът до елементите е ограничен до горната част на стека.Ограничения за размера:Стековете може да имат ограничения на размера в зависимост от изпълнението.Не е подходящ за всички сценарии:Стековете са специфични за поведението на LIFO и може да не са подходящи в други случаи.

Изпълнение:

Име на файл: StackExample.java

 import java.util.Stack; public class StackExample { public static void main(String[] args) { // Create a stack Stack stack=new Stack(); // Push elements onto the stack stack.push(10); stack.push(20); stack.push(30); // Print the top element of the stack System.out.println(&apos;Top element:&apos;+stack.peek()); // Pop elements from the stack int poppedElement=stack.pop(); System.out.println(&apos;Popped element:&apos;+poppedElement); // Check if the stack is empty System.out.println(&apos;Is stack empty?&apos;+stack.isEmpty()); // Get the size of the stack System.out.println(&apos;Stack size:&apos;+stack.size()); // Iterate over the stack System.out.println(&apos;Stack elements:&apos;); for (Integer element:stack) { System.out.println(element); } } } 

Изход:

 Top element:30 Popped element:30 Is stack empty?false Stack size:2 Stack elements: 10 20 

5) Опашка:

Опашката е линейна структура от данни в Java, която следва принципа „първи влязъл, първи излязъл“ (FIFO). Представлява колекция от елементи, където елементите се вмъкват отзад и се отстраняват отпред.

Характеристика:

    Поставете в опашка:Добавяне на елемент в задната част на опашката.Изваждане от опашката:Премахване на елемент от началото на опашката.Погледнете:Извлечете елемента в началото на опашката, без да го премахвате.размер:Определяне на броя на елементите в опашката.Празен чек:Проверява се дали опашката е празна.

Предимства:

    Поведение на FIFO:Елементите се обработват по реда на тяхното вмъкване, като се гарантира запазване на оригиналната последователност.Ефективно поставяне и премахване:Добавянето и премахването на елементи от опашката е бързо и има постоянна времева сложност O(1).Синхронизация:Java предоставя синхронизирани реализации на опашка, което ги прави безопасни за едновременно програмиране.Стандартизиран интерфейс:Интерфейсът Queue в Java предлага общ набор от методи, позволяващи лесна взаимозаменяемост между различни реализации на опашка.

Недостатъци:

    Без произволен достъп:Опашките не поддържат директен достъп до елементи в средата. Достъпът до конкретни позиции изисква премахване на предходните елементи от опашката.Ограничен размер:Някои реализации на опашка имат фиксиран размер или капацитет, което води до препълване или изключения при превишаване на максималния размер.Неефективно търсене:Търсенето на елемент в опашка изисква изваждане от опашката, докато се намери съвпадение, което води до линейно търсене с потенциално висока времева сложност.

Изпълнение:

Име на файл: QueueExample.java

 import java.util.Stack; import java.util.LinkedList; import java.util.Queue; public class QueueExample { public static void main(String[] args) { // Create a Queue to store integers Queue queue=new LinkedList(); // Enqueue elements to the Queue queue.offer(10); queue.offer(20); queue.offer(30); queue.offer(40); queue.offer(50); //Access and print the front element of the Queue System.out.println(&apos;Front element:&apos;+queue.peek()); // Dequeue elements from the Queue and print them while (!queue.isEmpty()) { int element=queue.poll(); System.out.println(&apos;Dequeued element:&apos;+element); } } } 

Изход:

 Front element:10 Dequeued element:10 Dequeued element:20 Dequeued element:30 Dequeued element:40 Dequeued element:50 

6) HashMap:

HashMap е структура от данни в Java, която предоставя начин за съхраняване и извличане на двойки ключ-стойност. Той е част от Java Collections Framework и се изпълнява въз основа на структурата на данните на хеш-таблицата.

Функции:

    постави (ключ, стойност):Вмъква указаната двойка ключ-стойност в HashMap.получи (ключ):Извлича стойността, свързана с посочения ключ.съдържа ключ (ключ):Проверява дали HashMap съдържа посочения ключ.съдържа стойност (стойност):Проверява дали HashMap съдържа указаната стойност.премахване (ключ):Премахва двойката ключ-стойност, свързана с посочения ключ от HashMap.размер():Връща броя на двойките ключ-стойност в HashMap.празно е():Проверява дали HashMap е празен.keySet():Връща набор, съдържащ всички ключове в HashMap.стойности():Връща колекция, съдържаща всички стойности в HashMap.ясно ():Премахва всички двойки ключ-стойност от HashMap.

Предимства:

    Ефективно извличане:HashMap осигурява бързо извличане на стойности въз основа на ключове с постоянна времева сложност O(1).Гъвкаво сдвояване ключ-стойност:HashMap позволява всеки ненулев обект като ключ, позволявайки потребителски дефинирани ключове за съхраняване и извличане на данни.Динамичен размер:HashMap може динамично да нараства или да се свива по размер, за да обработва различни количества данни.Съвместимост с Java Collections Framework:HashMap имплементира интерфейса Map, позволявайки безпроблемна интеграция с други класове на колекция.

Недостатъци:

    Липса на поръчка:HashMap не запазва реда на елементите. Използвайте LinkedHashMap или TreeMap за специфични изисквания за поръчка.Увеличени разходи за памет:HashMap изисква допълнителна памет за хеш кодове и вътрешна структура в сравнение с по-простите структури от данни.По-бавна итерация:Итерирането върху HashMap може да бъде по-бавно в сравнение с масиви или списъци поради преминаване през основната хеш таблица.

Изпълнение:

Име на файл: HashMapExample.java

 import java.util.HashMap; public class HashMapExample { public static void main(String[] args) { // Create a HashMap to store String keys and Integer values HashMap hashMap=new HashMap(); // Add key-value pairs to the HashMap hashMap.put(&apos;John&apos;,25); hashMap.put(&apos;Alice&apos;,30); hashMap.put(&apos;Bob&apos;,35); //Access and print values based on keys System.out.println(&apos;Age of John:&apos;+hashMap.get(&apos;John&apos;)); System.out.println(&apos;Age of Alice:&apos;+hashMap.get(&apos;Alice&apos;)); // Check if a key exists in the HashMap System.out.println(&apos;Is Bob present?&apos;+hashMap.containsKey(&apos;Bob&apos;)); // Update the value associated with a key hashMap.put(&apos;Alice&apos;,32); // Remove a key-value pair from the HashMap hashMap.remove(&apos;John&apos;); // Print all key-value pairs in the HashMap System.out.println(&apos;Key-Value pairs in the HashMap:&apos;); for (String key : hashMap.keySet()) { System.out.println(key+&apos;:&apos;+hashMap.get(key)); } // Check the size of the HashMap System.out.println(&apos;Size of the HashMap:&apos;+hashMap.size()); } } 

Изход:

 Age of John:25 Age of Alice:30 Is Bob present?true Key-Value pairs in the HashMap: Bob:35 Alice:32 Size of the HashMap:2 

7) HashSet:

HashSet е структура от данни в Java, която реализира интерфейса Set и съхранява елементи в хеш таблица.

Характеристика:

    Съхранява уникални елементи:HashSet не позволява дублиращи се елементи. Всеки елемент в HashSet е уникален.Използва търсене на базата на хеш:HashSet използва хеш стойността на всеки елемент, за да определи местоположението му за съхранение, осигурявайки ефективно извличане на елементи.Неподредена колекция:Елементите в HashSet не се съхраняват в определен ред. Редът на елементите може да се промени с времето.

Предимства:

    Бързо търсене на елемент:HashSet осигурява бързи операции за търсене, което прави ефективна проверката дали даден елемент съществува в набора.Без дублиращи се елементи:HashSet автоматично обработва дублирани елементи и гарантира, че всеки елемент е уникален.Интеграция с Java Collections Framework:HashSet имплементира интерфейса Set, което го прави съвместим с други класове колекции в Java Collections Framework.

Недостатъци:

как да стартирате скрипт на linux
    Няма гарантирана поръчка:HashSet не поддържа реда на елементите. Ако редът на елементите е важен, HashSet не е подходящ.Без индексиране:HashSet не предоставя директно индексиране или позиционен достъп до елементи. За да получите достъп до елементи, трябва да преминете през набора.По-високо натоварване на паметта:HashSet изисква допълнителна памет за съхраняване на хеш стойности и поддържане на структурата на хеш таблицата, което води до по-голямо използване на паметта в сравнение с някои други структури от данни.

Изпълнение:

Име на файл: HashSetExample.java

 import java.util.HashSet; public class HashSetExample { public static void main(String[] args) { // Create a HashSet HashSet set=new HashSet(); // Add elements to the HashSet set.add(&apos;Apple&apos;); set.add(&apos;Banana&apos;); set.add(&apos;Orange&apos;); set.add(&apos;Grapes&apos;); set.add(&apos;Mango&apos;); // Print the HashSet System.out.println(&apos;HashSet:&apos;+set); // Check if an element exists System.out.println(&apos;Contains &apos;Apple&apos;:&apos;+set.contains(&apos;Apple&apos;)); // Remove an element set.remove(&apos;Banana&apos;); // Print the updated HashSet System.out.println(&apos;Updated HashSet:&apos;+set); // Get the size of the HashSet System.out.println(&apos;Size of HashSet:&apos;+set.size()); // Clear the HashSet set.clear(); // Check if the HashSet is empty System.out.println(&apos;Is HashSet empty?&apos;+set.isEmpty()); } } 

Изход:

 HashSet:[Apple, Grapes, Mango, Orange, Banana] Contains &apos;Apple&apos;:true Updated HashSet:[Apple, Grapes, Mango, Orange] Size of HashSet:4 Is HashSet empty?true 

8) TreeSet:

TreeSet е реализация на интерфейса SortedSet в Java, който използва самобалансиращо се двоично дърво за търсене, наречено червено-черно дърво, за съхраняване на елементи в сортиран ред.

Предимства:

    Сортиран ред:TreeSet автоматично поддържа елементите в сортиран ред въз основа на техния естествен ред или персонализиран компаратор. Позволява ефективно търсене и извличане на елементи във възходящ или низходящ ред.Без дублиращи се елементи:TreeSet не позволява дублиращи се елементи. Той гарантира, че всеки елемент в набора е уникален, което може да бъде полезно в сценарии, при които трябва да се избягват дублирани стойности.Ефективни операции:TreeSet осигурява ефективни операции като вмъкване, изтриване и търсене. Тези операции имат времева сложност O(log n), където n е броят на елементите в набора.Операции с навигационен набор:TreeSet предоставя допълнителни навигационни методи, като по-високи(), по-ниски(), таван() и етаж(), които ви позволяват да намерите елементи, които са по-големи от, по-малки от или равни на дадена стойност.

Недостатъци:

    Отгоре:TreeSet изисква допълнителна памет за съхраняване на вътрешната структура на данните, което може да доведе до по-голямо натоварване на паметта в сравнение с други изпълнения на набори.По-бавно поставяне и премахване:Операциите за вмъкване и премахване в TreeSet включват поддържане на сортирания ред на елементите, което може да изисква преструктуриране на дървото. Може да направи тези операции малко по-бавни в сравнение с HashSet или LinkedHashSet.Ограничено персонализиране:TreeSet е предназначен основно за естествено подреждане или един персонализиран компаратор. Може да се нуждае от повече гъвкавост за множество критерии за сортиране или сложна логика за сортиране.

Функции:

    добави (елемент):Добавя елемент към TreeSet, като запазва сортирания ред.премахване (елемент):Премахва посочения елемент от TreeSet.съдържа (елемент):Проверява дали TreeSet съдържа посочения елемент.размер():Връща броя на елементите в TreeSet.първи():Връща първия (най-ниския) елемент в TreeSet.последно():Връща последния (най-висок) елемент в TreeSet.по-висок (елемент):Връща най-малкия елемент в TreeSet, който е строго по-голям от дадения елемент.по-нисък (елемент):Връща най-големия елемент в TreeSet, който е строго по-малък от дадения елемент.

Изпълнение:

сортиране на списък с масиви java

Име на файл: TreeSetExample.java

 import java.util.TreeSet; public class TreeSetExample { public static void main(String[] args) { // Create a TreeSet TreeSet numbers=new TreeSet(); // Add elements to the TreeSet numbers.add(5); numbers.add(2); numbers.add(8); numbers.add(1); numbers.add(4); // Print the TreeSet System.out.println(&apos;Elements in the TreeSet:&apos;+numbers); // Check if an element exists System.out.println(&apos;Does TreeSet contain 4?&apos;+numbers.contains(4)); // Remove an element numbers.remove(2); // Print the TreeSet after removal System.out.println(&apos;Elements in the TreeSet after removal:&apos;+numbers); // Get the size of the TreeSet System.out.println(&apos;Size of the TreeSet:&apos;+numbers.size()); // Get the first and last element System.out.println(&apos;First element:&apos;+numbers.first()); System.out.println(&apos;Last element:&apos;+numbers.last()); // Iterate over the TreeSet System.out.println(&apos;Iterating over the TreeSet:&apos;); for (int number:numbers) { System.out.println(number); } } } 

Изход:

 Elements in the TreeSet:[1, 2, 4, 5, 8] Does TreeSet contain 4? true Elements in the TreeSet after removal:[1, 4, 5, 8] Size of the TreeSet:4First element:1 Last element:8 Iterating over the TreeSet: 1 4 5 8 

9) TreeMap:

TreeMap е клас в Java, който имплементира интерфейса Map и предоставя сортирано съпоставяне на ключ-стойност въз основа на естествения ред на ключовете или потребителски компаратор.

Предимства:

    Сортиран ред:TreeMap поддържа ключовете в сортиран ред, което позволява ефективно търсене, извличане и базирани на диапазон операции.Съпоставяне на ключ-стойност:TreeMap съхранява двойки ключ-стойност, което позволява ефективно търсене и извличане на стойности въз основа на свързаните ключове.Внедряване на червено-черно дърво:TreeMap използва вътрешно балансирано двоично дърво за търсене (червено-черно дърво), което гарантира ефективна производителност дори за големи набори от данни.Поддръжка за потребителски компаратори:TreeMap позволява използването на потребителски компаратори за определяне на реда на сортиране на ключовете, осигурявайки гъвкавост в критериите за сортиране.

Недостатъци:

    Разход на паметта:TreeMap изисква допълнителна памет за съхраняване на вътрешната дървовидна структура и свързаните обекти, което води до по-голямо използване на паметта в сравнение с по-прости структури от данни като HashMap.По-бавно вмъкване и изтриване:Операциите за вмъкване и изтриване в TreeMap имат времева сложност от O(log n) поради необходимостта от преструктуриране на дървото, което ги прави по-бавни в сравнение с HashMap или LinkedHashMap.Ограничена производителност за несортирани данни:TreeMap работи ефективно за сортирани данни, но неговата производителност може да се влоши при работа с несортирани данни или чести модификации, тъй като изисква поддържане на сортирания ред.

Функции:

    постави (ключ, стойност):Вмъква двойка ключ-стойност в TreeMap.получи (ключ):Извлича стойността, свързана с посочения ключ.съдържа ключ (ключ):Проверява дали TreeMap съдържа конкретен ключ.премахване (ключ):Премахва двойката ключ-стойност, свързана с посочения ключ.размер():Връща броя на двойките ключ-стойност в TreeMap.keySet():Връща набор от всички ключове в TreeMap.стойности():Връща колекция от всички стойности в TreeMap.entrySet():Връща набор от двойки ключ-стойност в TreeMap.

Изпълнение:

Име на файл: TreeMapExample.java

 import java.util.TreeMap; public class TreeMapExample { public static void main(String[] args) { // Create a TreeMap TreeMap scores=new TreeMap(); // Insert key-value pairs into the TreeMap scores.put(&apos;Alice&apos;,90); scores.put(&apos;Bob&apos;,80); scores.put(&apos;Charlie&apos;,95); scores.put(&apos;David&apos;,87); scores.put(&apos;Eve&apos;,92); //Access and print values from the TreeMap System.out.println(&apos;Score of Alice:&apos;+scores.get(&apos;Alice&apos;)); System.out.println(&apos;Score of Charlie:&apos;+scores.get(&apos;Charlie&apos;)); System.out.println(&apos;Score of David:&apos;+scores.get(&apos;David&apos;)); // Update a value in the TreeMap scores.put(&apos;Bob&apos;,85); // Remove a key-value pair from the TreeMap scores.remove(&apos;Eve&apos;); // Iterate through the TreeMap using a for-each loop System.out.println(&apos;Scores in the TreeMap:&apos;); for (String name:scores.keySet()) { int score=scores.get(name); System.out.println(name+&apos;:&apos;+score); } } } 

Изход:

 Score of Alice:90 Score of Charlie:95 Score of David:87 Scores in the TreeMap: Alice:90 Bob:85 Charlie:95 David:87 

10) Графика:

Графите са структура от данни, която представлява колекция от взаимосвързани възли или върхове. Те са съставени от върхове и ръбове, където върховете представляват обекти, а ръбовете представляват връзките между тези обекти.

Предимства:

    Универсалност:Графиките могат да представят широк спектър от сценарии от реалния свят, което ги прави подходящи за различни приложения като социални мрежи, транспортни системи и компютърни мрежи.Представяне на взаимоотношенията:Графиките осигуряват естествен начин за представяне на взаимоотношения и връзки между обекти, което позволява ефективен анализ и преминаване на тези взаимоотношения.Ефективно търсене и обхождане:Графични алгоритми като търсене в ширина (BFS) и първо в дълбочина (DFS) позволяват ефективно обхождане и търсене на върховете и ръбовете на графиката.Моделиране на сложни взаимоотношения:Графиките могат да моделират сложни връзки, включително йерархични структури, циклични зависимости и множество връзки между обекти.

Недостатъци:

    Космическа сложност:Графите могат да консумират значително количество памет, особено мащабните графи с много върхове и ръбове.Сложността на операциите:Определени графични операции, като намиране на най-краткия път или откриване на цикли, могат да имат висока времева сложност, особено в плътни графики.Трудност при поддръжката:Модифицирането или актуализирането на графика може да бъде сложно, тъй като промените в структурата на графиката могат да повлияят на нейната свързаност и съществуващите алгоритми.

Изпълнение:

Име на файл: GraphExample.java

 import java.util.*; public class GraphExample { private int V; // Number of vertices private List<list> adjacencyList; // Adjacency list representation public GraphExample(int V) { this.V=V; adjacencyList=new ArrayList(V); // Initialize the adjacency list for (int i=0;i<v;i++) { adjacencylist.add(new arraylist()); } function to add an edge between two vertices public void addedge(int source,int destination) adjacencylist.get(source).add(destination); adjacencylist.get(destination).add(source); perform breadth-first search traversal of the graph bfs(int startvertex) boolean[] visited="new" boolean[v]; queue linkedlist(); visited[startvertex]="true;" queue.add(startvertex); while (!queue.isempty()) int currentvertex="queue.poll();" system.out.print(currentvertex+\' \'); list neighbors="adjacencyList.get(currentVertex);" for (int neighbor:neighbors) if (!visited[neighbor]) visited[neighbor]="true;" queue.add(neighbor); system.out.println(); depth-first dfs(int dfsutil(startvertex,visited); private dfsutil(int vertex,boolean[] visited) visited[vertex]="true;" system.out.print(vertex+\' dfsutil(neighbor,visited); static main(string[] args) v="5;" number graphexample graphexample(v); edges graph.addedge(0,1); graph.addedge(0,2); graph.addedge(1,3); graph.addedge(2,3); graph.addedge(2,4); system.out.print(\'bfs traversal: graph.bfs(0); system.out.print(\'dfs graph.dfs(0); < pre> <p> <strong>Output:</strong> </p> <pre> BFS traversal: 0 1 2 3 4 DFS traversal: 0 1 3 2 4 </pre> <h3>11) Tree:</h3> <p>A tree is a widely used data structure in computer science that represents a hierarchical structure. It consists of nodes connected by edges, where each node can have zero or more child nodes.</p> <p> <strong>Advantages:</strong> </p> <ol class="points"> <tr><td>Hierarchical Structure:</td> Trees provide a natural way to represent hierarchical relationships, such as file systems, organization charts, or HTML/XML documents. </tr><tr><td>Efficient Search:</td> Binary search trees enable efficient searching with a time complexity of O(log n), making them suitable for storing and retrieving sorted data. </tr><tr><td>Fast Insertion and Deletion:</td> Tree data structures offer efficient insertion and deletion operations, especially when balanced, such as AVL trees or Red-Black trees. </tr><tr><td>Ordered Iteration:</td> In-order traversal of a binary search tree gives elements in a sorted order, which is helpful for tasks like printing elements in sorted order or finding the next/previous element. </tr></ol> <p> <strong>Disadvantages:</strong> </p> <ol class="points"> <tr><td>High Memory Overhead:</td> Trees require additional memory to store node references or pointers, which can result in higher memory usage compared to linear data structures like arrays or lists. </tr><tr><td>Complex Implementation:</td> Implementing and maintaining a tree data structure can be more complex compared to other data structures like arrays or lists, especially for balanced tree variants. </tr><tr><td>Limited Operations:</td> Some tree variants, like binary search trees, do not support efficient operations like finding the kth smallest element or finding the rank of an element. </tr></ol> <p> <strong>Functions:</strong> </p> <ol class="points"> <tr><td>Insertion:</td> Add a new node to the tree. </tr><tr><td>Deletion:</td> Remove a node from the tree. </tr><tr><td>Search:</td> Find a specific node or element in the tree. </tr><tr><td>Traversal:</td> Traverse the tree in different orders, such as in-order, pre-order, or post-order. </tr><tr><td>Height/Depth:</td> Calculate the height or depth of the tree. </tr><tr><td>Balance:</td> Ensure the tree remains balanced to maintain efficient operations. </tr></ol> <p> <strong>Implementation:</strong> </p> <p> <strong>FileName:</strong> TreeExample.java</p> <pre> import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)></pre></v;i++)></list>

11) Дърво:

Дървото е широко използвана структура от данни в компютърните науки, която представлява йерархична структура. Състои се от възли, свързани с ръбове, като всеки възел може да има нула или повече дъщерни възли.

Предимства:

    Йерархична структура:Дърветата предоставят естествен начин за представяне на йерархични връзки, като файлови системи, организационни диаграми или HTML/XML документи.Ефективно търсене:Двоичните дървета за търсене позволяват ефективно търсене с времева сложност O(log n), което ги прави подходящи за съхраняване и извличане на сортирани данни.Бързо вмъкване и изтриване:Дървовидните структури на данни предлагат ефективни операции за вмъкване и изтриване, особено когато са балансирани, като AVL дървета или червено-черни дървета.Подредена итерация:Обхождането по ред на дърво за двоично търсене дава елементи в сортиран ред, което е полезно за задачи като отпечатване на елементи в сортиран ред или намиране на следващия/предишния елемент.

Недостатъци:

    Високи разходи за памет:Дърветата изискват допълнителна памет за съхраняване на препратки към възли или указатели, което може да доведе до по-голямо използване на паметта в сравнение с линейни структури от данни като масиви или списъци.Комплексно изпълнение:Внедряването и поддържането на дървовидна структура от данни може да бъде по-сложно в сравнение с други структури от данни като масиви или списъци, особено за балансирани варианти на дърво.Ограничени операции:Някои варианти на дърво, като дървета за двоично търсене, не поддържат ефективни операции като намиране на k-тия най-малък елемент или намиране на ранга на елемент.

Функции:

    Вмъкване:Добавете нов възел към дървото.Изтриване:Премахване на възел от дървото.Търсене:Намерете конкретен възел или елемент в дървото.Преминаване:Преминете през дървото в различни редове, като например ред, предварителна поръчка или след поръчка.Височина/Дълбочина:Изчислете височината или дълбочината на дървото.Баланс:Уверете се, че дървото остава балансирано, за да поддържа ефективни операции.

Изпълнение:

Име на файл: TreeExample.java

 import java.util.*; class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; left = null; right = null; } } public class TreeExample { public static void main(String[] args) { // Create a binary search tree TreeNode root = new TreeNode(50); root.left = new TreeNode(30); root.right = new TreeNode(70); root.left.left = new TreeNode(20); root.left.right = new TreeNode(40); root.right.left = new TreeNode(60); root.right.right = new TreeNode(80); // Perform common operations System.out.println(&apos;In-order Traversal:&apos;); inOrderTraversal(root); System.out.println(&apos;
Search for value 40: &apos;+search(root, 40)); System.out.println(&apos;Search for value 90: &apos;+search(root, 90)); int minValue = findMinValue(root); System.out.println(&apos;Minimum value in the tree: &apos;+minValue); int maxValue = findMaxValue(root); System.out.println(&apos;Maximum value in the tree: &apos;+maxValue); } // In-order traversal: left subtree, root, right subtree public static void inOrderTraversal(TreeNode node) { if (node != null) { inOrderTraversal(node.left); System.out.print(node.value + &apos; &apos;); inOrderTraversal(node.right); } } // Search for a value in the tree public static boolean search(TreeNode node, int value) { if (node == null) return false; if (node.value == value) return true; if (value <node.value) return search(node.left, value); else search(node.right, } find the minimum value in tree public static int findminvalue(treenode node) { if (node.left="=" null) node.value; findminvalue(node.left); maximum findmaxvalue(treenode (node.right="=" findmaxvalue(node.right); < pre> <p> <strong>Output:</strong> </p> <pre> In-order Traversal:20 30 40 50 60 70 80 Search for value 40: true Search for value 90: false Minimum value in the tree: 20 Maximum value in the tree: 80 </pre> <hr></node.value)>