logo

Estructures de dades en Java

Les nombroses maneres en què les dades es poden organitzar, desar i manejar dins d'un programa informàtic s'anomenen estructures de dades a Java. Aquestes estructures ofereixen un mètode metòdic per manejar i gestionar dades de manera eficaç, permetent operacions útils com la inserció, la supressió, la recuperació i el recorregut.

L'article explorarà tot allò relacionat amb les estructures de dades a Java i ajudarà els principiants a entendre-ho de manera fàcil i eficaç.

  • Què és Java?
  • Què són les estructures de dades a Java?
  • Tipus d'estructures de dades en Java
  • Avantatges de les estructures de dades a Java
  • Classificació de les estructures de dades
  • Preguntes freqüents sobre estructures de dades a Java

Què és Java?

Java és un popular llenguatge de programació orientat a objectes conegut per la seva àmplia biblioteca estàndard i la seva llibertat de plataforma. Ofereix una arquitectura sòlida per crear programes que s'executen sense recompilació en diverses plataformes. La coneguda biblioteca de Java té una selecció de sistemes de registres que fan que sigui viable tractar amb eficàcia nombrosos tipus de dades.

Què són les estructures de dades a Java?

La forma en què s'organitzen i s'emmagatzemen les dades a la memòria d'un programa informàtic depèn estretament de les estructures de registres de Java. La coneguda biblioteca de Java inclou un tipus important d'estructures estadístiques incorporades. Alguns dels sistemes de registre que permeten als programadors maneres breus i senzilles de desar i organitzar les dades inclouen llistes connectades, piles, cues i matrius. Els desenvolupadors poden realitzar ràpidament operacions com la inserció, la supressió, la cerca i l'ordenació, ja que ofereixen una sèrie de mecanismes per accedir a les dades, modificar-les i gestionar-les. Els programadors de Java poden reduir l'ús de memòria i augmentar considerablement l'eficiència global dels seus programes utilitzant aquestes estructures de dades.

Tipus d'estructures de dades en Java

La llista d'estructures de dades en Java es mostra a continuació

  1. Arrays
  2. ArrayList
  3. LinkedList
  4. Pila
  5. Cua
  6. HashMap
  7. HashSet
  8. Conjunt d'arbres
  9. TreeMap
  10. Gràfic
  11. Arbre

El diagrama següent explica clarament els tipus d'estructures de dades a Java molt clarament.

Estructures de dades en Java

Classificació addicional dels tipus d'estructures de dades:

Hi ha dos tipus d'estructures de dades: -

  1. Estructures de dades primitives
  2. Estructures de dades no primitives

1) Estructures de dades primitives: També coneguts com a tipus de dades primitius, són tipus de dades bàsics integrats a Java. Inclouen:

    Byte:Emmagatzema números sencers del -128 al 127.curt:Emmagatzema números sencers de -32.768 a 32.767.int:Emmagatzema números sencers de -2.147.483.648 a 2.147.483.647.flotar:Emmagatzema números de coma flotant amb una precisió única.char:Emmagatzema personatges individuals.booleà:Emmagatzema valors vertaders o falsos.llarg:Emmagatzema grans números sencers.Doble:Emmagatzema números de factor flotant amb doble precisió.

