๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Personal_Study/CS

CS ๋ฉด์ ‘ ์งˆ๋ฌธ ์ •๋ฆฌ - ์ž๋ฃŒ๊ตฌ์กฐ

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 2. 12.

์ž๋ฃŒ๊ตฌ์กฐ

1. Array, Vector, Linked list

โœ” Array, Vector: ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๊ธฐ๋ฐ˜์˜ ์—ฐ์† ๋ฐฉ์‹

โœ” Linked List: ํฌ์ธํ„ฐ ๊ธฐ๋ฐ˜์˜ ์—ฐ๊ฒฐ ๋ฐฉ์‹

Array(์ •์  ๋ฐฐ์—ด)

โœ” ์ •์  ๋ฐฐ์—ด

โœ” ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๊ณ  ํ•ด๋‹น ํฌ๊ธฐ๋งŒํผ์˜ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›๋Š” ์ž๋ฃŒํ˜•

โœ” ํ•œ๋ฒˆ ์ƒ์„ฑํ•œ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” ๊ณ ์ •๋œ๋‹ค

โœ” ์กฐํšŒ: O(1) / ํƒ์ƒ‰: O(N)

โœ” ์‚ญ์ œ / ์‚ฝ์ž…: O(N)

  • ๊ธฐ์กด ์›์†Œ๋“ค์„ ์ด๋™ ์‹œ์ผœ์ค˜์•ผ๋œ๋‹ค.
int[] numbers = new int[5];

numbers[0] = 10;
numbers[1] = 15;
numbers[2] = 20;
numbers[3] = 30;
numbers[4] = 40;

Vector(๋™์  ๋ฐฐ์—ด)

โœ” ๋™์  ๋ฐฐ์—ด

โœ” ์ „์ฒด ํฌ๊ธฐ๋ฅผ ๊ฐ€๋Š ํ•˜๊ธฐ ํž˜๋“  ๋ฐ์ดํ„ฐ๋„ ๋งŽ๋‹ค! -> ์ž๋™์œผ๋กœ ํฌ๊ธฐ ์กฐ์ •

  • ์ดˆ๊ธฐ ๊ฐ’์„ ์ž‘๊ฒŒ ์žก์•„ ๋ฐฐ์—ด ์ƒ์„ฑ
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ถ”๊ฐ€ ๋ผ์„œ ๊ฝ‰ ์ฑ„์›Œ์งˆ ๋–„๋งˆ๋‹ค ๋Š˜๋ ค์ค€๋‹ค (Doubling)
  • Python(CPython) ๊ฐ™์€ ๊ฒฝ์šฐ ์ดˆ๊ธฐ์—๋Š” 2๋ฐฐ, ์ „์ฒด์ ์œผ๋กœ๋Š” 1.125๋ฐฐ
  • Java์˜ ArrayList ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” 1.5๋ฐฐ

โœ” ์กฐํšŒ: O(1) / ํƒ์ƒ‰: O(N)

โœ” ์‚ญ์ œ / ์‚ฝ์ž…: O(N)

  • ๊ธฐ์กด ์›์†Œ๋“ค์„ ์ด๋™ ์‹œ์ผœ์ค˜์•ผ๋œ๋‹ค.
ArrayList<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));

Linked List (์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)

โœ” ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ์—ฐ๊ฒฐ

  • ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ๊ด€๋ฆฌ ์šฉ์ด

โœ” ๋™์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋…ธ๋“œ ์‚ฝ์ž…/์‚ญ์ œ ์šฉ์ด

  • ๊ธฐ์กด ์—ฐ๊ฒฐ์„ ๋Š๊ณ  ํฌ์ธํ„ฐ๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋œ๋‹ค

โœ” ์‚ฝ์ž…/์‚ญ์ œ: O(1) / ์กฐํšŒ: O(N)

class Node {
    int value;
    Node next;

    Node(int value, Node next) {
        this.value = value;
        this.next = next;
    }
}

