logo

Java의 데이터 구조

컴퓨터 프로그램 내에서 데이터를 정렬, 저장 및 처리할 수 있는 다양한 방법을 Java에서는 데이터 구조라고 합니다. 이러한 구조는 데이터를 효과적으로 처리하고 관리하기 위한 체계적인 방법을 제공하여 삽입, 삭제, 검색 및 순회와 같은 유용한 작업을 가능하게 합니다.

이 기사에서는 Java의 데이터 구조와 관련된 모든 것을 살펴보고 초보자가 쉽고 효과적으로 이해할 수 있도록 도와줍니다.

  • 자바란 무엇입니까?
  • Java의 데이터 구조란 무엇입니까?
  • Java의 데이터 구조 유형
  • Java 데이터 구조의 장점
  • 데이터 구조의 분류
  • Java FAQ의 데이터 구조

자바란 무엇입니까?

Java는 방대한 표준 라이브러리와 플랫폼의 자유로움으로 유명한 인기 있는 객체 지향 프로그래밍 언어입니다. 다양한 플랫폼에서 재컴파일 없이 실행되는 프로그램을 생성하기 위한 견고한 아키텍처를 제공합니다. 잘 알려진 Java 라이브러리에는 다양한 데이터 유형을 효율적으로 처리할 수 있는 다양한 기록 시스템이 있습니다.

Java의 데이터 구조란 무엇입니까?

데이터가 컴퓨터 프로그램의 메모리에 구성되고 저장되는 방식은 Java 레코드 구조에 밀접하게 의존합니다. 잘 알려진 Java 라이브러리에는 중요한 유형의 내장 통계 구조가 포함되어 있습니다. 프로그래머가 짧고 간단한 방법으로 데이터를 저장하고 정렬할 수 있는 기록 시스템에는 연결된 목록, 스택, 대기열 및 배열이 포함됩니다. 개발자는 데이터 액세스, 변경 및 관리를 위한 다양한 메커니즘을 제공하므로 삽입, 삭제, 검색 및 정렬과 같은 작업을 신속하게 수행할 수 있습니다. Java 프로그래머는 이러한 데이터 구조를 사용하여 메모리 사용을 줄이고 프로그램의 전반적인 효율성을 상당히 높일 수 있습니다.

Java의 데이터 구조 유형

아래 나열된 Java의 데이터 구조 목록

  1. 배열
  2. 배열목록
  3. 링크드리스트
  4. 스택
  5. 대기줄
  6. 해시맵
  7. 해시세트
  8. 트리세트
  9. 트리맵
  10. 그래프
  11. 나무

아래 다이어그램은 Java의 데이터 구조 유형을 매우 명확하게 설명합니다.

Java의 데이터 구조

데이터 구조 유형의 추가 분류:

데이터 구조에는 두 가지 유형이 있습니다.

  1. 원시 데이터 구조
  2. 비원시적 데이터 구조

1) 원시 데이터 구조: 기본 데이터 유형이라고도 하는 이는 Java의 기본 내장 데이터 유형입니다. 여기에는 다음이 포함됩니다.

    바이트:-128부터 127까지의 정수를 저장합니다.짧은:-32,768부터 32,767까지의 정수를 저장합니다.정수:-2,147,483,648부터 2,147,483,647까지의 정수를 저장합니다.뜨다:단정밀도로 부동 소수점 숫자를 저장합니다.숯:개별 문자를 저장합니다.부울:참 또는 거짓 값을 저장합니다.긴:큰 정수를 저장합니다.더블:부동 소수점 숫자를 배정밀도로 저장합니다.