2) Estructures de dades no primitives: Les estructures de registres no primitives són més complexes i es componen de classes d'informació primitives. A més, es poden classificar en dos tipus:

    Estructures de dades lineals:En les estructures de dades lineals, els elements estan disposats de manera lineal o seqüencial. Alguns exemples inclouen:
      Matrius:Un grup d'elements de tipus idèntic col·locats en una matriu segons una disposició predeterminada.Piles:Una estructura Last-In-First-Out (LIFO) en la qual només es poden afegir o eliminar els elements superiors.Cues:Les estructures First-In-First-Out (FIFO) s'utilitzen a les cues, on els articles s'insereixen al retornat i es treuen al davant.Llista enllaçada:Una llista relacionada inclou una col·lecció de gadgets anomenats nodes, cadascun dels quals té una referència al node posterior i estadístiques dins d'ell.
    Estructures de dades no lineals:En estructures de dades no lineals, els elements estan disposats de manera no seqüencial. Alguns exemples inclouen:
      Arbres:Els arbres són un tipus d'estructura jeràrquica basada en nodes, amb un node arrel a la part superior i nodes fills que s'hi ramifiquen. Els exemples inclouen arbres vermell-negre, arbres AVL, arbres de cerca binaris i arbres binaris.Gràfics:Un conjunt de nodes enllaçats mitjançant l'ús d'arestes, on els nodes poden tenir qualsevol quantitat de connexions. Els gràfics s'utilitzen per simbolitzar relacions complexes entre elements.Munt:Una estructura especialitzada basada en un arbre en què cada node determinat té un valor més o menor que els seus fills, depenent de si és o no un munt màxim o un munt mínim.Hash:Estructures de dades que utilitzen una funció hash per assignar claus a valors. Els exemples consisteixen en conjunts hash i mapes hash, que proporcionen la recuperació verda i l'emmagatzematge d'estadístiques basades en claus precises.
Estructures de dades en Java

Avantatges de les estructures de dades en Java

    Organització de dades eficient:Les estructures de dades proporcionen maneres organitzades d'emmagatzemar i gestionar dades, permetent operacions d'accés, manipulació i recuperació eficients. Optimitzen l'ús de la memòria i faciliten una execució més ràpida dels algorismes.Millor rendiment:Els desenvolupadors poden millorar el rendiment en termes de velocitat i utilització de la memòria seleccionant l'estructura de dades adequada per a una activitat concreta. El rendiment s'optimitza perquè es fan estructures de dades específiques per sobresortir en accions concretes com cercar, ordenar o inserir informació.Reutilitzabilitat del codi:Java ofereix una àmplia gamma d'estructures de dades integrades que són senzilles d'utilitzar per als programadors. Aquestes estructures de dades reutilitzables estalvien temps i esforç eliminant la necessitat de crear algorismes sofisticats des de zero.Simplicitat del codi:Les estructures de dades fan que la implementació de processos complicats sigui més senzill de codificar. Ofereixen abstraccions d'alt nivell i encapsulen les especificitats de la gestió de dades, cosa que millora la llegibilitat, el manteniment i la claredat del codi.Flexibilitat i adaptabilitat:Les estructures de dades ofereixen flexibilitat per gestionar diferents tipus i mides de dades. Es poden ajustar dinàmicament per adaptar-se als requisits de dades canviants i proporcionar mecanismes per a una manipulació eficient de les dades.Estandarditzat i ben provat:La biblioteca estàndard per a Java conté estructures de dades integrades que s'han sotmès a proves i optimitzacions importants, que garanteixen la seva fiabilitat i rendiment. L'ús d'aquestes estructures de dades comunes redueix la possibilitat d'errors i ofereix al desenvolupament d'aplicacions una base sòlida.Escalabilitat:Les estructures de dades proporcionen opcions d'escalabilitat, permetent que les aplicacions gestionen grans volums de dades de manera eficient. Poden créixer o reduir-se de manera dinàmica en funció de la mida de les dades, garantint un rendiment òptim fins i tot amb una demanda creixent de dades.Disseny d'algoritmes:Les estructures de dades són crucials en el disseny i l'anàlisi d'algorismes. Proporcionen l'estructura i les operacions subjacents necessàries per implementar diversos algorismes i resoldre problemes complexos.

1) Matrius:

Una matriu és una estructura de dades bàsica i utilitzada sovint en el context de les estructures de dades de Java. Ofereix un mètode per emmagatzemar una col·lecció de mida fixa de components de tipus idèntic. Com que proporcionen un accés ràpid i fàcil als elements en funció del seu índex, les matrius són una eina crucial per gestionar i organitzar les dades.