Node head = new Node(1, new Node(2, new Node(3)));

2. Stack, Queue

Stack

โœ” LIFO (Last In First Out): ํ›„์ž… ์„ ์ถœ

โœ” ์žฌ๊ท€, ๋ฉ”๋ชจ๋ฆฌ(์Šคํƒ ์˜์—ญ)์—์„œ ์‚ฌ์šฉ

import java.util.Stack;

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);

System.out.println(stack); // Output: [3, 2, 1]

System.out.println(stack.peek()); // Output: 3
System.out.println(stack); // Output: [3, 2, 1]

System.out.println(stack.pop()); // Output: 3
System.out.println(stack); // Output: [2, 1]

Queue

โœ” FIFO (First In First Out): ์„ ์ž… ์„ ์ถœ

โœ” BFS, ์Šค์ผ€์ค„๋ง์— ์‚ฌ์šฉ

import java.util.LinkedList;

LinkedList<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
queue.add(3);

System.out.println(queue); // Output: [1, 2, 3]

queue.add(4);
System.out.println(queue); // Output: [1, 2, 3, 4]

System.out.println(queue.remove()); // Output: 1
System.out.println(queue); // Output: [2, 3, 4]

3. Deque

โœ” Double Ended Queue

โœ” ์–‘์ชฝ ๋์—์„œ ์›์†Œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜• (ํ + ์Šคํƒ)

import java.util.Deque;
import java.util.ArrayDeque;

Deque<Integer> deque = new ArrayDeque<>();

deque.addFirst(1);
deque.addFirst(2);
deque.addLast(3);
deque.addLast(4);

System.out.println(deque); // Output: [2, 1, 3, 4]

System.out.println(deque.removeFirst()); // Output: 2
System.out.println(deque.removeLast()); // Output: 4
System.out.println(deque); // Output: [1, 3]

System.out.println(deque.peekFirst()); // Output: 1
System.out.println(deque.peekLast()); // Output: 3

4. Priority Queue, Heap

Priority Queue(์šฐ์„ ์ˆœ์œ„ ํ)

โœ” ํŠน์ • ์กฐ๊ฑด(์ตœ์†Œ, ์ตœ๋Œ€ ๋“ฑ)์— ๋”ฐ๋ผ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ์š”์†Œ๊ฐ€ ์ถ”์ถœ๋˜๋Š” ์ž๋ฃŒํ˜•

โœ” ์ผ๋ฐ˜์ ์œผ๋กœ ํž™(Heap)์„ ์ด์šฉํ•ด ๊ตฌํ˜„

โœ” ์‚ฝ์ž…: O(logN)
โœ” ์‚ญ์ œ(์šฐ์„ ์ˆœ์œ„): O(logN)
โœ” ์กฐํšŒ: O(1)

import java.util.PriorityQueue;

PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((a, b) -> b - a);
priorityQueue.offer(1);
priorityQueue.offer(2);
priorityQueue.offer(3);

System.out.println(priorityQueue); // Output: [3, 2, 1]

System.out.println(priorityQueue.peek()); // Output: 3

priorityQueue.offer(4);
System.out.println(priorityQueue); // Output: [4, 3, 1, 2]

System.out.println(priorityQueue.poll()); // Output: 4
System.out.println(priorityQueue); // Output: [3, 2, 1]

Heap(ํž™)

โœ” ๋ถ€๋ชจ๊ฐ€ ํ•ญ์ƒ ์ž์‹๋ณด๋‹ค (์ž‘๊ฑฐ๋‚˜/ํฌ๊ฑฐ๋‚˜) ๊ฐ™์€ ํž™์˜ ํŠน์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ํŠธ๋ฆฌ ๊ธฐ๋ฐ˜์˜ ์ž๋ฃŒ๊ตฌ์กฐ

โœ” ์™„์ „์ด์ง„ํŠธ๋ฆฌ

โœ” ๋ฃจํŠธ๋Š” ํ•ญ์ƒ ์ตœ์†Œ/์ตœ๋Œ€๊ฐ’

