logo

Structuri de date în Java

Numeroasele moduri prin care datele pot fi aranjate, salvate și gestionate în cadrul unui program de calculator sunt denumite structuri de date în Java. Aceste structuri oferă o metodă metodică de manipulare și gestionare a datelor în mod eficient, permițând operațiuni utile precum inserarea, ștergerea, preluarea și traversarea.

Articolul va explora tot ceea ce este legat de structurile de date din Java și îi ajută pe începători să înțeleagă ușor și eficient.

  • Ce este Java?
  • Ce sunt structurile de date în Java?
  • Tipuri de structuri de date în Java
  • Avantajele structurilor de date în Java
  • Clasificarea structurilor de date
  • Întrebări frecvente privind structurile de date în Java

Ce este Java?

Java este un limbaj popular de programare orientat pe obiecte, renumit pentru biblioteca sa standard vastă și libertatea platformei. Oferă o arhitectură solidă pentru crearea de programe care rulează fără recompilare pe diverse platforme. Cunoscuta bibliotecă pentru Java are o gamă largă de sisteme de înregistrări care fac viabil să se ocupe eficient de numeroase tipuri de date.

Ce sunt structurile de date în Java?

Modul în care datele sunt organizate și stocate în memoria unui program de calculator se bazează îndeaproape pe structurile de înregistrări Java. Renumita bibliotecă Java include un tip semnificativ de structuri statistice încorporate. Câteva dintre sistemele de înregistrări care permit programatorilor modalități scurte și simple de a salva și aranja datele includ liste conectate, stive, cozi și matrice. Dezvoltatorii pot efectua rapid operațiuni precum inserarea, ștergerea, căutarea și sortarea, deoarece oferă o serie de mecanisme pentru obținerea accesului la, modificarea și gestionarea datelor. Programatorii Java pot reduce utilizarea memoriei și pot crește considerabil eficiența generală a programelor lor prin utilizarea acestor structuri de date.

Tipuri de structuri de date în Java

Lista structurilor de date din Java este listată mai jos

  1. Matrice
  2. ArrayList
  3. LinkedList
  4. Grămadă
  5. Coadă
  6. HashMap
  7. HashSet
  8. TreeSet
  9. Harta copacului
  10. Grafic
  11. Copac

Diagrama de mai jos explică foarte clar tipurile de structuri de date în Java.

Structuri de date în Java

Clasificare suplimentară a tipurilor de structuri de date:

Există două tipuri de structuri de date: -

  1. Structuri de date primitive
  2. Structuri de date non-primitive

1) Structuri de date primitive: Cunoscute și ca tipuri de date primitive, acestea sunt tipuri de date de bază încorporate în Java. Ei includ:

    octet:Stochează numere întregi de la -128 la 127.mic de statura:Stochează numere întregi de la -32.768 la 32.767.int:Stochează numere întregi de la -2.147.483.648 la 2.147.483.647.pluti:Stochează numere în virgulă mobilă cu o singură precizie.char:Stochează personaje individuale.boolean:Stochează valori adevărate sau false.lung:Stochează numere întregi mari.Dubla:Stochează numere cu factor flotant cu dublă precizie.