Avantatges:

    Organització de dades:Les matrius proporcionen una manera estructurada d'emmagatzemar i organitzar elements, millorant la gestió de les dades.Accés aleatori:Es pot accedir als elements directament mitjançant el seu índex, la qual cosa permet una recuperació i modificació eficients.Mida fixa:Les matrius tenen una mida predeterminada, cosa que permet una assignació eficient de memòria.Elements homogenis:Les matrius emmagatzemen elements del mateix tipus, garantint la coherència de les dades i simplificant les operacions.Iteració:Les matrius admeten una fàcil iteració a través dels elements, facilitant el recorregut i el processament.Classificació i cerca:Les matrius funcionen bé amb algorismes d'ordenació i cerca, oferint operacions eficients.Eficiència de memòria:Les matrius optimitzen l'ús de la memòria emmagatzemant elements en regions contigües.Compatibilitat:Les matrius són àmpliament compatibles amb Java, cosa que els fa compatibles amb diversos marcs i eines.

Desavantatges:

    Mida fixa:Les matrius no es poden canviar de mida dinàmicament, la qual cosa requereix recreació per als canvis de mida.Malbaratament de memòria:Els elements no utilitzats en matrius més grans poden provocar un malbaratament de memòria.Sobrecàrrec d'inserció i supressió:La inserció o la supressió d'elements al mig d'una matriu requereix el canvi d'elements posteriors, la qual cosa comporta una ineficiència.Falta de flexibilitat:Les matrius tenen tipus de dades rígids i no poden acomodar diferents tipus de dades sense matrius o estructures de dades addicionals.

Funcions:

    Creació d'una matriu:Declarar i inicialitzar una matriu amb una mida específica utilitzant el tipus de matriu i la paraula clau nova.Elements d'accés:Utilitzeu l'índex per accedir a elements individuals de la matriu.Elements de modificació:Actualitzeu el valor d'un element assignant un valor nou a un índex específic de la matriu.Longitud de recerca:Utilitzeu l'atribut length per determinar la longitud de la matriu.Iterant a través de la matriu:Utilitzeu bucles per recórrer cada element de la matriu i executar

Implementació:

Nom de l'arxiu: 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 en Java és una estructura de dades dinàmica que permet l'emmagatzematge i la manipulació d'elements. Forma part del Java Collections Framework i s'implementa mitjançant una matriu internament.

Avantatges:

    Mida dinàmica:A diferència de les matrius, les ArrayLists poden créixer o reduir-se de forma dinàmica a mesura que s'afegeixen o s'eliminen elements. Elimina la necessitat de redimensionar manualment i permet manejar diverses quantitats de dades de manera còmoda.Fàcil manipulació d'elements:ArrayLists ofereix mètodes per afegir, eliminar i modificar elements en qualsevol posició de la llista. La seva flexibilitat simplifica les operacions habituals com ara la inserció, la supressió i l'actualització, fent que la manipulació d'elements sigui més eficient.Accés aleatori:ArrayLists admeten l'accés aleatori als elements mitjançant el seu índex, permetent la recuperació ràpida i la modificació d'elements en posicions específiques de la llista. Facilita l'accés eficient als elements i millora el rendiment general.Compatibilitat amb Java Collection Framework:Els ArrayLists implementen la interfície List, fent-los compatibles amb altres classes de col·lecció del Java Collections Framework. La seva compatibilitat permet una integració perfecta amb diversos algorismes i operacions proporcionades pel marc.