โœ” ์‚ฝ์ž…: O(logN)
โœ” ์ถ”์ถœ: O(logN) (๋‹จ์ˆœํžˆ ๋ฃจํŠธ ๋…ธ๋“œ ์ถ”์ถœ ์ž์ฒด๋Š” O(1)์ด๋‚˜ ์ถ”์ถœ ํ›„ ๋‹ค์‹œ ๊ท ํ˜•์„ ์œ ์ง€ํ•˜๊ธฐ์— O(logN))

import java.util.Arrays;

class MaxHeap {
    private int[] heap;
    private int size;

    MaxHeap(int capacity) {
        heap = new int[capacity];
        size = 0;
    }

    int getParentIndex(int i) { return (i - 1) / 2; }

    int getLeftChildIndex(int i) { return 2 * i + 1; }

    int getRightChildIndex(int i) { return 2 * i + 2; }

    boolean hasParent(int i) { return getParentIndex(i) >= 0; }

    boolean hasLeftChild(int i) { return getLeftChildIndex(i) < size; }

    boolean hasRightChild(int i) { return getRightChildIndex(i) < size; }

    int parent(int i) { return heap[getParentIndex(i)]; }

    int leftChild(int i) { return heap[getLeftChildIndex(i)]; }

    int rightChild(int i) { return heap[getRightChildIndex(i)]; }

    void swap(int i, int j) {
        int temp = heap[i];
        heap[i] = heap[j];
        heap[j] = temp;
    }

    void ensureCapacity() {
        if (size == heap.length) {
            heap = Arrays.copyOf(heap, 2 * heap.length);
        }
    }

    void insert(int item) {
        ensureCapacity();
        heap[size] = item;
        size++;
        siftUp(size - 1);
    }

    void siftUp(int i) {
        while (hasParent(i) && parent(i) < heap[i]) {
            int parentIndex = getParentIndex(i);
            swap(parentIndex, i);
            i = parentIndex;
        }
    }

    int extractMax() {
        int max = heap[0];
        heap[0] = heap[size - 1];
        size--;
        siftDown(0);
        return max;
    }

    void siftDown(int i) {
        while (hasLeftChild(i)) {
            int largerChildIndex = getLeftChildIndex(i);
            if (hasRightChild(i) && rightChild(i) > leftChild(i)) {
                largerChildIndex = getRightChildIndex(i);
            }
            if (heap[i] >= heap[largerChildIndex]) {
                break;
            }
            swap(i, largerChildIndex);
            i = largerChildIndex;
        }
    }

    public static void main(String[] args) {
        MaxHeap heap = new MaxHeap(10);
        heap.insert(10);
        heap.insert(5);
        heap.insert(15);
        heap.insert(30);
        heap.insert(20);

        System.out.println(heap.extractMax()); // 30
        System.out.println(heap.extractMax()); // 20
        System.out.println(heap.extractMax()); // 15
        System.out.println(heap.extractMax()); // 10
        System.out.println(heap.extractMax()); // 5
}
}

5. Hash

Hash (Function)

โœ” ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•˜๋Š” ๋‹จ๋ฐฉํ–ฅ ํ•จ์ˆ˜

Hash Collision

โœ” ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ‚ค(ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’)๊ฐ€ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋™์ผํ•œ ์ธ๋ฑ์Šค(ํ•ด์‹œ ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ๊ฐ’)์— ๋งคํ•‘๋˜๋Š” ํ˜„์ƒ