2) 비원시적 데이터 구조: 비원시적 레코드 구조는 더 복잡하며 기본 정보 정렬로 구성됩니다. 또한 다음과 같은 두 가지 종류로 분류될 수 있습니다.

    선형 데이터 구조:선형 데이터 구조에서는 요소가 선형 또는 순차적으로 배열됩니다. 예는 다음과 같습니다:
      어레이:미리 결정된 배열에 따라 배열로 배치된 동일한 유형의 요소 그룹입니다.스택:최상위 항목만 추가하거나 제거할 수 있는 LIFO(후입선출) 구조입니다.꼬리:FIFO(선입선출) 구조는 항목이 반환된 부분에 삽입되고 앞쪽에서 꺼내지는 대기열에서 활용됩니다.연결 목록:관련 목록은 노드라고 하는 가젯 모음으로 구성되며, 각 가젯 뒤에는 노드에 대한 참조와 내부 통계가 있습니다.
    비선형 데이터 구조:비선형 데이터 구조에서는 요소가 비순차적으로 배열됩니다. 예는 다음과 같습니다:
      나무:트리는 노드 기반 계층 구조의 일종으로, 맨 위에 루트 노드가 있고 그 밖으로 분기되는 하위 노드가 있습니다. 예로는 레드-블랙 트리, AVL 트리, 이진 검색 트리 및 이진 트리가 있습니다.그래프:에지를 사용하여 연결된 노드 집합으로, 노드는 임의의 수의 연결을 가질 수 있습니다. 그래프는 항목 간의 복잡한 관계를 상징하는 데 사용됩니다.더미:결정된 모든 노드가 최대 힙인지 최소 힙인지 여부에 따라 해당 노드보다 크거나 작은 값을 갖는 특수한 트리 기반 구조입니다.해시시:해시 함수를 사용하여 키를 값에 매핑하는 데이터 구조입니다. 예는 해시 세트와 해시 맵으로 구성되며, 이는 정확한 키를 기반으로 녹색 검색 및 통계 저장을 제공합니다.
Java의 데이터 구조

Java 데이터 구조의 장점

    효율적인 데이터 구성:데이터 구조는 데이터를 저장하고 관리하는 체계적인 방법을 제공하여 효율적인 액세스, 조작 및 검색 작업을 가능하게 합니다. 메모리 사용을 최적화하고 알고리즘 실행 속도를 높여줍니다.더 나은 성능:개발자는 특정 활동에 적합한 데이터 구조를 선택하여 속도 및 메모리 활용 측면에서 성능을 향상시킬 수 있습니다. 특정 데이터 구조가 정보 검색, 정렬 또는 삽입과 같은 특정 작업에서 탁월하도록 만들어지기 때문에 성능이 최적화됩니다.코드 재사용성:Java는 프로그래머가 쉽게 사용할 수 있는 다양한 내장 데이터 구조를 제공합니다. 이러한 재사용 가능한 데이터 구조는 정교한 알고리즘을 처음부터 만들 필요가 없으므로 시간과 노력을 절약해줍니다.코드 단순성:데이터 구조를 사용하면 복잡한 프로세스의 구현을 더욱 간단하게 코딩할 수 있습니다. 이는 높은 수준의 추상화를 제공하고 데이터 관리의 세부 사항을 캡슐화하여 코드의 가독성, 유지 관리성 및 명확성을 향상시킵니다.유연성과 적응성:데이터 구조는 다양한 유형과 크기의 데이터를 처리하는 데 유연성을 제공합니다. 변화하는 데이터 요구 사항을 수용하도록 동적으로 조정하고 효율적인 데이터 조작을 위한 메커니즘을 제공할 수 있습니다.표준화되고 잘 테스트됨:Java용 표준 라이브러리에는 상당한 테스트와 최적화를 거쳐 신뢰성과 성능을 보장하는 내장 데이터 구조가 포함되어 있습니다. 이러한 공통 데이터 구조를 활용하면 오류 가능성이 낮아지고 애플리케이션 개발에 견고한 기반이 제공됩니다.확장성:데이터 구조는 확장성 옵션을 제공하므로 애플리케이션이 대용량 데이터를 효율적으로 처리할 수 있습니다. 데이터 크기에 따라 동적으로 확장하거나 축소할 수 있어 데이터 수요 증가에도 최적의 성능을 보장합니다.알고리즘 설계:데이터 구조는 알고리즘 설계 및 분석에 매우 중요합니다. 다양한 알고리즘을 구현하고 복잡한 문제를 해결하는 데 필요한 기본 구조와 작업을 제공합니다.

1) 배열:

배열은 Java의 데이터 구조와 관련하여 기본적이고 자주 사용되는 데이터 구조입니다. 이는 동일한 유형의 구성 요소를 고정 크기 컬렉션으로 저장하는 방법을 제공합니다. 배열은 인덱스에 따라 요소에 빠르고 쉽게 액세스할 수 있기 때문에 데이터를 관리하고 구성하는 데 중요한 도구입니다.

