CS/Algorithm

    정렬 알고리즘 비교

    정렬 알고리즘 비교

    bubble: 인접한 두개의 원소를 비교하여 자리를 교환하는 방식 첫번쨰 원소부터 인접한 원소끼리 계속 자리를 교환 한 단계가 끝나면 가장 큰 원소가 마지막 자리에 고정 정렬이 되어있어도 모든 수를 다 확인하기 때문에 가장 비효율적인 정렬 알고리즘 selection: 기준 위치에 맞는 원소를 선택하고 자리를 교환하는 방식 원소를 돌며 가장 작은 값을 찾는다. 첫번째 원소와 바꿔준다. 첫번째 원소를 제외하고 원소를 돌며 가장 작은 값을 찾는다. 두번째 원소와 바꿔준다. 계속 진행 버블 정렬을 일부 개선함 insertion: 정렬되어 있는 부분 집합에 정렬할 새로운 원소의 위치를 삽입하는 방식 정렬된 집합 S와 정렬되지 않은 집합 U로 나눈다. U에서 맨 앞의 원소를 꺼내서 S의 맨 뒤부터 비교해준다. 자신..

    힙 정렬(heap sort)

    힙 정렬(heap sort)

    📔 힙 정렬(heap sort) 이란 힙트리구조를 이용하여 정렬하는 알고리즘 힙트리: 최솟값이나 최댓값을 빠르게 찾아내기 위해 완전 이진 트리를 기반으로 하는 트리 힙정렬을 하기 위해서는 먼저 힙 구조를 가지도록 만들어야 한다. 히피파이 알고리즘을 통해 힙구조로 만든다. 모든 정점에 대해서 히피파이를 수행하므로 n x logn 의 시간복잡도를 가진다. 사실상 모든 정점이 아니라 절반의 정점만 해도 가능하다 n/2 x logn => (n/2이 logn 보다 크다고 가정할 때) => 결국 O(n) 의 시간복잡도를 가진다. 📔 힙 정렬(heap sort) 구현 # (최대)힙 구조 만들기 def heapify(): for i in range(1, N): c = i while c > 0: root = (c - 1..

    위상 정렬(topology sort)

    위상 정렬(topology sort)

    📔 위상 정렬(topology sort) 이란 순서가 정해져 있는 작업을 차례로 수행해야 할 때 그 순서를 결정해주기 위해 사용하는 알고리즘 어떤 일을 하는 순서를 찾는 알고리즘 방향 그래프에 존재하는 각 정점들의 선행 순서를 위배하지 않으면서 모든 정점을 나열하는 것 선행 조건이 반드시 수행되어야 다음을 진행할 수 있다! 위의 그림을 보면 아비터트리뷰널을 짓기 위해서는 템플러아카이브와 스타게이트가 둘다 있어야 한다. 시간복잡도: O(V+E) | V-노드의 수, E-간선의 수 📔 위상 정렬(topology sort) 구현 큐와 스택을 사용할 수 있다. 일반적으로 큐를 사용 진입 차수( 현재 노드에 들어올 수 있는 노드의 수 ) 가 0인 정점을 큐에 삽입 (그림의 사이버네틱스코어) 큐에서 원소를 꺼내 연결..

    플로이드 와샬(Floyd Warshall)

    플로이드 와샬(Floyd Warshall)

    📔 플로이드 와샬(Floyd Warshall) 란 플로이드-워셜 알고리즘(Floyd-Warshall Algorithm)은 그래프에서 모든 꼭짓점 사이의 최단 경로의 거리를 구하는 알고리즘이다. 음수 가중치를 갖는 간선도 순환만 없다면 잘 처리된다. 제일 바깥쪽 반복문은 거쳐가는 꼭짓점이고, 두 번째 반복문은 출발하는 꼭짓점, 세 번째 반복문은 도착하는 꼭짓점이다. 이 알고리즘은 플로이드 알고리즘이라고도 알려져 있다. ( 출처: 위키백과 ) 모든 정점에서 모든 정점으로의 최단 경로를 구하는 것! 거쳐가는 정점을 기준으로 구한다. 다이나믹 프로그래밍 기법을 이용 다익스트라의 경우 한 정점에서 모든 정점까지 의 최단 경로 반복문이 3개이므로 시간복잡도는 O(N^3) 이다. 하지만 코드는 매우 간단하다. 📔 플..

    에라토스테네스의 체(Sieve Of Eratosthenes)

    에라토스테네스의 체(Sieve Of Eratosthenes)

    📔 에라토스테네스의 체(Sieve Of Eratosthenes) 란 대표적인 소수 판별 알고리즘 ( 소수: Prime Number ) 한꺼번에 많은 숫자의 소수를 판별할 때 사용 숫자 한개의 소수를 판별하는 기본 소수 판별 알고리즘의 시간복잡도는 O(N) 하지만 수학적으로 접근해서 시간복잡도를 O(N^(1/2)) 까지 줄일 수 있다. 에라토스테네스의 체를 사용하면 시간복잡도는 O(n log log n) 📔 에라토스테네스의 체(Sieve Of Eratosthenes) 구현 자연수 50까지의 숫자 중에서 소수를 구한다고 생각해보자. 기본 알고리즘을 사용할 경우 O(N*N^(1/2)) 의 시간복잡도가 생긴다. 에라토스테네스의 체를 이용하여 구해보자. 먼저 51개의 값이 1(True)인 리스트를 만든다. for..

    다익스트라(dijkstra)

    다익스트라(dijkstra)

    📔 다익스트라(dijkstra) 란 다익스트라를 들어가기 전에... 최단 경로란 간선의 가중치가 있는 그래프에서 두 정점 사이의 경로들 중 간선의 가중치의 합이 최소인 경로 간선의 가중치가 균일(1)할 경우 BFS를 사용 음의 가중치를 허용하지 않음 하나의 시작 정점에서 끝 정점까지의 최단경로 시작 정점에서 거리가 최소인 정점을 선택해 나가면서 최단 경로를 구하는 방식이다. 시작 정점(s) 에서 끝 정점(t) 까지의 최단 경로에 정점 x 가 존재한다. 이때, 최단 경로는 s 에서 x 까지의 최단경로와 x 에서 t 까지의 최단경로로 구성된다. 탐욕 기법을 사용한 알고리즘으로 MST의 프림 알고리즘과 유사하다. 아래 코드의 경우 시간복잡도는 O(N^2) 이다. 만약 우선순위큐를 이용하게 된다면 O(NlogN..