โœ” ์›์ธ

  • ๋น„๋‘˜๊ธฐ์ง‘ ์›๋ฆฌ: n+1๊ฐœ์˜ ๋ฌผ๊ฑด์„ n๊ฐœ์˜ ์ƒ์ž์— ๋„ฃ์„ ๋•Œ ์ ์–ด๋„ ์–ด๋Š ํ•œ ์ƒ์ž์—๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ฌผ๊ฑด์ด ๋“ค์–ด ์žˆ๋‹ค๋Š” ์›๋ฆฌ
  • ์ƒ์ผ ๋ฌธ์ œ: ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋ชจ์˜€์„ ๋•Œ ์ƒ์ผ์ด ๊ฐ™์€ 2๋ช…์ด ์กด์žฌํ•  ํ™•๋ฅ ์€? (23๋ช… -> 50%, 57๋ช… -> 99%)
    • ์ถฉ๋Œ์€ ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ผ์–ด๋‚œ๋‹ค!

โœ” ํ•ด๊ฒฐ

  • Chaining: ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ธ๋ฑ์Šค๊ฐ€ ํ•ด๋‹น ์ธ๋ฑ์Šค์— ์—ฐ๊ฒฐ๋œ ํ•ญ๋ชฉ๋“ค์„ ๋‹ด์€ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค (java)
  • Open Addressing: ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ํƒ์‚ฌ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๋นˆ๊ณต๊ฐ„์„ ์ฐพ๋Š”๋‹ค (Python)

HashMap / HashTable

โœ” HashMap / HashTable: Key(ํ‚ค) - Value(๊ฐ’) ๋งคํ•‘์ด ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒ๊ตฌ์กฐ

โœ” ์กฐํšŒ: ํ‰๊ท  O(1) / ์ตœ์•… O(N)

import java.util.HashMap;

public class Example {
    public static void main(String[] args) {
        // Creating a HashMap
        HashMap<String, Integer> map = new HashMap<>();

        // Adding key-value pairs to the map
        map.put("John", 25);
        map.put("Jane", 30);
        map.put("Jim", 35);

        // Retrieving values from the map
        System.out.println("Age of John: " + map.get("John"));
        System.out.println("Age of Jane: " + map.get("Jane"));
        System.out.println("Age of Jim: " + map.get("Jim"));
    }
}

// Age of John: 25
// Age of Jane: 30
// Age of Jim: 35

6. Graph

โœ” ๋…ธ๋“œ(node/vertex)์™€ ๊ฐ„์„ (edge)์œผ๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฃŒ์˜ ์ง‘ํ•ฉ

โœ” ๋…ธ๋“œ(Node): ์ •๋ณด์˜ ๋‹จ์œ„, ๊ฐ„์„ (Edge): ๋…ธ๋“œ ๊ฐ„์˜ ๊ด€๊ณ„

โœ” ์ธ์ ‘๋ฆฌ์ŠคํŠธ / ์ธ์ ‘ํ–‰๋ ฌ๋กœ ๊ตฌํ˜„

// ์ธ์ ‘ํ–‰๋ ฌ

N = Integer.parseInt(br.readLine()); // ๋…ธ๋“œ
M = Integer.parseInt(br.readLine()); // ๊ฐ„์„  

arr    = new int[N+1][N+1]

for(int i = 0; i < M; i++) {
    st = new StringTokenizer(br.readLine());
    int node1 = Integer.parseInt(st.nextToken());
    int node2 = Integer.parseInt(st.nextToken());
    arr[node1][node2] = 1;
    arr[node2][node1] = 1;
}
// ์ธ์ ‘๋ฆฌ์ŠคํŠธ

N = Integer.parseInt(br.readLine()); // ๋…ธ๋“œ
M = Integer.parseInt(br.readLine()); // ๊ฐ„์„  

LinkedList<Integer>[] adjList = new LinkedList[N + 1];

for (int i = 0; i <= N; i++) {
    adjList[i] = new LinkedList<Integer>();
}

for (int i = 0; i < M; i++) {
    int node1 = Integer.parseInt(st.nextToken());
    int node2 = Integer.parseInt(st.nextToken());
    adjList[node1].add(node2);
    adjList[node2].add(node1);
}

7. Tree

Tree

โœ” Tree: ์‚ฌ์ดํด์ด ์—†๋Š” ์—ฐ๊ฒฐ ๊ทธ๋ž˜ํ”„