2) Structuri de date non-primitive: Structurile de înregistrări non-primitive sunt mai complexe și sunt compuse din tipuri primitive de informații. Ele pot fi, în plus, clasificate în două feluri:

    Structuri liniare de date:În structurile de date liniare, elementele sunt aranjate liniar sau secvenţial. Exemplele includ:
      Matrice:Un grup de elemente tipizate identic plasate într-o matrice conform unui aranjament predeterminat.Stive:O structură Last-In-First-Out (LIFO) în care pot fi adăugate sau eliminate numai elementele de sus.Cozi:Structurile First-In-First-Out (FIFO) sunt utilizate în cozi, unde articolele sunt introduse pe partea returnată și scoase pe față.Lista legată:O listă asociată cuprinde o colecție de gadgeturi denumite noduri, fiecare dintre ele având o referință la nodul de după el și statistici în interiorul acestuia.
    Structuri de date neliniare:În structurile de date neliniare, elementele sunt aranjate într-o manieră nesecvențială. Exemplele includ:
      Copaci:Arborii sunt un tip de structură ierarhică bazată pe noduri, cu un nod rădăcină în partea de sus și noduri secundare care se ramifică din acesta. Exemplele includ arbori roșu-negru, arbori AVL, arbori binari de căutare și arbori binari.Grafice:Un set de noduri legate prin utilizarea marginilor, în care nodurile pot avea orice cantitate de conexiuni. Graficele sunt folosite pentru a simboliza relații complexe între elemente.Morman:O structură specializată bazată pe arbore în care fiecare nod determinat are o valoare mai mare sau mai mică decât copiii săi, bazându-se pe faptul că este sau nu un heap maxim sau un heap min.Hash:Structuri de date care folosesc o funcție hash pentru a mapa cheile la valori. Exemplele constau în seturi hash și hărți hash, care oferă regăsire ecologică și stocare a statisticilor bazate pe chei precise.
Structuri de date în Java

Avantajele structurilor de date în Java

    Organizare eficientă a datelor:Structurile de date oferă modalități organizate de stocare și gestionare a datelor, permițând operațiuni eficiente de acces, manipulare și recuperare. Ele optimizează utilizarea memoriei și facilitează execuția mai rapidă a algoritmilor.Performanță mai bună:Dezvoltatorii pot îmbunătăți performanța în ceea ce privește viteza și utilizarea memoriei selectând structura de date adecvată pentru o anumită activitate. Performanța este optimizată deoarece structurile de date specifice sunt făcute pentru a excela la anumite acțiuni precum căutarea, sortarea sau inserarea de informații.Reutilizarea codului:Java oferă o gamă largă de structuri de date încorporate care sunt ușor de utilizat pentru programatori. Aceste structuri de date reutilizabile economisesc timp și efort, eliminând nevoia de a crea algoritmi sofisticați de la zero.Simplitatea codului:Structurile de date fac implementarea proceselor complicate mai ușor de codificat. Ele oferă abstracții la nivel înalt și încapsulează specificul gestionării datelor, ceea ce îmbunătățește lizibilitatea, mentenabilitatea și claritatea codului.Flexibilitate și adaptabilitate:Structurile de date oferă flexibilitate în manipularea diferitelor tipuri și dimensiuni de date. Ele se pot ajusta dinamic pentru a se adapta cerințelor de date în schimbare și oferă mecanisme pentru manipularea eficientă a datelor.Standardizat și bine testat:Biblioteca standard pentru Java conține structuri de date încorporate care au fost supuse unor teste și optimizări semnificative, garantând fiabilitatea și performanța acestora. Utilizarea acestor structuri de date comune reduce posibilitatea de erori și oferă dezvoltării aplicațiilor o bază solidă.Scalabilitate:Structurile de date oferă opțiuni de scalabilitate, permițând aplicațiilor să gestioneze eficient volume mari de date. Ele pot crește sau micșora în mod dinamic în funcție de dimensiunea datelor, asigurând performanțe optime chiar și cu cerințele crescânde de date.Proiectarea algoritmului:Structurile de date sunt cruciale în proiectarea și analiza algoritmilor. Acestea oferă structura de bază și operațiunile necesare pentru implementarea diverșilor algoritmi și rezolvarea problemelor complexe.

1) Matrice:

O matrice este o structură de date de bază și adesea folosită în contextul structurilor de date Java. Oferă o metodă de stocare a unei colecții de dimensiuni fixe de componente de tip identic. Deoarece oferă acces rapid și ușor la elemente în funcție de indexul lor, matricele sunt un instrument crucial pentru gestionarea și organizarea datelor.