Desavantatges:

    Major sobrecàrrega de memòria:ArrayLists requereixen memòria addicional per mantenir la seva estructura interna, el que resulta en una sobrecàrrega de memòria més gran en comparació amb les matrius. Pot ser una preocupació quan es tracta de grans col·leccions d'elements.Inserció i eliminació més lenta:La inserció o la supressió d'elements al mig d'una ArrayList requereix el canvi d'elements, cosa que pot consumir molt de temps per a llistes grans. En escenaris on s'esperen operacions d'inserció o supressió freqüents, altres estructures de dades com LinkedList poden oferir un millor rendiment.Rendiment limitat per a la cerca:La cerca d'un element en una ArrayList sense ordenar requereix iterar sobre els elements fins que es trobi una coincidència. És un enfocament de cerca lineal que resulta en un rendiment de cerca més lent en comparació amb estructures de dades optimitzades per a la cerca, com ara HashSet o TreeMap.Sense suport de tipus primitiu:ArrayLists només poden emmagatzemar objectes i no admeten directament tipus de dades primitives com int o char. Per emmagatzemar tipus primitius, s'han d'utilitzar classes d'embolcall com Integer o Character, la qual cosa condueix a una possible sobrecàrrega d'autoboxing i unboxing.

Funcions:

elimina la memòria cau npm
    Creació d'una ArrayList:Declarar i inicialitzar una ArrayList utilitzant la classe ArrayList i especificar el tipus d'element entre claudàtors angulars.Afegir elements:Utilitzeu el mètode add per afegir elements al final de la ArrayList.Elements d'accés:Utilitzeu la tècnica d'obtenció per recuperar el preu del detall en un índex seleccionat.Elements de modificació:Actualitzeu el cost del detall en un índex específic per a l'ús de l'enfocament establert.Troba la mida:Utilitzeu el mètode de dimensions per obtenir la quantitat d'avantguarda de factors a ArrayList.Eliminació d'elements:Utilitzeu l'enfocament d'eliminació per eliminar un detall en un índex específic o proporcionant la referència de l'objecte.Iterant a través de la ArrayList:Utilitzeu bucles per iterar sobre cada element de la ArrayList i fer-hi operacions.

Implementació:

Nom de l'arxiu: 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); } } } 

Sortida:

 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) Llista enllaçada:

Una llista enllaçada és una estructura de dades lineal en la qual els elements s'emmagatzemen en objectes separats anomenats nodes. A l'element de dades de cada node s'inclou un enllaç de referència al següent node de la seqüència. El node final de la llista enllaça a null, indicant que la llista ha acabat.

A diferència de les matrius, les llistes enllaçades no requereixen assignació de memòria contigua. Cada node d'una llista enllaçada es pot assignar de manera independent, permetent una assignació de memòria dinàmica i operacions d'inserció i supressió eficients.

Avantatges:

    Mida dinàmica:LinkedList pot créixer o reduir-se dinàmicament, fent-lo adequat per a mides de dades variables o desconegudes.Inserció i eliminació eficients:La inserció o la supressió d'elements dins d'una LinkedList és eficient, ja que no requereix elements de desplaçament.Cap requisit de memòria contigua:LinkedList no necessita assignació de memòria contigua, el que el fa flexible i adequat per a situacions de memòria impredictibles.Modificació fàcil:LinkedList permet modificar fàcilment els elements canviant els punters de referència, permetent una manipulació eficient.

Desavantatges:

    Accés aleatori més lent:LinkedList té un accés aleatori més lent, ja que requereix recórrer la llista per accedir als elements per índex.Augment de la sobrecàrrega de memòria:LinkedList requereix memòria addicional per a referències i nodes, augmentant la sobrecàrrega de memòria en comparació amb les matrius.Cerca ineficient:LinkedList té operacions de cerca més lentes i requereixen una iteració seqüencial per trobar elements específics.

Funcions:

    Creació d'una llista enllaçada:Declarar i inicialitzar una LinkedList utilitzant la classe LinkedList.Afegir elements:Utilitzeu el mètode add per afegir elements al final de la LinkedList.Elements d'accés:Utilitzeu el mètode get per recuperar el valor d'un element en un índex específic.Elements de modificació:Actualitzeu el valor d'un element en un índex determinat mitjançant el mètode set.Eliminació d'elements:Utilitzeu el mètode remove per suprimir un element en un índex específic o proporcionant la referència de l'objecte.

Implementació:

Nom de l'arxiu: 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); } } 

Sortida:

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