장점:

    데이터 구성:배열은 요소를 저장하고 구성하는 구조화된 방법을 제공하여 데이터 관리를 개선합니다.무작위 액세스:인덱스를 사용하여 요소에 직접 액세스할 수 있으므로 효율적인 검색 및 수정이 가능합니다.고정 크기:배열은 미리 결정된 크기를 가지므로 효율적인 메모리 할당이 가능합니다.동종 요소:동일한 유형의 요소를 배열하여 저장하여 데이터 일관성을 보장하고 작업을 단순화합니다.반복:배열은 요소를 통한 손쉬운 반복을 지원하여 순회 및 처리를 용이하게 합니다.정렬 및 검색:배열은 정렬 및 검색 알고리즘과 잘 작동하여 효율적인 작업을 제공합니다.메모리 효율성:배열은 인접한 영역에 요소를 저장하여 메모리 사용을 최적화합니다.호환성:배열은 Java에서 광범위하게 지원되므로 다양한 프레임워크 및 도구와 호환됩니다.

단점:

    고정 크기:배열은 동적으로 크기를 조정할 수 없으므로 크기 변경을 위해 다시 만들어야 합니다.메모리 낭비:더 큰 배열에서 사용되지 않는 요소는 메모리 낭비로 이어질 수 있습니다.삽입 및 삭제 오버헤드:배열 중간에 요소를 삽입하거나 삭제하려면 후속 요소를 이동해야 하므로 비효율성이 발생합니다.유연성 부족:배열은 고정된 데이터 유형을 가지며 추가 배열이나 데이터 구조 없이는 다양한 데이터 종류를 수용할 수 없습니다.

기능:

    어레이 생성:array 유형과 new 키워드를 사용하여 특정 크기의 배열을 선언하고 초기화합니다.요소에 접근하기:인덱스를 사용하여 배열의 개별 요소에 액세스합니다.요소 수정:배열의 특정 인덱스에 새 값을 할당하여 요소의 값을 업데이트합니다.길이 찾기:배열의 길이를 결정하려면 길이 속성을 사용하십시오.배열을 통해 반복:루프를 사용하여 배열의 각 요소를 살펴보고 실행합니다.

구현:

파일 이름: 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) 배열목록:

Java의 ArrayList는 요소의 저장 및 조작을 허용하는 동적 데이터 구조입니다. 이는 Java Collections Framework의 일부이며 내부적으로 배열을 사용하여 구현됩니다.

장점:

    동적 크기:배열과 달리 ArrayList는 요소가 추가되거나 제거됨에 따라 크기가 동적으로 늘어나거나 줄어들 수 있습니다. 수동으로 크기를 조정할 필요가 없으며 다양한 양의 데이터를 편리하게 처리할 수 있습니다.쉬운 요소 조작:ArrayLists는 목록 내 임의의 위치에서 요소를 추가, 제거 및 수정하는 메서드를 제공합니다. 유연성 덕분에 삽입, 삭제, 업데이트 등의 일반적인 작업이 단순화되어 요소 조작이 더욱 효율적으로 이루어집니다.무작위 액세스:ArrayList는 인덱스를 사용하여 요소에 대한 무작위 액세스를 지원하므로 목록 내의 특정 위치에 있는 요소를 빠르게 검색하고 수정할 수 있습니다. 이는 효율적인 요소 액세스를 촉진하고 전반적인 성능을 향상시킵니다.Java 컬렉션 프레임워크와의 호환성:ArrayList는 List 인터페이스를 구현하여 Java 컬렉션 프레임워크의 다른 컬렉션 클래스와 호환되도록 합니다. 호환성을 통해 프레임워크에서 제공하는 다양한 알고리즘 및 작업과의 원활한 통합이 가능합니다.

단점:

    높은 메모리 오버헤드:ArrayList는 내부 구조를 유지하기 위해 추가 메모리가 필요하므로 배열에 비해 메모리 오버헤드가 더 높습니다. 대규모 요소 컬렉션을 처리할 때 문제가 될 수 있습니다.삽입 및 삭제 속도가 느려짐:ArrayList 중간에 요소를 삽입하거나 삭제하려면 요소를 이동해야 하며, 이는 큰 목록의 경우 시간이 많이 걸릴 수 있습니다. 빈번한 삽입 또는 삭제 작업이 예상되는 시나리오에서는 LinkedList와 같은 다른 데이터 구조가 더 나은 성능을 제공할 수 있습니다.검색 성능 제한:정렬되지 않은 ArrayList에서 요소를 검색하려면 일치하는 항목을 찾을 때까지 요소를 반복해야 합니다. HashSet이나 TreeMap과 같이 검색에 최적화된 데이터 구조에 비해 검색 성능이 느린 선형 검색 접근 방식입니다.기본 유형 지원 없음:ArrayList는 객체만 저장할 수 있으며 int 또는 char와 같은 기본 데이터 유형을 직접 지원하지 않습니다. 기본 유형을 저장하려면 Integer 또는 Character와 같은 래퍼 클래스를 사용해야 하므로 잠재적인 자동박싱 및 언박싱 오버헤드가 발생합니다.