Avantaje:

    Organizarea datelor:Matricele oferă o modalitate structurată de stocare și organizare a elementelor, îmbunătățind gestionarea datelor.Acces aleatoriu:Elementele pot fi accesate direct folosind indexul lor, permițând recuperarea și modificarea eficientă.Marime fixa:Matricele au o dimensiune predeterminată, permițând alocarea eficientă a memoriei.Elemente omogene:Array-urile stochează elemente de același tip, asigurând consistența datelor și simplificând operațiunile.Repetare:Matricele acceptă o iterație ușoară prin elemente, facilitând traversarea și procesarea.Sortare și căutare:Matricele funcționează bine cu algoritmii de sortare și căutare, oferind operațiuni eficiente.Eficiența memoriei:Matricele optimizează utilizarea memoriei prin stocarea elementelor în regiuni adiacente.Compatibilitate:Matricele sunt acceptate pe scară largă în Java, făcându-le compatibile cu diverse cadre și instrumente.

Dezavantaje:

    Marime fixa:Matricele nu pot fi redimensionate dinamic, necesitând recreare pentru modificări de dimensiune.Pierderea memoriei:Elementele neutilizate din matrice mai mari pot duce la pierderea memoriei.Inserare și ștergere de deasupra:Inserarea sau ștergerea elementelor în mijlocul unei matrice necesită deplasarea elementelor ulterioare, ceea ce duce la ineficiență.Lipsa de flexibilitate:Matricele au tipuri de date rigide și nu pot găzdui diferite tipuri de date fără matrice sau structuri de date suplimentare.

Functii:

    Crearea unei matrice:Declarați și inițializați o matrice cu o anumită dimensiune folosind tipul de matrice și noul cuvânt cheie.Accesarea elementelor:Utilizați indexul pentru a accesa elemente individuale din matrice.Modificarea elementelor:Actualizați valoarea unui element prin alocarea unei noi valori unui anumit index din matrice.Lungimea găsirii:Utilizați atributul length pentru a determina lungimea matricei.Iterarea prin matrice:Utilizați bucle pentru a parcurge fiecare element din matrice și executați

Implementare:

Nume de fișier: 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 în Java este o structură de date dinamică care permite stocarea și manipularea elementelor. Face parte din cadrul Java Collections Framework și este implementat folosind o matrice intern.

Avantaje:

    Dimensiune dinamică:Spre deosebire de matrice, ArrayLists pot crește sau micșora în mod dinamic dimensiunea pe măsură ce elementele sunt adăugate sau eliminate. Elimină necesitatea redimensionării manuale și permite gestionarea convenabilă a cantităților variate de date.Manipulare ușoară a elementelor:ArrayLists oferă metode pentru a adăuga, elimina și modifica elemente în orice poziție din listă. Flexibilitatea sa simplifică operațiunile comune, cum ar fi inserarea, ștergerea și actualizarea, făcând manipularea elementelor mai eficientă.Acces aleatoriu:ArrayLists acceptă acces aleatoriu la elemente folosind indexul lor, permițând preluarea și modificarea rapidă a elementelor în anumite poziții din listă. Facilitează accesul eficient la elemente și îmbunătățește performanța generală.Compatibilitate cu Java Collection Framework:ArrayLists implementează interfața List, făcându-le compatibile cu alte clase Collection din cadrul Java Collections Framework. Compatibilitatea sa permite integrarea perfectă cu diverși algoritmi și operațiuni furnizate de cadru.

Dezavantaje:

    O suprasolicitare de memorie mai mare:ArrayLists necesită memorie suplimentară pentru a-și menține structura internă, rezultând o supraîncărcare a memoriei mai mare în comparație cu matricele. Poate fi o îngrijorare atunci când aveți de-a face cu colecții mari de elemente.Inserare și ștergere mai lentă:Inserarea sau ștergerea elementelor în mijlocul unui ArrayList necesită deplasarea elementelor, ceea ce poate consuma mult timp pentru liste mari. În scenariile în care sunt așteptate operațiuni frecvente de inserare sau ștergere, alte structuri de date precum LinkedList pot oferi performanțe mai bune.Performanță limitată pentru căutare:Căutarea unui element într-o ArrayList nesortată necesită iterarea elementelor până când este găsită o potrivire. Este o abordare de căutare liniară care are ca rezultat o performanță de căutare mai lentă în comparație cu structurile de date optimizate pentru căutare, cum ar fi HashSet sau TreeMap.Fără suport de tip primitiv:ArrayLists pot stoca doar obiecte și nu acceptă direct tipuri de date primitive precum int sau char. Pentru a stoca tipurile primitive, trebuie folosite clase de wrapper precum Integer sau Character, ceea ce duce la un potențial autoboxing și unboxing overhead.