โœ” ์šฉ์–ด

  • ๋…ธ๋“œ(node): ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ์›์†Œ
    • ๋ฃจํŠธ ๋…ธ๋“œ(root node/root): ํŠธ๋ฆฌ์—์„œ ๋ถ€๋ชจ๊ฐ€ ์—†๋Š” ์ตœ์ƒ์œ„ ๋…ธ๋“œ, ํŠธ๋ฆฌ์˜ ์‹œ์ž‘์ 
    • ๋ถ€๋ชจ ๋…ธ๋“œ(parent node): ๋ฃจํŠธ ๋…ธ๋“œ ๋ฐฉํ–ฅ์œผ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
    • ์ž์‹ ๋…ธ๋“œ(child node): ๋ฃจํŠธ ๋…ธ๋“œ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ
    • ํ˜•์ œ ๋…ธ๋“œ(siblings node): ๊ฐ™์€ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋“ค
    • ๋ฆฌํ”„ ๋…ธ๋“œ(leaf node/leaf): ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ฐจ์ˆ˜๊ฐ€ 1์ธ ์ •์  (์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ)
  • ๊ฒฝ๋กœ(path): ํ•œ ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ํ•œ ๋…ธ๋“œ์— ์ด๋ฅด๋Š” ๊ธธ ์‚ฌ์ด์— ์žˆ๋Š” ๋…ธ๋“œ๋“ค์˜ ์ˆœ์„œ
  • ๊ธธ์ด(length): ์ถœ๋ฐœ ๋…ธ๋“œ์—์„œ ๋„์ฐฉ ๋…ธ๋“œ๊นŒ์ง€ ๊ฑฐ์น˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜
  • ๊นŠ์ด(depth): ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ ๊ธธ์ด
  • ๋ ˆ๋ฒจ(level): ๋ฃจํŠธ ๋…ธ๋“œ(level=0)๋ถ€ํ„ฐ ๋…ธ๋“œ๊นŒ์ง€ ์—ฐ๊ฒฐ๋œ ๊ฐ„์„  ์ˆ˜์˜ ํ•ฉ
  • ๋†’์ด(height): ๊ฐ€์žฅ ๊ธด ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ ๊ธธ์ด
  • ์ฐจ์ˆ˜(degree): ๊ฐ ๋…ธ๋“œ์˜ ์ž์‹์˜ ๊ฐœ์ˆ˜
  • ํŠธ๋ฆฌ์˜ ์ฐจ์ˆ˜(degree of tree): ํŠธ๋ฆฌ์˜ ์ตœ๋Œ€ ์ฐจ์ˆ˜
  • ํฌ๊ธฐ(size): ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜

Tree vs Graph

โœ” ํŠธ๋ฆฌ๋Š” ์ˆœํ™˜๊ตฌ์กฐ๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค!

์ด์ง„ํŠธ๋ฆฌ (Binary Tree)

โœ” ๋ชจ๋“  ๋…ธ๋“œ์˜ ์ฐจ์ˆ˜๊ฐ€ 2 ์ดํ•˜์ธ ํŠธ๋ฆฌ

โœ” ๋‹ค์ง„ ํŠธ๋ฆฌ์— ๋น„ํ•ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฌ์›Œ์„œ ๋งŽ์ด ์“ด๋‹ค!

โœ” ์ด์ง„ํŠธ๋ฆฌ์˜ ์ข…๋ฅ˜

์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ (Binary Search Tree)

โœ” ๋…ธ๋“œ์˜ ์™ผ์ชฝ ๊ฐ€์ง€์—๋Š” ๋…ธ๋“œ์˜ ๊ฐ’๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค๋งŒ ์žˆ๊ณ , ์˜ค๋ฅธ์ชฝ ๊ฐ€์ง€์—๋Š” ํฐ ๊ฐ’๋“ค๋งŒ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋œ ์ด์ง„ํŠธ๋ฆฌ

