Loading...
2022. 10. 18. 01:33

우선순위 큐로 중앙값을 빠르게 구하는 방법 - running median

1. 개요 수열이 계속 변화할때, 이 수열의 중앙값을 어떻게 빠르게 구할 수 있을까 매번 정렬해서 중간의 값을 찾아야하는가? 최대 힙과 최소 힙을 이용하면 중앙값을 아주 쉽게 찾을 수 있다 결론부터 말하자면, (크기와는 무관하게) 항의 순서대로 수열이 주어질때 최대힙에 들어간 원소의 수와 최소힙에 들어간 원소의 수가 서로 같을 때는 최대힙에 수를 넣어주고 최대힙의 원소의 수가 최소힙의 원소의 수보다 1개 더 많을때는 최소힙에 수를 넣어준다 즉 항상 최대힙 > 최소힙 > 최대힙 > 최소힙 >.. 으로 번갈아가면서 수를 넣어준다. 힙은 완벽하게 정렬해주지는 않지만, 루트에는 최소힙이면 힙에 들어간 원소들 중 최솟값이, 최대힙이면 힙에 들어간 원소들 중 최댓값이 온다는건 확실하다 최대힙에 원소를 넣으면 최대힙..

2022. 10. 3. 22:19

자다가도 일어나서 바로 구현할 수 있어야하는 최단경로를 찾는 다익스트라 알고리즘 최적화하기 2편

1. 개요 다익스트라 알고리즘을 간단히 구현하면 시간 복잡도가 $O(V^{2})$이지만 이제부터 배울 구현 방법을 이용하면 최악의 경우에도 $O(ElogV)$를 보장하여 해결할 수 있다. 여기서 V는 노드의 개수이고 E는 간선의 개수이다. 간단한 다익스트라 알고리즘은 "최단 거리가 가장 짧은 노드"를 찾기 위해 매번 최단 거리 테이블을 선형적으로 (모든 원소를 앞에서부터 하나씩) 탐색해야 했다. 이 과정에서만 O(V)의 시간이 걸린다. 하지만 최단 거리가 가장 짧은 노드를 단순히 선형적으로 찾는 것이 아니라 더욱 더 빠르게 찾을 수 있다면 어떨까? 개선된 다익스트라 알고리즘에서는 힙 자료구조를 사용한다. 힙 자료구조를 이용하면 특정 노드까지의 최단 거리에 대한 정보를 힙에 담아 처리하므로, 출발 노드부터..

2022. 10. 3. 02:38

최소 신장 트리를 찾는 두번째 알고리즘 - 프림 알고리즘 파헤치기 -

1. 개요 가중치가 있는 무방향 그래프에서 최소 신장 트리를 찾는 대표적인 알고리즘 중 하나이다. 크루스칼 알고리즘이 간선들을 선택해가면서 최소 신장 트리를 구성하는 반면에 프림 알고리즘은 정점을 선택하고, 인접한 정점 중에서 최소 비용을 가지는 간선을 하나씩 선택해가면서 최소 신장 트리를 구성하는 일종의 그리디 알고리즘이다. 다익스트라 알고리즘과 사실상 동일한 알고리즘이다. 참고로 다익스트라 알고리즘은 음수 가중치에서는 동작하지 않지만, 프림 알고리즘은 음수 가중치에서도 동작한다고 한다 2. 알고리즘 2-1) 임의의 정점을 하나 선택해서 최초의 트리를 구성 2-2) 선택한 정점과 트리에 포함된 정점들과 인접한 정점중 최소 비용의 간선이 존재하는 정점을 선택한다 2-3) 모든 정점이 선택될 때까지 위 과..

2022. 10. 2. 02:45

최대힙, 최소힙 직접 구현하기

1. 힙(heap) 프로그램 실행중에 내가 사용할 수 있는 메모리 양이 변할 수 있는 경우, 그 때 사용하는 메모리 공간을 힙이라고도 하는데.. 여기서는 자료구조를 말한다. 기본적으로 "완전 이진 트리"를 이용한 자료구조이다. 특히 "완전 이진 트리"에 있는 노드 중에서 키값이 가장 큰 노드나 가장 작은 노드를 찾기 위해 특별히 만든 자료구조 완전 이진 트리니까, n개의 노드가 주어진다면 길이 n+1의 단순 배열로 저장할 수 있다 처음에 만들때, 키값이 가장 큰 노드를 찾는 자료구조를 만들 것이냐, 키값이 가장 작은 노드를 찾는 자료구조를 만들 것이냐,를 정하고 들어간다. 2. 최대힙(max heap)과 최소힙(min heap) 2-1) 최대힙(max heap) 키값이 가장 큰 노드를 찾기 위한 완전 이..

2022. 9. 13. 06:46

트리 이론 기본편4 -이진 탐색 트리 + heap(힙) 간단하게-

1. 수식 트리(expression binary tree) 수식을 표현하는 이진 트리 수식 이진 트리라고도 부른다 연산자는 루트 노드이거나 가지 노드 루트와 잎 사이의 중간 노드들을 가지 노드라고 하나봐 피연산자는 모두 잎 노드에 존재함 전위, 중위, 후위순회를 이용해서 순회하면 수식의 전위표기법, 중위표기법, 후위표기법이 된다 2. 예시 다음과 같은 트리를 전위, 중위, 후위순회 해서 전위표기법, 중위표기법, 후위표기법을 구해보면? 2-1) 구현 예시 #class 정의 class Node: def __init__(self,data): self.data = data self.left = None self.right = None #tree 정의 root = Node('+') root.left = Node(..