Functii:

constructor de corzi
    Crearea unei ArrayList:Declarați și inițializați un ArrayList folosind clasa ArrayList și specificați tipul elementului în paranteze unghiulare.Adăugarea de elemente:Utilizați metoda add pentru a adăuga elemente la sfârșitul ArrayList.Accesarea elementelor:Utilizați tehnica obține pentru a prelua prețul detaliului la un index selectat.Modificarea elementelor:Actualizați costul detaliilor la un index specific pentru utilizarea abordării setate.Găsire dimensiune:Utilizați metoda dimensiunilor pentru a obține cantitatea de vârf de factori din ArrayList.Îndepărtarea elementelor:Utilizați abordarea de eliminare pentru a șterge un detaliu la un index specific sau prin furnizarea de referință la obiect.Iterarea prin ArrayList:Folosiți bucle pentru a repeta peste fiecare element din ArrayList și pentru a efectua operații asupra lor.

Implementare:

Nume de fișier: 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); } } } 

Ieșire:

 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) Lista legată:

O listă legată este o structură de date liniară în care elementele sunt stocate în obiecte separate numite noduri. O legătură de referință către următorul nod din secvență este inclusă în elementul de date al fiecărui nod. Nodul final al listei se leagă la null, indicând faptul că lista s-a încheiat.

conversia șirului în json în java

Spre deosebire de matrice, listele legate nu necesită alocarea de memorie contigue. Fiecare nod dintr-o listă legată poate fi alocat independent, permițând alocarea dinamică a memoriei și operațiuni eficiente de inserare și ștergere.

Avantaje:

    Dimensiune dinamică:LinkedList poate crește sau micșora dinamic, făcându-l potrivit pentru dimensiuni variate sau necunoscute de date.Inserare și ștergere eficientă:Inserarea sau ștergerea elementelor într-o Lista LinkedList este eficientă, deoarece nu necesită elemente de deplasare.Fără cerință de memorie contiguă:LinkedList nu are nevoie de alocare de memorie contiguă, ceea ce îl face flexibil și potrivit pentru situații de memorie imprevizibile.Modificare usoara:LinkedList permite modificarea ușoară a elementelor prin schimbarea indicatorilor de referință, permițând o manipulare eficientă.

Dezavantaje:

    Acces aleator mai lent:LinkedList are acces aleator mai lent, deoarece necesită parcurgerea listei pentru a accesa elemente prin index.Creșterea supraîncărcării memoriei:LinkedList necesită memorie suplimentară pentru referințe și noduri, crescând supraîncărcarea de memorie în comparație cu matricele.Căutare ineficientă:LinkedList are operații de căutare mai lente, necesitând o iterație secvențială pentru a găsi anumite elemente.

Functii:

    Crearea unei liste LinkedList:Declarați și inițializați o listă LinkedList folosind clasa LinkedList.Adăugarea de elemente:Utilizați metoda add pentru a adăuga elemente la sfârșitul LinkedList.Accesarea elementelor:Utilizați metoda get pentru a prelua valoarea unui element la un anumit index.Modificarea elementelor:Actualizați valoarea unui element la un anumit index folosind metoda set.Îndepărtarea elementelor:Utilizați metoda remove pentru a șterge un element de la un index specific sau furnizând referința obiectului.

Implementare:

Nume de fișier: 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); } } 

Ieșire:

 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) Stiva:

Principiul Last-In-First-Out (LIFO) dictează că elementul care a fost introdus cel mai recent este și elementul care este eliminat primul. O stivă este o structură de date liniară care urmează această regulă. Folosește comenzile „push” și „pop” pentru a adăuga elemente la stivă și, în consecință, pentru a elimina elementul de sus din stivă. Tehnica „peek” permite în plus accesul la elementul superior fără a-l îndepărta.

Caracteristicile unei stive:

    Comportament LIFO:Ultimul element împins pe stivă este primul care este scos, făcându-l potrivit pentru aplicații în care ordinea de inserare și îndepărtare este importantă.Acces limitat:Stivele oferă de obicei acces restricționat la elemente. Puteți accesa doar elementul de sus, iar pentru a ajunge la alte elemente, trebuie să puneți elementele deasupra lor.Dimensiune dinamica:Stivele pot fi implementate folosind matrice sau liste legate, permițând o dimensiune dinamică. Ele pot crește sau micșora după cum este necesar în timpul rulării.

Avantaje:

    Simplitate:Stivele sunt ușor de înțeles și de implementat.Eficienţă:Operațiile de inserare și ștergere au o complexitate de timp de O(1).Gestionarea apelurilor de funcție:Stivele gestionează eficient apelurile de funcții și stocarea variabilelor.Funcționalitatea Anulare/Refacere:Stivele permit operațiunile de anulare și refacere în aplicații.

Dezavantaje:

    Acces limitat:Accesul la elemente este limitat la partea de sus a stivei.Restricții de dimensiune:Stivele pot avea limitări de dimensiune în funcție de implementare.Nu este potrivit pentru toate scenariile:Stivele sunt specifice comportamentului LIFO și pot să nu fie adecvate în alte cazuri.

Implementare:

Nume de fișier: 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); } } } 

Ieșire:

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

5) coadă:

O coadă este o structură de date liniară în Java care urmează principiul First-In-First-Out (FIFO). Reprezintă o colecție de elemente în care elementele sunt introduse în spate și îndepărtate din față.

Caracteristici:

    coadă:Adăugarea unui element în spatele cozii.Scoateți la coadă:Eliminarea unui element din partea din față a cozii.Arunca o privire:Preluați elementul din partea din față a cozii fără a-l îndepărta.Mărimea:Determinarea numărului de elemente din coadă.Cec gol:Se verifică dacă coada este goală.

Avantaje:

    Comportament FIFO:Elementele sunt prelucrate în ordinea inserării lor, asigurând păstrarea secvenței originale.Introducere și îndepărtare eficiente:Adăugarea și eliminarea elementelor dintr-o coadă este rapidă și are o complexitate constantă în timp de O(1).Sincronizare:Java oferă implementări de cozi sincronizate, făcându-le sigure pentru programarea concomitentă.Interfață standardizată:Interfața Queue în Java oferă un set comun de metode, permițând interschimbabilitatea ușoară între diferite implementări de coadă.

Dezavantaje:

    Fără acces aleatoriu:Cozile nu acceptă acces direct la elementele din mijloc. Accesarea unor poziții specifice necesită scoaterea din coadă a elementelor precedente.Dimensiune limitata:Unele implementări de coadă au o dimensiune sau o capacitate fixă, ceea ce duce la depășire sau excepții la depășirea dimensiunii maxime.Căutare ineficientă:Căutarea unui element într-o coadă necesită scoaterea din coadă până când se găsește o potrivire, rezultând o căutare liniară cu o complexitate de timp potențial mare.

Implementare:

Nume de fișier: 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); } } } 

Ieșire:

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

6) HashMap:

Un HashMap este o structură de date în Java care oferă o modalitate de a stoca și de a prelua perechi cheie-valoare. Face parte din cadrul Java Collections Framework și este implementat pe baza structurii de date a tabelului hash.

Functii:

    pune(cheie, valoare):Inserează perechea cheie-valoare specificată în HashMap.obține (cheie):Preia valoarea asociată cheii specificate.containsKey(cheie):Verifică dacă HashMap conține cheia specificată.conţineValoare(valoare):Verifică dacă HashMap conține valoarea specificată.elimina (cheie):Elimină perechea cheie-valoare asociată cu cheia specificată din HashMap.mărimea():Returnează numărul de perechi cheie-valoare din HashMap.este gol():Verifică dacă HashMap este gol.keySet():Returnează un set care conține toate cheile din HashMap.valori():Returnează o colecție care conține toate valorile din HashMap.clar():Elimină toate perechile cheie-valoare din HashMap.