El principi Last-In-First-Out (LIFO) dicta que l'element que s'ha inserit més recentment també és l'element que s'elimina primer. Una pila és una estructura de dades lineal que segueix aquesta regla. Utilitza les ordres 'push' i 'pop' per afegir elements a la pila i, en conseqüència, eliminar l'element superior de la pila. La tècnica 'peek' també permet l'accés a l'element superior sense eliminar-lo.

Característiques d'una pila:

quina mida és la pantalla del meu monitor
    Comportament LIFO:L'últim element empès a la pila és el primer que es treu, el que el fa adequat per a aplicacions on l'ordre d'inserció i retirada és important.Accés limitat:Les piles normalment proporcionen accés restringit als elements. Només podeu accedir a l'element superior i, per arribar a altres elements, heu de posar els elements per sobre d'ells.Mida dinàmica:Les piles es poden implementar mitjançant matrius o llistes enllaçades, permetent una mida dinàmica. Poden créixer o reduir-se segons sigui necessari durant el temps d'execució.

Avantatges:

    Senzillesa:Les piles són fàcils d'entendre i implementar.Eficiència:Les operacions d'inserció i supressió tenen una complexitat temporal de O(1).Gestió de trucades de funció:Les piles gestionen de manera eficient les trucades de funcions i l'emmagatzematge variable.Funcionalitat desfer/refer:Les piles permeten desfer i refer operacions a les aplicacions.

Desavantatges:

    Accés limitat:L'accés als elements està restringit a la part superior de la pila.Restriccions de mida:Les piles poden tenir limitacions de mida segons la implementació.No apte per a tots els escenaris:Les piles són específiques del comportament de LIFO i poden no ser adequades en altres casos.

Implementació:

Nom de l'arxiu: 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); } } } 

Sortida:

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

5) Cua:

Una cua és una estructura de dades lineal en Java que segueix el principi First-In-First-Out (FIFO). Representa una col·lecció d'elements on s'insereixen elements a la part posterior i s'eliminen de la part davantera.

Característiques:

    Cua:Afegeix un element a la part posterior de la cua.Treu la cua:Eliminació d'un element de la part davantera de la cua.Ullada:Recupereu l'element al capdavant de la cua sense treure'l.Mida:Determinació del nombre d'elements de la cua.Comprovació buida:Comprovant si la cua està buida.

Avantatges:

    Comportament FIFO:Els elements es processen en l'ordre de la seva inserció, assegurant la conservació de la seqüència original.Inserció i eliminació eficients:Afegir i eliminar elements d'una cua és ràpid i té una complexitat de temps constant de O(1).Sincronització:Java proporciona implementacions de cua sincronitzades, cosa que les fa segures per a la programació simultània.Interfície estandarditzada:La interfície Queue a Java ofereix un conjunt comú de mètodes, que permeten una fàcil intercanviabilitat entre diferents implementacions de la cua.

Desavantatges:

    Sense accés aleatori:Les cues no admeten l'accés directe als elements del mig. Per accedir a posicions específiques cal treure la cua dels elements anteriors.Talla limitada:Algunes implementacions de la cua tenen una mida o capacitat fixa, la qual cosa comporta desbordaments o excepcions en superar la mida màxima.Cerca ineficient:La cerca d'un element d'una cua requereix treure la cua fins que es trobi una coincidència, el que resulta en una cerca lineal amb una complexitat temporal potencialment elevada.

Implementació:

Nom de l'arxiu: 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); } } } 

Sortida:

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

6) HashMap:

Un HashMap és una estructura de dades en Java que proporciona una manera d'emmagatzemar i recuperar parells clau-valor. Forma part del Java Collections Framework i s'implementa a partir de l'estructura de dades de la taula hash.