기능:

자바가 현재 날짜를 가져오는 중
    ArrayList 생성:ArrayList 클래스를 사용하여 ArrayList를 선언 및 초기화하고 꺾쇠 괄호 안에 요소 유형을 지정합니다.요소 추가:ArrayList의 끝에 요소를 추가하려면 add 메소드를 사용하십시오.요소에 접근하기:선택한 지수의 세부 가격을 검색하려면 get 기술을 사용하세요.요소 수정:집합 접근법의 사용을 위해 특정 지수의 세부 비용을 업데이트합니다.발견 크기:ArrayList에서 최신 요소 수량을 얻으려면 차원 방법을 사용하십시오.요소 제거:특정 인덱스에서 또는 객체 참조 제공을 통해 세부 정보를 삭제하려면 제거 접근 방식을 사용하세요.ArrayList를 통해 반복:루프를 사용하여 ArrayList의 각 요소를 반복하고 해당 요소에 대한 작업을 수행합니다.

구현:

파일 이름: ArrayListExample.java

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

산출:

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

3) 연결리스트:

연결된 목록은 요소가 노드라고 하는 별도의 개체에 저장되는 선형 데이터 구조입니다. 시퀀스의 다음 노드에 대한 참조 링크는 각 노드의 데이터 요소에 포함됩니다. 목록의 마지막 노드는 null로 연결되어 목록이 끝났음을 나타냅니다.

배열과 달리 연결된 목록에는 연속적인 메모리 할당이 필요하지 않습니다. 연결된 목록의 각 노드는 독립적으로 할당될 수 있으므로 동적 메모리 할당과 효율적인 삽입 및 삭제 작업이 가능합니다.

장점:

    동적 크기:LinkedList는 동적으로 늘어나거나 줄어들 수 있으므로 다양하거나 알 수 없는 데이터 크기에 적합합니다.효율적인 삽입 및 삭제:LinkedList 내에서 요소를 삽입하거나 삭제하는 것은 요소 이동이 필요하지 않으므로 효율적입니다.연속 메모리 요구 사항 없음:LinkedList는 연속적인 메모리 할당이 필요하지 않으므로 유연하고 예측할 수 없는 메모리 상황에 적합합니다.쉬운 수정:LinkedList를 사용하면 참조 포인터를 변경하여 요소를 쉽게 수정할 수 있으므로 효율적인 조작이 가능합니다.

단점:

    느린 랜덤 액세스:LinkedList는 인덱스별로 요소에 액세스하기 위해 목록을 순회해야 하므로 임의 액세스 속도가 느립니다.증가된 메모리 오버헤드:LinkedList에는 참조 및 노드에 추가 메모리가 필요하므로 배열에 비해 메모리 오버헤드가 늘어납니다.비효율적인 검색:LinkedList는 검색 작업 속도가 느리기 때문에 특정 요소를 찾으려면 순차적인 반복이 필요합니다.

기능:

    LinkedList 생성:LinkedList 클래스를 사용하여 LinkedList를 선언하고 초기화합니다.요소 추가:LinkedList의 끝에 요소를 추가하려면 add 메소드를 사용하십시오.요소에 접근하기:특정 인덱스에 있는 요소의 값을 검색하려면 get 메서드를 사용하세요.요소 수정:set 메소드를 사용하여 특정 인덱스의 요소 값을 업데이트합니다.요소 제거:특정 인덱스의 요소를 삭제하거나 객체 참조를 제공하여 제거 메소드를 사용하십시오.

구현:

파일 이름: LinkedList1.java

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

산출:

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

4) 스택:

LIFO(후입선출) 원칙은 가장 최근에 삽입된 요소가 먼저 제거되는 요소이기도 함을 나타냅니다. 스택은 이 규칙을 따르는 선형 데이터 구조입니다. 'push' 및 'pop' 명령을 사용하여 스택에 요소를 추가하고 그에 따라 스택에서 최상위 요소를 제거합니다. 'peek' 기술을 사용하면 최상위 요소를 제거하지 않고도 해당 요소에 대한 액세스가 추가로 가능해집니다.

스택의 특징:

    LIFO 동작:스택에 푸시된 마지막 요소가 가장 먼저 튀어나오므로 삽입 및 제거 순서가 중요한 애플리케이션에 적합합니다.제한된 액세스:스택은 일반적으로 요소에 대한 제한된 액세스를 제공합니다. 최상위 요소에만 액세스할 수 있으며, 다른 요소에 접근하려면 그 위에 있는 요소를 팝해야 합니다.동적 크기:스택은 동적 크기를 허용하는 배열 또는 연결 목록을 사용하여 구현할 수 있습니다. 런타임 중에 필요에 따라 확장하거나 축소할 수 있습니다.

장점:

    간단:스택은 이해하고 구현하기 쉽습니다.능률:삽입 및 삭제 작업의 시간 복잡도는 O(1)입니다.함수 호출 관리:스택은 함수 호출과 변수 저장을 효율적으로 관리합니다.실행 취소/다시 실행 기능:스택을 사용하면 애플리케이션에서 실행 취소 및 다시 실행 작업을 수행할 수 있습니다.

단점:

    제한된 액세스:요소에 대한 액세스는 스택 상단으로 제한됩니다.크기 제한:스택은 구현에 따라 크기 제한이 있을 수 있습니다.모든 시나리오에 적합하지는 않습니다.스택은 LIFO 동작에만 적용되며 다른 경우에는 적합하지 않을 수 있습니다.

구현:

파일 이름: StackExample.java

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

산출:

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

5) 대기열:

큐는 FIFO(선입선출) 원칙을 따르는 Java의 선형 데이터 구조입니다. 요소가 뒤쪽에 삽입되고 앞쪽에서 제거되는 요소의 집합을 나타냅니다.

특징:

    대기열에 추가:대기열 뒤쪽에 요소를 추가합니다.대기열에서 제거:대기열 앞쪽에서 요소를 제거합니다.몰래 엿보다:대기열의 맨 앞에 있는 요소를 제거하지 않고 검색합니다.크기:대기열의 요소 수를 결정합니다.빈 수표:대기열이 비어 있는지 확인합니다.

장점:

    FIFO 동작:요소는 삽입된 순서대로 처리되므로 원래 순서가 보존됩니다.효율적인 삽입 및 제거:대기열에 요소를 추가하고 제거하는 작업은 빠르며 O(1)의 일정한 시간 복잡도를 갖습니다.동기화:Java는 동기화된 대기열 구현을 제공하므로 동시 프로그래밍에 안전합니다.표준화된 인터페이스:Java의 Queue 인터페이스는 공통 메소드 세트를 제공하므로 서로 다른 대기열 구현 간에 쉽게 상호 교환이 가능합니다.

단점:

    무작위 액세스 불가:대기열은 중간에 있는 요소에 대한 직접 액세스를 지원하지 않습니다. 특정 위치에 액세스하려면 이전 요소를 대기열에서 제거해야 합니다.제한된 크기:일부 대기열 구현에는 고정된 크기나 용량이 있으므로 최대 크기를 초과하면 오버플로나 예외가 발생합니다.비효율적인 검색:대기열에서 요소를 검색하려면 일치하는 항목을 찾을 때까지 대기열에서 제거해야 하므로 잠재적으로 시간 복잡도가 높은 선형 검색이 발생합니다.

구현:

파일 이름: QueueExample.java

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

산출:

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

6) 해시맵:

HashMap은 키-값 쌍을 저장하고 검색하는 방법을 제공하는 Java의 데이터 구조입니다. 이는 Java Collections Framework의 일부이며 해시 테이블 데이터 구조를 기반으로 구현됩니다.