Avantaje:

    Recuperare eficientă:HashMap oferă regăsire rapidă a valorilor bazate pe chei cu complexitate în timp constant O(1).Împerecherea cheie-valoare flexibilă:HashMap permite orice obiect non-null ca cheie, permițând chei personalizate pentru stocarea și preluarea datelor.Dimensiune dinamică:HashMap poate crește sau micșora în mod dinamic dimensiunea pentru a gestiona cantități variate de date.Compatibilitate cu Java Collections Framework:HashMap implementează interfața Map, permițând integrarea perfectă cu alte clase Collection.

Dezavantaje:

    Lipsa comenzii:HashMap nu păstrează ordinea elementelor. Utilizați LinkedHashMap sau TreeMap pentru cerințe specifice de comandă.Creșterea supraîncărcării memoriei:HashMap necesită memorie suplimentară pentru codurile hash și structura internă în comparație cu structurile de date mai simple.Iterație mai lentă:Iterarea peste un HashMap poate fi mai lentă în comparație cu matricele sau listele din cauza traversării tabelului hash de bază.

Implementare:

Nume de fișier: 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()); } } 

Ieșire:

 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 este o structură de date în Java care implementează interfața Set și stochează elemente într-un tabel hash.

Caracteristici:

    Stochează elemente unice:HashSet nu permite elemente duplicate. Fiecare element din HashSet este unic.Utilizează căutarea bazată pe hash:HashSet folosește valoarea hash a fiecărui element pentru a-și determina locația de stocare, oferind o recuperare eficientă a elementului.Colecție necomandată:Elementele dintr-un HashSet nu sunt stocate într-o anumită ordine. Ordinea elementelor se poate schimba în timp.

Avantaje:

    Căutare rapidă a elementelor:HashSet oferă operații rapide de căutare, ceea ce face eficientă verificarea dacă un element există în set.Fără elemente duplicat:HashSet gestionează automat elementele duplicate și se asigură că fiecare element este unic.Integrare cu Java Collections Framework:HashSet implementează interfața Set, făcând-o compatibilă cu alte clase de colecții din cadrul Java Collections Framework.

Dezavantaje:

metoda string în java
    Fără comandă garantată:HashSet nu menține ordinea elementelor. Dacă ordinea elementelor este importantă, HashSet nu este potrivit.Fără indexare:HashSet nu oferă indexare directă sau acces pozițional la elemente. Pentru a accesa elemente, trebuie să iterați setul.O suprasarcină de memorie mai mare:HashSet necesită memorie suplimentară pentru a stoca valori hash și pentru a menține structura tabelului hash, rezultând o utilizare mai mare a memoriei în comparație cu alte structuri de date.

Implementare:

Nume de fișier: 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()); } } 

Ieșire:

 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 este o implementare a interfeței SortedSet în Java care utilizează un arbore de căutare binar cu auto-echilibrare numit arbore roșu-negru pentru a stoca elementele în ordine sortată.

Avantaje:

    Ordine sortată:TreeSet menține automat elementele într-o ordine sortată pe baza ordonării lor naturale sau a unui comparator personalizat. Permite căutarea și preluarea eficientă a elementelor în ordine crescătoare sau descrescătoare.Fără elemente duplicate:TreeSet nu permite elemente duplicate. Se asigură că fiecare element din set este unic, ceea ce poate fi util în scenariile în care valorile duplicate ar trebui evitate.Operațiuni eficiente:TreeSet oferă operațiuni eficiente precum inserarea, ștergerea și căutarea. Aceste operații au o complexitate în timp de O(log n), unde n este numărul de elemente din mulțime.Operații cu set navigabil:TreeSet oferă metode de navigare suplimentare, cum ar fi higher(), lower(), ceiling() și floor(), care vă permit să găsiți elemente care sunt mai mari decât, mai mici sau egale cu o anumită valoare.