Funcions:

    posar(clau, valor):Insereix la parella clau-valor especificada al HashMap.obtenir (clau):Recupera el valor associat a la clau especificada.contéClau(clau):Comprova si el HashMap conté la clau especificada.contéValor(valor):Comprova si el HashMap conté el valor especificat.eliminar (clau):Elimina el parell clau-valor associat a la clau especificada del HashMap.mida ():Retorna el nombre de parells clau-valor al HashMap.està buit():Comprova si el HashMap està buit.keySet():Retorna un conjunt que conté totes les claus del HashMap.valors ():Retorna una col·lecció que conté tots els valors del HashMap.clar ():Elimina tots els parells clau-valor del HashMap.

Avantatges:

    Recuperació eficient:HashMap proporciona una recuperació ràpida de valors basats en claus amb complexitat en temps constant O(1).Parellament clau-valor flexible:HashMap permet qualsevol objecte no nul com a clau, permetent claus personalitzades per emmagatzemar i recuperar dades.Mida dinàmica:HashMap pot créixer o reduir-se de forma dinàmica per gestionar quantitats variables de dades.Compatibilitat amb Java Collections Framework:HashMap implementa la interfície Map, que permet una integració perfecta amb altres classes de Col·lecció.

Desavantatges:

    Falta de comanda:HashMap no conserva l'ordre dels elements. Utilitzeu LinkedHashMap o TreeMap per a requisits específics de comanda.Augment de la sobrecàrrega de memòria:HashMap requereix memòria addicional per als codis hash i l'estructura interna en comparació amb estructures de dades més simples.Iteració més lenta:La iteració sobre un HashMap pot ser més lenta en comparació amb les matrius o llistes a causa de travessar la taula hash subjacent.

Implementació:

Nom de l'arxiu: 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()); } } 

Sortida:

 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 és una estructura de dades en Java que implementa la interfície Set i emmagatzema elements en una taula hash.

Característiques:

    Emmagatzema elements únics:HashSet no permet elements duplicats. Cada element del HashSet és únic.Utilitza la cerca basada en hash:HashSet utilitza el valor hash de cada element per determinar la seva ubicació d'emmagatzematge, proporcionant una recuperació eficient dels elements.Col·lecció no ordenada:Els elements d'un HashSet no s'emmagatzemen en un ordre específic. L'ordre dels elements pot canviar amb el temps.

Avantatges:

    Cerca ràpida d'elements:HashSet proporciona operacions de cerca ràpides, fent que sigui eficient comprovar si existeix un element al conjunt.No hi ha elements duplicats:HashSet gestiona automàticament els elements duplicats i assegura que cada element és únic.Integració amb Java Collections Framework:HashSet implementa la interfície Set, fent-la compatible amb altres classes de col·lecció del Java Collections Framework.

Desavantatges:

jpa a la primavera
    Sense comanda garantida:HashSet no manté l'ordre dels elements. Si l'ordre dels elements és important, HashSet no és adequat.Sense indexació:HashSet no proporciona indexació directa ni accés posicional als elements. Per accedir als elements, cal iterar sobre el conjunt.Major sobrecàrrega de memòria:HashSet requereix memòria addicional per emmagatzemar valors hash i mantenir l'estructura de la taula hash, el que resulta en un ús de memòria més elevat en comparació amb altres estructures de dades.

Implementació:

Nom de l'arxiu: 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()); } } 

Sortida:

 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) Conjunt d'arbres:

TreeSet és una implementació de la interfície SortedSet a Java que utilitza un arbre de cerca binari d'autoequilibri anomenat arbre vermell-negre per emmagatzemar elements ordenats.

Avantatges:

    Ordre ordenat:TreeSet manté automàticament els elements en un ordre ordenat segons el seu ordre natural o un comparador personalitzat. Permet una recerca i recuperació eficients d'elements en ordre ascendent o descendent.Sense elements duplicats:TreeSet no permet elements duplicats. Assegura que cada element del conjunt és únic, cosa que pot ser útil en escenaris on s'han d'evitar valors duplicats.Operacions eficients:TreeSet ofereix operacions eficients com la inserció, la supressió i la cerca. Aquestes operacions tenen una complexitat temporal de O(log n), on n és el nombre d'elements del conjunt.Operacions de conjunt navegable:TreeSet ofereix mètodes de navegació addicionals, com ara higher(), lower(), ceiling() i floor(), que us permeten trobar elements que siguin majors, menors o iguals a un valor determinat.