โœ” (์ด์ƒ์ ์ธ ์ƒํ™ฉ์—์„œ) ํƒ์ƒ‰/์‚ฝ์ž…/์‚ญ์ œ: O(logN)

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ(ํŽธํ–ฅ): O(N) (ex: 1~100)

ํŠธ๋ฆฌ์˜ ์ˆœํšŒ

โœ” ์ค‘์œ„ ์ˆœํšŒ(in-order traversal): ์™ผ์ชฝ ์ž์†, ์ž์‹ , ์˜ค๋ฅธ์ชฝ ์ž์† ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•

  • ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ ์ค‘์œ„ ์ˆœํšŒ ์‹œ ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜

โœ” ์ „์œ„ ์ˆœํšŒ(pre-order traversal): ์ž์‹ , ์™ผ์ชฝ ์ž์†, ์˜ค๋ฅธ์ชฝ ์ž์† ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•

โœ” ํ›„์œ„ ์ˆœํšŒ(post-order traversal): ์™ผ์ชฝ ์ž์†, ์˜ค๋ฅธ์ชฝ ์ž์†, ์ž์‹  ์ˆœ์„œ๋กœ ๋ฐฉ๋ฌธํ•˜๋Š” ์ˆœํšŒ ๋ฐฉ๋ฒ•

โœ” ๋ ˆ๋ฒจ ์ˆœ์„œ ์ˆœํšŒ(level-order traversal): ๋ ˆ๋ฒจ ์ˆœ์„œ๋กœ ์ˆœํšŒ(BFS)

8. Advanced Tree

AVL Tree

avltree

โœ” ์ž๊ฐ€ ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

โœ” ์ผ๋ฐ˜์ ์ธ ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ์˜ ํŽธํ–ฅ์„ฑ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฝ์ž…/์‚ญ์ œ ์‹œ๋งˆ๋‹ค ๊ท ํ˜•์„ ๋งž์ถฐ์ค€๋‹ค (ํŠธ๋ฆฌ ํšŒ์ „)

โœ” ์˜ค๋ฅธ์ชฝ ํŠธ๋ฆฌ์™€ ์™ผ์ชฝ ํŠธ๋ฆฌ์˜ ๋†’์ด ์ฐจ๊ฐ€ 1 ์ดํ•˜

โœ” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ํƒ์ƒ‰/์‚ฝ์ž…/์‚ญ์ œ: O(logN)

Red-Black Tree

โœ” ์ž๊ฐ€ ๊ท ํ˜• ์ด์ง„ ํƒ์ƒ‰ ํŠธ๋ฆฌ

โœ” ์กฐ๊ฑด

  1. ๋ชจ๋“  ๋…ธ๋“œ๋Š” red or black
  2. ๋ฃจํŠธ ๋…ธ๋“œ๋Š” black
  3. ์ž์‹์ด ์—†๋Š” ๋…ธ๋“œ๋Š” Null Leaf Node (NIL)๋ผ๊ณ  ํ•œ๋‹ค
  4. ๋ชจ๋“  NIL์€ black
  5. red์˜ ์ž์‹์€ ์–ธ์ œ๋‚˜ black -> red๋Š” ์—ฐ์†์œผ๋กœ ๋‚˜์˜ฌ ์ˆ˜ ์—†๋‹ค! (black์€ ๊ฐ€๋Šฅ)
  6. ์ž„์˜์˜ ํ•œ ๋…ธ๋“œ์—์„œ null leaf node๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์—๋Š” null leaf node๋ฅผ ์ œ์™ธํ•˜๊ณ  ํ•ญ์ƒ ๊ฐ™์€ ์ˆ˜์˜ ๋ธ”๋ž™ ๋…ธ๋“œ ์กด์žฌ

โœ” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ํƒ์ƒ‰/์‚ฝ์ž…/์‚ญ์ œ: O(logN)

โœ” ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ ์ค‘์— ๊ฐ€์žฅ ์„ฑ๋Šฅ์ด ์ข‹์•„ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ!

๋Œ“๊ธ€