Dezavantaje:

    deasupra capului:TreeSet necesită memorie suplimentară pentru a stoca structura internă a datelor, ceea ce poate duce la o supraîncărcare a memoriei mai mare în comparație cu alte implementări ale setului.Introducere și îndepărtare mai lentă:Operațiunile de inserare și eliminare în TreeSet implică menținerea ordinii sortate a elementelor, ceea ce poate necesita restructurarea arborelui. Poate face aceste operațiuni puțin mai lente în comparație cu HashSet sau LinkedHashSet.Personalizare limitată:TreeSet este conceput în primul rând pentru o comandă naturală sau un singur comparator personalizat. Poate avea nevoie de mai multă flexibilitate pentru mai multe criterii de sortare sau pentru o logică complexă de sortare.

Functii:

    adauga (element):Adaugă un element la TreeSet menținând ordinea sortată.elimina (element):Îndepărtează elementul specificat din TreeSet.conţine(element):Verifică dacă TreeSet conține elementul specificat.mărimea():Returnează numărul de elemente din TreeSet.primul():Returnează primul (cel mai mic) element din TreeSet.ultimul():Returnează ultimul (cel mai înalt) element din TreeSet.superior(element):Returnează cel mai mic element din TreeSet care este strict mai mare decât elementul dat.inferior(element):Returnează cel mai mare element din TreeSet care este strict mai mic decât elementul dat.

Implementare:

Nume de fișier: 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); } } } 

Ieșire:

 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) Harta arborelui:

TreeMap este o clasă în Java care implementează interfața Map și oferă o mapare cheie-valoare sortată pe baza ordinii naturale a cheilor sau a unui comparator personalizat.

Avantaje:

    Comandă sortată:TreeMap menține cheile în ordine sortată, ceea ce permite o căutare eficientă, regăsire și operațiuni bazate pe intervale.Maparea cheie-valoare:TreeMap stochează perechi cheie-valoare, permițând căutarea și preluarea eficientă a valorilor pe baza cheilor asociate.Implementarea arborelui roșu-negru:TreeMap folosește un arbore de căutare binar echilibrat (Red-Black Tree) intern, asigurând performanță eficientă chiar și pentru seturi mari de date.Suport pentru comparatoare personalizate:TreeMap permite utilizarea comparatoarelor personalizate pentru a defini ordinea de sortare a cheilor, oferind flexibilitate în criteriile de sortare.

Dezavantaje:

    Depanare de memorie:TreeMap necesită memorie suplimentară pentru a stoca structura arborescentă internă și obiectele asociate, ceea ce duce la o utilizare mai mare a memoriei în comparație cu structurile de date mai simple precum HashMap.Inserare și ștergere mai lentă:Operațiunile de inserare și ștergere în TreeMap au o complexitate de timp de O(log n) datorită necesității de restructurare a arborelui, făcându-le mai lente în comparație cu HashMap sau LinkedHashMap.Performanță limitată pentru datele nesortate:TreeMap funcționează eficient pentru datele sortate, dar performanța sa se poate degrada atunci când se ocupă cu date nesortate sau cu modificări frecvente, deoarece necesită menținerea ordinii sortate.

Functii:

    pune(cheie, valoare):Inserează o pereche cheie-valoare în TreeMap.obține (cheie):Preia valoarea asociată cheii specificate.containsKey(cheie):Verifică dacă TreeMap conține o cheie specifică.elimina (cheie):Elimină perechea cheie-valoare asociată cu cheia specificată.mărimea():Returnează numărul de perechi cheie-valoare din TreeMap.keySet():Returnează un set de toate cheile din TreeMap.valori():Returnează o colecție a tuturor valorilor din TreeMap.entrySet():Returnează un set de perechi cheie-valoare în TreeMap.

Implementare:

Nume de fișier: 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); } } } 

