💻
ComputerScience
  • 목차
  • Operating System
    • 운영체제란
    • 프로세스 vs 스레드
    • 프로세스 주소 공간
    • 인터럽트(Interrupt)
    • 시스템 콜(System Call)
    • PCB와 Context Switching
    • IPC(Inter Process Communication)
    • CPU 스케줄링
    • 데드락(DeadLock)
    • Race Condition
    • 세마포어(Semaphore) & 뮤텍스(Mutex)
    • 페이징 & 세그먼테이션
    • 페이지 교체 알고리즘
    • 메모리(Memory)
    • 파일 시스템
  • Network
    • OSI 7 계층
    • TCP 3 way handshake & 4 way handshake
    • TCP/IP 흐름제어 & 혼잡제어
    • UDP
    • 대칭키 & 공개키
    • HTTP & HTTPS
    • TLS/SSL handshake
    • 로드 밸런싱(Load Balancing)
    • Blocking,Non-blocking & Synchronous,Asynchronous @LifesLike
    • Blocking & Non-Blocking I/O
  • Algorithm
    • 거품 정렬(Bubble Sort)
    • 선택 정렬(Selection Sort)
    • 삽입 정렬(Insertion Sort)
    • 퀵 정렬(Quick Sort) @mimwin
    • 병합 정렬(Merge Sort)
    • 힙 정렬(Heap Sort)
    • 기수 정렬(Radix Sort)
    • 계수 정렬(Count Sort)
    • 이분 탐색(Binary Search)
    • 해시 테이블 구현
    • DFS & BFS @sujin-kk
    • 최장 증가 수열(LIS)
    • 최소 공통 조상(LCA)
    • 동적 계획법(Dynamic Programming)
    • 다익스트라(Dijkstra) 알고리즘
    • 비트마스크(BitMask)
  • Database
    • 키(Key) 정리
    • SQL - JOIN
    • SQL Injection
    • SQL vs NoSQL
    • 정규화(Nomalization)
    • 이상(Anomaly)
    • 인덱스(INDEX)
    • 트랜잭션(Transaction)
    • 트랜잭션 격리 수준(Transaction Isolation Level)
    • 저장 프로시저(Stored PROCEDURE)
    • 레디스(Redis) @sujin-kk
  • Java
    • Java 컴파일 과정
    • Call by Value vs Call by Reference
    • String & StringBuffer & StringBuilder
    • 자바 가상 머신(Java Virtual Machine)
    • Casting(업캐스팅 & 다운캐스팅)
    • 오토 박싱 & 오토언박싱
    • Thread 활용
    • 고유 락(Intrinsic Lock)
    • 문자열 클래스
    • Garbage Collection
    • Promotion & Casting
    • Primitive type & Reference type
    • 직렬화(Serialization)
    • Error & Exception
    • Stream API
    • Record
    • Composition
Powered by GitBook
On this page
  • 다익스트라(Dijkstra) 알고리즘
  • 알고리즘
  • 시간복잡도
  • 플로이드-와샬 알고리즘
  • 벨만-포드 알고리즘
  1. Algorithm

다익스트라(Dijkstra) 알고리즘


다익스트라(Dijkstra) 알고리즘

  • 그래프에서 정점 간의 최단 경로 탐색 알고리즘

  • 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 구함

    • 가능한 모든 정점 쌍에 대한 최단 경로 탐색 알고리즘 👉 플로이드-와샬 알고리즘

  • 음의 간선을 포함할 수 없다

    • 음의 간선은 포함하지만 음의 사이클은 없을 때의 최단 경로 탐색 알고리즘 👉 벨만-포드 알고리즘

  • 다이나믹 프로그래밍, 그리디를 활용

    • 매 순간 가장 비용이 적은 정점을 선택해 임의의 과정을 반복

    • 최단 거리는 여러 개의 최단 거리로 이루어져 있기 때문에 다이나믹 프로그래밍을 활용

    • 하나의 최단 거리를 구할 때 그 이전까지 구했던 최단 거리 정보를 그대로 사용

    • 한 번 처리된 정점의 최단 거리는 고정되어 더 이상 바뀌지 않음

알고리즘

  1. 출발 노드 설정

  2. 출발 노드를 기준으로 각 노드의 최소 비용을 저장 (자기 자신은 0, 간선이 없다면 INF)

  3. 방문하지 않은 노드 중에서 가장 비용이 적은(최단 거리가 가장 짧은) 노드 선택

  4. 해당 노드를 거쳐서 다른 노드들로 가는 경우를 고려하여 최소 비용 갱신

  5. 3번 ~ 4번 반복

시간복잡도

  • 알고리즘의 3번에서 가장 비용이 적은 노드를 찾는 과정을 어떻게 구현하는 지에 따라 다름

  • 가장 비용이 적은 노드를 선택하는 것은 최대 V번 반복되고, 이 과정에서 비교는 최대 E번 발생하므로 선형 탐색으로 구현하는 경우, $O(V^2+E)$

  • 우선순위 큐(힙 구조)를 활용하는 경우, $O(E+VlogV)$, $O(ElogV)$으로 만들 수 있다.

    • 비교는 최대 간선의 개수만큼 발생하고 반복하는 것은 우선순위 큐에 E번 넣고 E번 꺼내가는 것과 유사 👉 $O(E+2ElogE)=O(ElogE)$

    • 이때 중복 간선이 없다면 $E < V^2$이므로 $O(ElogE)=O(ElogV^2)=O(2ElogV)=O(ElogV)$

    • 간선을 모두 우선순위 큐에 넣었다가 빼내는 것이므로 정점의 개수는 많은데 간선은 적을 때 더욱 효율적이다.

우선순위 큐 구현 방식
삽입 시간
삭제 시간

리스트

O(1)

O(N)

힙

O(logN)

O(logN)


플로이드-와샬 알고리즘

  • 변의 가중치가 음이거나 양인 그래프에서 최단 경로를 찾는 알고리즘

  • 모든 정점 쌍 간의 최단 경로를 구할 수 있다.

  • 다이나믹 프로그래밍을 활용

  • 알고리즘

def Floyd_Warshall():  
    for m in range(1, n+1):  
        for start in range(1, n+1):  
            for end in range(1, n+1):  
                g[start][end] = min(g[start][end], g[start][m] + g[m][end])
  • 시간복잡도

    최악
    최선
    평균

    $V^3$

    $V^3$

    $V^3$


벨만-포드 알고리즘

  • 음의 가중치를 가지는 간선이 있으며 가중치 합이 음인 사이클이 존재하지 않는 경우 사용

  • 가중치 합이 음인 사이클이 존재한다면 경로 합이 음수 무한대로 발산해서 그래프에서 최단 경로를 구할 수 없다.

  • 특정한 하나의 정점에서 다른 모든 정점으로 가는 최단 경로를 구함

  • 알고리즘

    1. 출발 노드 설정

    2. 최단 거리 테이블 초기화

    3. 모든 간선을 확인하여 각 간선을 거쳐 다른 노드로 가는 비용을 최단 거리 테이블에서 갱신한다. (edge relaxation)

    4. 3번 과정을 (V-1)번 반복한다.

  • 시간복잡도

    최악
    최선

    $VE$

    $E$


Previous최소 공통 조상(LCA)Next키(Key) 정리

Last updated 2 years ago

출처
출처
출처
출처