기능:

    넣다(키, 값):지정된 키-값 쌍을 HashMap에 삽입합니다.가져오기(키):지정된 키와 연관된 값을 검색합니다.포함키(키):HashMap에 지정된 키가 포함되어 있는지 확인합니다.포함값(값):HashMap에 지정된 값이 포함되어 있는지 확인합니다.제거(키):HashMap에서 지정된 키와 연결된 키-값 쌍을 제거합니다.크기():HashMap의 키-값 쌍 수를 반환합니다.비었다():HashMap이 비어 있는지 확인합니다.키세트():HashMap의 모든 키를 포함하는 Set을 반환합니다.값():HashMap의 모든 값을 포함하는 컬렉션을 반환합니다.분명한():HashMap에서 모든 키-값 쌍을 제거합니다.

장점:

    효율적인 검색:HashMap은 일정한 시간 복잡도 O(1)을 갖는 키를 기반으로 값을 빠르게 검색합니다.유연한 키-값 페어링:HashMap은 null이 아닌 객체를 키로 허용하여 데이터 저장 및 검색을 위한 사용자 정의 키를 활성화합니다.동적 크기:HashMap은 다양한 양의 데이터를 처리하기 위해 크기를 동적으로 늘리거나 줄일 수 있습니다.Java 컬렉션 프레임워크와의 호환성:HashMap은 Map 인터페이스를 구현하여 다른 Collection 클래스와 원활하게 통합할 수 있습니다.

단점:

    주문 부족:HashMap은 요소의 순서를 유지하지 않습니다. 특정 주문 요구 사항에는 LinkedHashMap 또는 TreeMap을 사용하세요.증가된 메모리 오버헤드:HashMap은 단순한 데이터 구조에 비해 해시 코드 및 내부 구조를 위한 추가 메모리가 필요합니다.느린 반복:HashMap을 반복하는 것은 기본 해시 테이블을 순회하기 때문에 배열이나 목록에 비해 속도가 느릴 수 있습니다.

구현:

파일 이름: HashMapExample.java

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

산출:

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

7) 해시세트:

HashSet은 Set 인터페이스를 구현하고 해시 테이블에 요소를 저장하는 Java의 데이터 구조입니다.

특징:

    고유한 요소를 저장합니다.HashSet은 중복 요소를 허용하지 않습니다. HashSet의 각 요소는 고유합니다.해시 기반 조회를 사용합니다.HashSet은 각 요소의 해시 값을 사용하여 저장 위치를 ​​결정하므로 효율적인 요소 검색을 제공합니다.순서가 지정되지 않은 컬렉션:HashSet의 요소는 특정 순서로 저장되지 않습니다. 요소의 순서는 시간이 지남에 따라 변경될 수 있습니다.

장점:

    빠른 요소 조회:HashSet은 빠른 조회 작업을 제공하므로 세트에 요소가 존재하는지 효율적으로 확인할 수 있습니다.중복 요소 없음:HashSet은 자동으로 중복 요소를 처리하고 각 요소가 고유한지 확인합니다.Java 컬렉션 프레임워크와의 통합:HashSet은 Set 인터페이스를 구현하여 Java 컬렉션 프레임워크의 다른 컬렉션 클래스와 호환되도록 합니다.

단점:

연결을 얻다
    보장된 주문 없음:HashSet은 요소의 순서를 유지하지 않습니다. 요소의 순서가 중요하다면 HashSet은 적합하지 않습니다.인덱싱 없음:HashSet은 요소에 대한 직접 인덱싱이나 위치 액세스를 제공하지 않습니다. 요소에 액세스하려면 세트를 반복해야 합니다.높은 메모리 오버헤드:HashSet은 해시 값을 저장하고 해시 테이블 구조를 유지하기 위해 추가 메모리가 필요하므로 일부 다른 데이터 구조에 비해 메모리 사용량이 더 높습니다.

구현:

파일 이름: HashSetExample.java

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

산출:

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

8) 트리세트:

TreeSet은 Red-Black 트리라고 하는 자체 균형 이진 검색 트리를 사용하여 요소를 정렬된 순서로 저장하는 Java의 SortedSet 인터페이스 구현입니다.

장점:

    정렬된 순서:TreeSet은 자연 순서 또는 사용자 정의 비교기에 따라 정렬된 순서로 요소를 자동으로 유지합니다. 오름차순 또는 내림차순으로 요소를 효율적으로 검색하고 검색할 수 있습니다.중복 요소 없음:TreeSet은 중복 요소를 허용하지 않습니다. 이는 집합의 각 요소가 고유한지 확인하므로 중복 값을 피해야 하는 시나리오에서 유용할 수 있습니다.효율적인 운영:TreeSet은 삽입, 삭제, 검색과 같은 효율적인 작업을 제공합니다. 이러한 연산의 시간 복잡도는 O(log n)입니다. 여기서 n은 집합의 요소 수입니다.탐색 가능한 집합 작업:TreeSet은 주어진 값보다 크거나 작거나 같은 요소를 찾을 수 있는 high(), lower(),ceiling(),floor()와 같은 추가 탐색 메서드를 제공합니다.