Ieșire:

 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) Grafic:

Graficele sunt structuri de date care reprezintă o colecție de noduri sau vârfuri interconectate. Ele sunt compuse din vârfuri și muchii, unde vârfurile reprezintă entități și muchiile reprezintă relațiile dintre acele entități.

Avantaje:

    Versatilitate:Graficele pot reprezenta o gamă largă de scenarii din lumea reală, făcându-le potrivite pentru diverse aplicații, cum ar fi rețelele sociale, sistemele de transport și rețelele de calculatoare.Reprezentarea relației:Graficele oferă o modalitate naturală de a reprezenta relațiile și conexiunile dintre entități, permițând analiza și parcurgerea eficientă a acestor relații.Căutare și traversare eficiente:Algoritmii grafici precum căutarea pe lățimea întâi (BFS) și căutarea pe adâncimea întâi (DFS) permit parcurgerea și căutarea eficientă a vârfurilor și marginilor graficului.Modelarea relațiilor complexe:Graficele pot modela relații complexe, inclusiv structuri ierarhice, dependențe ciclice și conexiuni multiple între entități.

Dezavantaje:

    Complexitatea spațiului:Graficele pot consuma o cantitate semnificativă de memorie, în special graficele la scară mare cu multe vârfuri și muchii.Complexitatea operațiunilor:Anumite operațiuni grafice, cum ar fi găsirea celei mai scurte căi sau detectarea ciclurilor, pot avea o complexitate mare în timp, în special în graficele dense.Dificultate în întreținere:Modificarea sau actualizarea unui grafic poate fi complexă, deoarece modificările în structura graficului pot afecta conectivitatea acestuia și algoritmii existenți.

Implementare:

Nume de fișier: 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) Arborele:

Un arbore este o structură de date utilizată pe scară largă în informatică, care reprezintă o structură ierarhică. Este format din noduri conectate prin muchii, unde fiecare nod poate avea zero sau mai multe noduri copil.

Avantaje:

    Structura ierarhica:Arborii oferă o modalitate naturală de a reprezenta relații ierarhice, cum ar fi sisteme de fișiere, organigrame sau documente HTML/XML.Căutare eficientă:Arborii binari de căutare permit căutarea eficientă cu o complexitate de timp de O(log n), făcându-le potrivite pentru stocarea și preluarea datelor sortate.Inserare și ștergere rapidă:Structurile de date arbore oferă operații eficiente de inserare și ștergere, mai ales atunci când sunt echilibrate, cum ar fi arborii AVL sau arborii roșu-negru.Iterație comandată:Parcurgerea în ordine a unui arbore de căutare binar oferă elemente într-o ordine sortată, ceea ce este util pentru sarcini precum tipărirea elementelor în ordine sortată sau găsirea elementului următor/anterior.

Dezavantaje:

comparați cu șirurile din java
    Overhead de memorie mare:Arborii necesită memorie suplimentară pentru a stoca referințe sau pointeri de noduri, ceea ce poate duce la o utilizare mai mare a memoriei în comparație cu structurile de date liniare, cum ar fi matrice sau liste.Implementare complexă:Implementarea și menținerea unei structuri de date arborescente poate fi mai complexă în comparație cu alte structuri de date, cum ar fi matrice sau liste, în special pentru variantele arborescente echilibrate.Operațiuni limitate:Unele variante de arbore, cum ar fi arborii binari de căutare, nu acceptă operații eficiente, cum ar fi găsirea celui mai mic element al k-lea sau găsirea rangului unui element.

Functii:

    Inserare:Adăugați un nou nod în arbore.Ștergere:Eliminați un nod din arbore.Căutare:Găsiți un anumit nod sau element în arbore.Traversare:Traversați arborele în diferite ordine, cum ar fi în ordine, pre-comanda sau post-comanda.Înălțime/adâncime:Calculați înălțimea sau adâncimea copacului.Echilibru:Asigurați-vă că arborele rămâne echilibrat pentru a menține operațiuni eficiente.

Implementare:

Nume de fișier: 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)>