Desavantatges:

    Càrrec:TreeSet requereix memòria addicional per emmagatzemar l'estructura de dades interna, la qual cosa pot provocar una sobrecàrrega de memòria més alta en comparació amb altres implementacions del conjunt.Inserció i retirada més lenta:Les operacions d'inserció i eliminació a TreeSet impliquen mantenir l'ordre ordenat dels elements, cosa que pot requerir una reestructuració de l'arbre. Pot fer que aquestes operacions siguin lleugerament més lentes en comparació amb HashSet o LinkedHashSet.Personalització limitada:TreeSet està dissenyat principalment per a un ordre natural o un comparador personalitzat únic. Pot ser que necessiti més flexibilitat per a criteris d'ordenació múltiples o lògica d'ordenació complexa.

Funcions:

    afegir (element):Afegeix un element al TreeSet mantenint l'ordre ordenat.eliminar (element):Elimina l'element especificat del TreeSet.conté (element):Comprova si el TreeSet conté l'element especificat.mida ():Retorna el nombre d'elements del TreeSet.primer():Retorna el primer element (el més baix) del TreeSet.darrer ():Retorna l'últim element (el més alt) del TreeSet.superior (element):Retorna el mínim element del TreeSet que és estrictament més gran que l'element donat.inferior (element):Retorna l'element més gran del TreeSet que és estrictament inferior a l'element donat.

Implementació:

Nom de l'arxiu: 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); } } } 

Sortida:

 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) Mapa de l'arbre:

TreeMap és una classe de Java que implementa la interfície Map i proporciona una assignació de valors-clau ordenada basada en l'ordre natural de les claus o un comparador personalitzat.

Avantatges:

bash elif
    Ordre ordenat:TreeMap manté les claus en ordre ordenat, la qual cosa permet una cerca eficient, recuperació i operacions basades en intervals.Mapatge clau-valor:TreeMap emmagatzema parells clau-valor, la qual cosa permet una cerca i recuperació eficients de valors en funció de les claus associades.Implementació de l'arbre vermell-negre:TreeMap utilitza un arbre de cerca binari equilibrat (arbre vermell-negre) internament, assegurant un rendiment eficient fins i tot per a grans conjunts de dades.Suport per a comparadors personalitzats:TreeMap permet l'ús de comparadors personalitzats per definir l'ordre d'ordenació de les claus, proporcionant flexibilitat en els criteris d'ordenació.

Desavantatges:

    Sobrecàrrega de memòria:TreeMap requereix memòria addicional per emmagatzemar l'estructura interna de l'arbre i els objectes associats, el que resulta en un ús de memòria més elevat en comparació amb estructures de dades més simples com HashMap.Inserció i eliminació més lenta:Les operacions d'inserció i supressió a TreeMap tenen una complexitat temporal de O(log n) a causa de la necessitat de reestructurar l'arbre, fent-les més lentes en comparació amb HashMap o LinkedHashMap.Rendiment limitat per a dades no ordenades:TreeMap funciona de manera eficient amb dades ordenades, però el seu rendiment pot degradar-se quan es tracta de dades no ordenades o modificacions freqüents, ja que requereix mantenir l'ordre ordenat.

Funcions:

    posar(clau, valor):Insereix un parell clau-valor al TreeMap.obtenir (clau):Recupera el valor associat a la clau especificada.contéClau(clau):Comprova si el TreeMap conté una clau específica.eliminar (clau):Elimina el parell clau-valor associat a la clau especificada.mida ():Retorna el nombre de parells clau-valor al TreeMap.keySet():Retorna un conjunt de totes les claus del TreeMap.valors ():Retorna una col·lecció de tots els valors del TreeMap.entrySet():Retorna un conjunt de parells clau-valor al TreeMap.