단점:

    간접비:TreeSet은 내부 데이터 구조를 저장하기 위해 추가 메모리가 필요하므로 다른 세트 구현에 비해 메모리 오버헤드가 높아질 수 있습니다.삽입 및 제거 속도가 느려짐:TreeSet의 삽입 및 제거 작업에는 요소의 정렬된 순서를 유지하는 작업이 포함되며, 이로 인해 트리 구조 조정이 필요할 수 있습니다. HashSet 또는 LinkedHashSet에 비해 이러한 작업이 약간 느려질 수 있습니다.제한된 사용자 정의:TreeSet은 주로 자연 순서 또는 단일 사용자 정의 비교기를 위해 설계되었습니다. 여러 정렬 기준이나 복잡한 정렬 논리의 경우 더 많은 유연성이 필요할 수 있습니다.

기능:

    추가(요소):정렬된 순서를 유지하면서 TreeSet에 요소를 추가합니다.제거(요소):TreeSet에서 지정된 요소를 제거합니다.포함(요소):TreeSet에 지정된 요소가 포함되어 있는지 확인합니다.크기():TreeSet의 요소 수를 반환합니다.첫 번째():TreeSet의 첫 번째(최하위) 요소를 반환합니다.마지막():TreeSet의 마지막(가장 높은) 요소를 반환합니다.더 높은(요소):주어진 요소보다 엄격히 큰 TreeSet의 최소 요소를 반환합니다.하부(요소):지정된 요소보다 엄격하게 작은 TreeSet의 가장 큰 요소를 반환합니다.

구현:

파일 이름: TreeSetExample.java

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

산출:

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

9) 트리맵:

TreeMap은 Map 인터페이스를 구현하고 키의 자연 순서 또는 사용자 정의 비교기를 기반으로 정렬된 키-값 매핑을 제공하는 Java 클래스입니다.

장점:

    정렬된 순서:TreeMap은 정렬된 순서로 키를 유지하므로 효율적인 검색, 검색 및 범위 기반 작업이 가능합니다.키-값 매핑:TreeMap은 키-값 쌍을 저장하여 연관된 키를 기반으로 값을 효율적으로 조회하고 검색할 수 있습니다.레드-블랙 트리 구현:TreeMap은 내부적으로 균형 이진 검색 트리(Red-Black Tree)를 사용하여 대규모 데이터 세트에도 효율적인 성능을 보장합니다.사용자 정의 비교기 지원:TreeMap을 사용하면 사용자 정의 비교기를 사용하여 키의 정렬 순서를 정의하여 정렬 기준에 유연성을 제공할 수 있습니다.

단점:

    메모리 오버헤드:TreeMap은 내부 트리 구조 및 관련 객체를 저장하기 위해 추가 메모리가 필요하므로 HashMap과 같은 단순한 데이터 구조에 비해 메모리 사용량이 더 높습니다.삽입 및 삭제 속도가 느려짐:TreeMap의 삽입 및 삭제 작업은 트리 재구성이 필요하기 때문에 O(log n)의 시간 복잡도를 가지므로 HashMap 또는 LinkedHashMap에 비해 속도가 느립니다.정렬되지 않은 데이터에 대한 성능 제한:TreeMap은 정렬된 데이터에 대해 효율적으로 수행되지만, 정렬된 순서를 유지해야 하기 때문에 정렬되지 않은 데이터를 처리하거나 자주 수정하는 경우 성능이 저하될 수 있습니다.

기능:

np.어디
    넣다(키, 값):TreeMap에 키-값 쌍을 삽입합니다.가져오기(키):지정된 키와 연관된 값을 검색합니다.포함키(키):TreeMap에 특정 키가 포함되어 있는지 확인합니다.제거(키):지정된 키와 연결된 키-값 쌍을 제거합니다.크기():TreeMap의 키-값 쌍 수를 반환합니다.키세트():TreeMap의 모든 키 집합을 반환합니다.값():TreeMap의 모든 값 컬렉션을 반환합니다.엔트리셋():TreeMap의 키-값 쌍 세트를 반환합니다.