Implementació:

Nom de l'arxiu: 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); } } } 

Sortida:

 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) Gràfic:

Els gràfics són una estructura de dades que representa una col·lecció de nodes o vèrtexs interconnectats. Es componen de vèrtexs i arestes, on els vèrtexs representen entitats i les arestes representen les relacions entre aquestes entitats.

Avantatges:

    Versatilitat:Els gràfics poden representar una àmplia gamma d'escenaris del món real, fent-los adequats per a diverses aplicacions com ara xarxes socials, sistemes de transport i xarxes informàtiques.Representació de la relació:Els gràfics proporcionen una manera natural de representar les relacions i connexions entre entitats, permetent una anàlisi i un recorregut eficients d'aquestes relacions.Cerca i recorregut eficients:Els algorismes de gràfics com la cerca en amplitud (BFS) i la cerca en profunditat (DFS) permeten un recorregut i una cerca eficients dels vèrtexs i les vores del gràfic.Modelització de relacions complexes:Els gràfics poden modelar relacions complexes, incloses estructures jeràrquiques, dependències cícliques i connexions múltiples entre entitats.

Desavantatges:

    Complexitat espacial:Els gràfics poden consumir una quantitat important de memòria, especialment els gràfics a gran escala amb molts vèrtexs i arestes.La complexitat de les operacions:Algunes operacions de gràfics, com ara trobar el camí més curt o detectar cicles, poden tenir una gran complexitat temporal, especialment en gràfics densos.Dificultat en el manteniment:Modificar o actualitzar un gràfic pot ser complex, ja que els canvis en l'estructura del gràfic poden afectar la seva connectivitat i els algorismes existents.

Implementació:

Nom de l'arxiu: 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) Arbre:

Un arbre és una estructura de dades molt utilitzada en informàtica que representa una estructura jeràrquica. Consisteix en nodes connectats per arestes, on cada node pot tenir zero o més nodes fills.

Avantatges:

    Estructura jeràrquica:Els arbres proporcionen una manera natural de representar relacions jeràrquiques, com ara sistemes de fitxers, organigrames o documents HTML/XML.Cerca eficient:Els arbres de cerca binaris permeten una cerca eficient amb una complexitat temporal de O(log n), fent-los adequats per emmagatzemar i recuperar dades ordenades.Inserció i eliminació ràpides:Les estructures de dades d'arbre ofereixen operacions d'inserció i supressió eficients, especialment quan estan equilibrades, com ara arbres AVL o arbres vermell-negre.Iteració ordenada:El recorregut en ordre d'un arbre de cerca binari ofereix elements ordenats, cosa que és útil per a tasques com imprimir elements ordenats o trobar l'element següent/anterior.

Desavantatges:

    Sobrecàrrega de memòria alta:Els arbres requereixen memòria addicional per emmagatzemar referències o punters de nodes, cosa que pot provocar un ús de memòria més elevat en comparació amb estructures de dades lineals com ara matrius o llistes.Implementació complexa:Implementar i mantenir una estructura de dades d'arbre pot ser més complex en comparació amb altres estructures de dades com ara matrius o llistes, especialment per a variants d'arbre equilibrades.Operacions limitades:Algunes variants d'arbre, com els arbres de cerca binaris, no admeten operacions eficients com trobar el kèsim element més petit o trobar el rang d'un element.

Funcions:

    Inserció:Afegiu un nou node a l'arbre.Supressió:Elimina un node de l'arbre.Cerca:Trobeu un node o element específic a l'arbre.Travessia:Travessa l'arbre en diferents ordres, com ara en ordre, en comanda prèvia o en comanda posterior.Alçada/profunditat:Calcula l'alçada o la profunditat de l'arbre.Balanç:Assegureu-vos que l'arbre es mantingui equilibrat per mantenir les operacions eficients.

Implementació:

Nom de l'arxiu: 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)>