구현:

파일 이름: TreeMapExample.java

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

산출:

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

10) 그래프:

그래프는 상호 연결된 노드 또는 정점의 모음을 나타내는 데이터 구조입니다. 정점은 꼭지점과 모서리로 구성됩니다. 여기서 꼭지점은 엔터티를 나타내고 모서리는 해당 엔터티 간의 관계를 나타냅니다.

장점:

    다재:그래프는 광범위한 실제 시나리오를 나타낼 수 있으므로 소셜 네트워크, 교통 시스템, 컴퓨터 네트워크와 같은 다양한 애플리케이션에 적합합니다.관계 표현:그래프는 엔터티 간의 관계와 연결을 나타내는 자연스러운 방법을 제공하므로 이러한 관계를 효율적으로 분석하고 탐색할 수 있습니다.효율적인 검색 및 순회:BFS(폭 우선 검색) 및 DFS(깊이 우선 검색)와 같은 그래프 알고리즘을 사용하면 그래프의 정점과 가장자리를 효율적으로 순회하고 검색할 수 있습니다.복잡한 관계 모델링:그래프는 계층 구조, 순환 종속성, 엔터티 간의 다중 연결을 포함한 복잡한 관계를 모델링할 수 있습니다.

단점:

    공간 복잡도:그래프는 상당한 양의 메모리를 소비할 수 있으며, 특히 정점과 간선이 많은 대규모 그래프의 경우 더욱 그렇습니다.운영의 복잡성:최단 경로 찾기 또는 주기 감지와 같은 특정 그래프 작업은 특히 조밀한 그래프에서 시간 복잡도가 높을 수 있습니다.유지 관리의 어려움:그래프 구조의 변경이 연결성과 기존 알고리즘에 영향을 미칠 수 있으므로 그래프를 수정하거나 업데이트하는 것은 복잡할 수 있습니다.

구현:

파일 이름: GraphExample.java

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

11) 나무:

트리는 계층 구조를 나타내는 컴퓨터 과학에서 널리 사용되는 데이터 구조입니다. 이는 가장자리로 연결된 노드로 구성되며, 각 노드는 0개 이상의 하위 노드를 가질 수 있습니다.

장점:

    계층 구조:트리는 파일 시스템, 조직도 또는 HTML/XML 문서와 같은 계층적 관계를 나타내는 자연스러운 방법을 제공합니다.효율적인 검색:이진 검색 트리는 O(log n)의 시간 복잡도로 효율적인 검색을 가능하게 하여 정렬된 데이터를 저장하고 검색하는 데 적합합니다.빠른 삽입 및 삭제:트리 데이터 구조는 특히 AVL 트리 또는 Red-Black 트리와 같이 균형을 이룰 때 효율적인 삽입 및 삭제 작업을 제공합니다.순서대로 반복:이진 검색 트리의 순차 순회는 정렬된 순서로 요소를 제공하며, 이는 정렬된 순서로 요소를 인쇄하거나 다음/이전 요소를 찾는 것과 같은 작업에 유용합니다.

단점:

    높은 메모리 오버헤드:트리에는 노드 참조나 포인터를 저장하기 위해 추가 메모리가 필요하므로 배열이나 목록과 같은 선형 데이터 구조에 비해 메모리 사용량이 높아질 수 있습니다.복잡한 구현:트리 데이터 구조를 구현하고 유지하는 것은 특히 균형 트리 변형의 경우 배열이나 목록과 같은 다른 데이터 구조에 비해 더 복잡할 수 있습니다.제한된 작업:이진 검색 트리와 같은 일부 트리 변형은 k번째로 작은 요소 찾기 또는 요소 순위 찾기와 같은 효율적인 작업을 지원하지 않습니다.

기능:

    삽입:트리에 새 노드를 추가합니다.삭제:트리에서 노드를 제거합니다.찾다:트리에서 특정 노드나 요소를 찾습니다.순회:순차, 사전 순서, 사후 순서 등 다양한 순서로 트리를 탐색합니다.높이/깊이:나무의 높이나 깊이를 계산합니다.균형:효율적인 운영을 유지하려면 트리의 균형이 유지되는지 확인하세요.

구현:

파일 이름: TreeExample.java

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