1. Max Heap (p.227)

Download Report

Transcript 1. Max Heap (p.227)

문제
• 총 6문제 중 5~6문제 해결해야 Pass
• 0~4문제 해결시 Fail
• [email protected] 로 제출할 것.
•
•
•
•
•
•
Max Heap 구현
Binary Search Tree 구현
Selection Tree 구현
Breadth First Search 구현
Kruskal’s Algorithm 구현
Dijkstra’s Algorithm 구현
1. Max Heap (p.227)
Max tree is a tree in which the key value in each node is no smaller than
the key values in its children
- the root of a max tree contains the largest key in the tree
Max heap is a complete binary tree that is also a max tree
Min tree is a tree in which the key value in each node is no larger than the
key values in its children
- the root of a max thee contains the largest key in the tree
Min heap is a complete binary tree that is also a min tree
1. Max Heap (p.227)
Insertion
1) place the element in the new node( ex. N+1th position)
2) move along the path from the new node to the root
if the element of the current node is larger than the one of its parent
then interchange them and repeat.
1개 추가된 모습
5가 추가됐을 때
21이 추가됐을 때
1. Max Heap (p.227)
새로운 node
5>2
1. Max Heap (p.227)
Deletion
1) take an item from the root of the heap
2) place the element in the node at position n to the root node and move
down the heap.
3) compare the parent node to its children and exchange elements when
the parent node has a smaller key
1개 제거된 모습
1. Max Heap (p.227)
마지막 node
15 > 2
15 > 10
14 > 10
1. Max Heap (p.227)
새로운 node 생성
root를 향해 올라가면서
적절한 위치를 탐색
찾은 위치에 새로운
정보 삽입
1. Max Heap (p.227)
최대값 저장
마지막 node 저장 후
Tree에서 제거
root부터 시작해서 내려
오면서 적절한 위치를
탐색
두 child보다 크다면 중지
두 child보다 작다면
아래 level로 이동
1. Max Heap (p.227)
Input (standard input 이용)
1) < i value > 를 이용하여 insert
2) < p >를 이용하여 max값을 pop
Output (standard output 이용)
1) insert 시 < push : value >를 이용하여
insert됨을 알려줌
2) pop 시 < pop : value >를 이용하여
tree의 최대값을 알려줌
3) pop을 했을 때 heap이 비었을 시
< The heap is empty >를 출력하고 종료
root@ocelot-virtual-machine:~/jb# ./a.out
i 14
입력
push : 14
i 12
출력
push : 12
i7
push : 7
i9
push : 9
p
pop : 14
p
pop : 12
p
pop : 9
p
pop : 7
p
The heap is empty
root@ocelot-virtual-machine:~/jb#
2. Binary Search Tree
• 정렬된 배열 속에 찾고자 하는 값이 존재하는
지를 검색하는 알고리즘
• 중앙값을 먼저 비교하여 찾고자 하는 값이 더
작다면 배열의 앞쪽의, 더 크다면 배열의 뒤
쪽의 중앙값과 재 비교 한다
• 이를 반복하여 찾고자 하는 값의 존재여부와
존재 위치를 찾아낸다.
• 시간복잡도 O(log(n))
Definition
A binary search tree (BST) is a binary tree. It may
be empty.
If it is not empty, then it satisfies the following
properties:
1. Every element has a key and no two elements have
the same key.(i.e., the keys are distinct).
2. The keys (if any) in the left subtree are smaller than
the key in the root.
3. The keys (if any) in the right subtree are larger than
the key in the root.
4. The left and right subtrees are also binary search
trees.
Searching a binary search tree
•
Search
1) If the root is NULL then search is unsuccessful.
2) Compare x with the key in the root.
3) If x is smaller than the key in the root, repeat 1) ~ 3) from the left
child
of the root. If x is larger than the key in the root, repeat 1) ~ #) from
the
right child of the root.
5
3
1
5
5
7
6
3
9
1
3
7
6
Search for number 6
9
1
7
6
9
Inserting into a binary search tree
Insert
1) Verify that the key is different from the keys of existing
elements
by searching the tree.
2) If the key already exists in BST, no insertion into a BST.
Otherwise, insert the key at the point the search terminated.
Modified_search
To inserting a key into a BST, we need to modify the search
algorithm.
1) If the tree is empty or if key already exists, it return NULL.
2) Otherwise, it returns a pointer to the last node of the tree
that was encountered during the search
Inserting a number 4
5
5
3
7
6
1
3
9
7
6
1
9
Modified search where inserting a number 4
5
5
3
1
3
7
4
6
9
1
7
4
Inserting a number 4
6
9
Deletion from a binary search tree
•
Delete
· Deletion of a leaf node
Set the corresponding child field of its parent to NULL and free the
node.
· Deletion of a nonleaf node with single child
Erase the node and then place the single child in the place of the
erased node.
· Deletion of a nonleaf node with two children
Replace the node with either largest element in its left subtree or the
smallest element in its right subtree.
Then delete this replacing element from the subtree from
which it was taken.
Note that the largest and smallest elements in a subtree are always
in a node of degree zero or one.
2. 실습 – Binary Search Tree
•
문제
•
입력
•
출력
•
팁
•
주의사항
binary search 알고리즘을 사용하여야만 정답으로 인정된다.
배열 a[]에 정렬된 int형 자료를 저장한 뒤 Binary Search Tree 알고리즘을 활용하여
recursive 혹은 iterative 하게 구현하여 특정 원소의 존재여부를 찾는다.
n
a1 a2 … an
x
can find
cannot find
: 배열에 저장된 원소개수 ( 1 <= n < 20 )
: 각각의 원소
( 1 <= ak < 1000 )
: 찾고자 하는 수
( 1 <= x < 1000 )
혹은
배열에 원소를 저장한 뒤 각자의 방법을 통해 정렬한 뒤
binary search를 적용한다.
3. Selection tree (p. 240)
K-way merge is merging k ordered sequences into a
single ordered sequence. An ordered sequence is
called a run
The merging task can be accomplished by repeatedly
outputting the record with the smallest(largest) key
The smallest(largest) key has to be found from k
possibilities and it could be the leading record in any
of the k runs
The most direct way to merge k-runs would be to
make k-1 comparisons to determine the next record
to output
For k>2, we can achieve a reduction in the number of
comparisons needed to find the next smallest
element by using the idea of a selection tree(binary
tree)
3. Selection tree (p. 240)
Input data (ordered sequence)를 어떻게 저장할 것인가?
- array, linked list, …
비어있는 run이 나타나면 어떻게 표현할 것이고,
tree에서 그를 어떻게 처리할 것인가?
Tree의 node에 어떤 정보를 저장할 것인가? (key, pointer, …)
3. Selection tree (p. 240)
4-way selection tree
Compare parent
with children
Initiate leaf
nodes
15
6
15
20
6
9
15
20
6
9
15
20
6
9
15
20
6
9
15
20
6
9
18
25
11
10
18
25
11
10
18
25
11
10
Get 6 as a smallest
number
Reset nodes with the latest
smallest number(6) to -1
-1
6
15
6
15
-1
Get a next record of
the same run had the
latest smallest
number : 11
-1
15
-1
15
20
6
9
15
20
-1
9
15
20
11
9
15
20
6
9
15
20
-1
9
15
20
11
9
18
25
11
10
18
25
11
10
18
25
10
20
3. Selection tree (p. 240)
4-way selection tree
Do next tournament :
Winner 9
Reset nodes with the latest
smallest number(9) to -1
9
15
9
-1
15
-1
Get a next record of
the same run had the
latest smallest
number : 10
-1
15
-1
15
20
11
9
15
20
11
-1
15
20
11
10
15
20
11
9
15
20
11
-1
15
20
11
10
18
25
10
18
25
10
18
25
Do next tournament :
Winner 10
Reset nodes with the latest
smallest number(10) to -1
10
15
10
Do next tournament :
Winner 11
-1
15
-1
11
15
11
15
20
11
10
15
20
11
-1
15
20
11
-1
15
20
11
10
15
20
11
-1
15
20
11
-1
18
25
18
25
18
25
21
3. Selection tree (p. 240)
4-way selection tree
Reset nodes with the latest
smallest number(11) to -1
Do next tournament :
Winner 15
-1
15
-1
Reset nodes with the latest
smallest number(15) to -1
15
15
-1
-1
-1
-1
15
20
-1
-1
15
20
-1
-1
-1
20
-1
-1
15
20
-1
-1
15
20
-1
-1
-1
20
-1
-1
18
25
18
25
18
25
Get a next record of
the same run had the
latest smallest
number : 18
Do next tournament :
Winner 18
-1
-1
-1
18
25
18
-1
25
-1
18
20
-1
-1
18
20
-1
-1
-1
25
-1
-1
18
20
-1
-1
18
20
-1
-1
-1
25
-1
-1
25
25
22
3. Selection tree (p. 240)
Input (standard input 이용)
line 1 : run의 개수
line 2 ~ : 각 run이 가지는
key의 개수와 key value
Output (standard output 이용)
merge 된 run의 key value를
nondecreasing order로 출력
8
3
3
3
4
3
3
3
3
10 15 16
9 20 38
20 20 30
6 15 25 28
8 15 50
9 11 16
90 95 99
17 18 20
6
8
9
9
10
11
15
15
15
16
16
17
18
20
20
20
20
25
28
30
38
50
90
95
99
4. Breadth First Search
그래프(트리)의 한 지점에서 시작하여 인접한 모든 노드를 우선적으로 검
색한 뒤, 한 단계 더 깊은 레벨의 노드에 대하여 검색을 수행한다.
Queue 자료구조를 활용하여 한 노드에 연결된 다음 모든 level의 노드를
queue에 push한 뒤, 하나씩 pop을 통해 꺼내어 검색을 하게 된다.
시간복잡도 O( |V| + |E| )
BFS
내가 여러 명으로 복사 되어
동시에 여러 길을 가보는 것!
BFS code
4. 실습 – Breadth First Search
•
문제
•
입력
•
입력 예제
4
1
3
4
2
1
•
출력
•
팁
그래프를 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오.
단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고,
더 이상 방문할 수 있는 점이 없는 경우 종료한다.
첫째 줄에 정점의 개수 N(1≤N≤100), 간선의 개수 M(1≤M≤1000), 탐색을 시작할 정점의 번호 V가 주어진다.
다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. ( 방향이 없는 간선이다 )
51
3
4
1
4
2
: 4개의 vertex , 5개의 edge , root node = 1
: 여기서부터 5개의 edge들의 정보가 표현된다.
1234
간선 정보를 시작 정점 기준으로 오름차순으로 정렬하여 정점 번호가 작은 것을 먼저 탐색할 수 있도록 한다.
방향이 없는 간선이므로 간선정보 1 2 인 경우 1->2 , 2->1 두 개의 edge로 나누어 저장한다.
Flag를 두어 이미 방문한 node를 check하여 재 방문하지 않도록 한다.
5. Kruskal algorithm (p.294)
Kruskal’s algorithm builds a minimum cost spanning tree T by adding edges
to T one at a time.
Selects the edges for inclusion in T in nondecreasing order of their cost.
An edge is added to T if it does not form a cycle with the edges that are
already in T
Build minimum cost spanning tree
5. Kruskal algorithm (p.294)
Cycle이 생기므로 제외
사이클 확인
• 크루스칼 알고리즘에서 간선을 선택할 때
마다 각 간선이 사이클을 이루는지 확인을
해야 한다.
• 이 때, Disjoint-set (Union-Find)를 사용한
다.
Union-find
• 먼저, 각 정점은 자기 자신을 부모로 하는
트리로 만든다.
• P[i] = i번 정점의 부모 라고 했을 때,
• P[i] = i 이면 트리의 루트이다.
• 따라서, 맨 처음에 모든 P[i] = i이다.
Union-find
• 간선 (u,v)가 사이클을 형성하는지를 판별
하려면, 두 정점 u와 v가 같은 트리에 있는
지를 확인하면 된다.
• 두 정점 u와 v가 같은 트리에 있다면, u와
v의 루트가 같아야 한다.
• 따라서, 루트를 찾는 코드를 작성해볼 수
있다.
Union-find에서 find
• int find(int x) {
•
if (x == P[x]) return x;
•
else return find(P[x]);
• }
Union-find
• 선택한 간선(u,v)이 사이클을 이루지 않아,
선택하는 경우에는 두 정점을 같은 트리에
넣어주어야 한다.
• Find 함수를 이용해서 이전 단계에서 루트
를 찾았기 때문에, 루트와 루트를 연결해
주면 된다.
• P[u] = v;
Union-Find 속도 향상
• 최악의 경우에는 트리가 Skewed tree (사
향 트리)가 되 find 함수의 시간 복잡도가
O(N)이 될 수 있다.
• 따라서, 다음과 같이 find 함수를 수정해
사용하면 복잡도는 O(α)이 된다. α는 아무
리 커봐야 4정도이므로 상수라고 생각하
면 된다.
Union-Find Find 함수 수정
• int find(int x) {
•
if (x == P[x]) return x;
•
else return P[x] = find(P[x]);
• }
InputData의 저장
• Kruskal 알고리즘은 간선의 가중치를 이용
해서 저장하기 때문에, 간선의 양끝점과
가중치를 구조체를 이용해서 저장하는 것
이 좋다.
• struct Edge {
•
int u,v,cost;
• };
Input data의 정렬
• 앞에서 설명한 Edge 구조체를 cost를 기준
으로 오름차순 정렬을 하고 풀면 된다.
알고리즘
• 1. cost를 기준으로 정렬한다.
• 2. 각각의 간선 (u,v)에 대해서
– (1) u와 v가 같은 트리인지 살펴본다.
– (2) 같은 트리가 아니라면, 그 간선을 선택한
다.
• 3. 끝.
5. Kruskal algorithm (p.294)
cycle이 생기지 않는다면
T 에 edge를 추가,
생긴다면 해당 edge 무시
Input data (V, E)를 어떻게 저장할 것인가?
Cycle이 생기는지를 어떻게 찾아낼 것인가?
Spanning tree는 n-1개의
Edge를 가짐
5. Kruskal algorithm (p.294)
Input (standard input 이용)
line 1 : V와 E의 개수
line 2 ~ : 각 edge의
< v1 v2 cost >
Output (standard output 이용)
line 1 ~ : 연결된 edge의 정보 출력
< v1, v2, cost>
last line : total cost 출력
7
3
2
1
0
1
3
4
0
4
9
4
3
6
1
2
6
6
5
5
22
12
14
28
16
18
24
10
25
1:<
2:<
3:<
4:<
5:<
6:<
result
0, 5,
2, 3,
1, 6,
1, 2,
3, 4,
4, 5,
: 99
10
12
14
16
22
25
>
>
>
>
>
>
6. Dijkstra’s Algorithm
• 그래프상에서 단일 출발점에서 모든 지점까지의 최단거
리를 구하는 알고리즘
• 어떤 간선도 음수 값을 갖지 않는 방향 그래프에서 주어
진 출발점과 도착점 사이의 최단 경로 문제를 풀기 위한
알고리즘
• 시간복잡도 O( |V|^2 )
6. Dijkstra’s Algorithm
• 과정
1. 정점과 간선을 입력 받는다.
2. 시작점으로부터 자신 주변에 있는 정점까지 경로 길이
를 저장할 곳을 준비하고 무한대로 초기화
3. 시작 정점의 경로 길이는 0
4. 최단 경로에 추가된 정점의 인접 정점들에 대해 경로 길
이를 갱신하고 이들을 최단 경로에 추가. 추가하려는 인
접 정점이 최단 경로 안에 존재할 경우, 새로 추가된 경
로 길이가 이전에 존재하는 경로 길이보다 짧다면 새로
추가된 경로 길이로 수정.
5. 모든 정점이 최단 경로로 소속될 때까지 반복
6. Dijkstra’s Algorithm
1
INF
2
0
s
1
2
2
2
5
3
1
3
2
3
INF
4
6
5
0
INF
INF
s
1
d
2
5
3
1
2
2
INF
3
0
3
4
6
5
INF
s
1
d
INF
4
5
2
2
0
s
2
5
3
1
2
2
1
최소경로 완성!!
3
5
0
3
6
4
7
d
s
2
5
3
1
5
3
1
1
INF
3
5
3
6
4
7
d
2
3
3
6
5
4
INF
d
6. Dijkstra’s Algorithm
• 그림 설명
1. 시작점에서 시작점의 거리를 뜻하므로 0
2. 1번 정점에서 2번 정점까지 경로는 1가지이므로 2
3. 1번 정점에서 3번 정점까지 도달하는 경우의 수는
2가지이므로 최소 경로 선택
4. 1번 정점에서 4번 정점까지 가는 경우의 수는 3가지
5. 더 이상 추가될 것이 없으므로 최소 경로 완성
-> 1번에서 5번으로는 갈 수 없다.
6. Dijkstra’s Algorithm
#include <stdbool.h>
#include <limits.h>
#define INT_MAX 5000
Typedef int weight;
Weight infinity = INT_MAX;
Int undefined = -1;
Void dijkstra(int n, const weight w[][n], int s, weight d[])
{
bool is_in_S[n]; // flag 값
for (int v = 0; v < n; ++ v){
d[v] = infinity;
is_in_S[v] = false;
}
초기 시작점에서 정점의 거리는
max 값으로 초기화
d[s] = 0;
for (;;) {
weight min = infinity;
int u = undefined;
for (int v = 0; v < n; ++ v)
if (!is_in_S[v] && min > d[v])
min = d[v], u = v;
if (u == undefined) // 추가로 도달할 수 있는 점이 없다.
break;
is_in_S[u] = true;
for (int v = 0; v < n; ++ v)
if (w[u][v] != infinity && d[v] > d[u] + w[u][v])
d[v] = d[u] + w[u][v];
}
}
s에서 v까지의 최단경로는 u까지의 최단경
로에 링크 (u, v)를 연장함으로써 얻을 수
있다. 이 경로의 비용은 d[u]+w(u, v)가 되
며, 이 비용이 현재의 d[v] 값보다 낮으
면 d[v]를 새로운 값으로 바꾼다
6. 실습 – Dijkstra
•
문제
•
입력
•
입력 예제
방향그래프가 주어지면 주어진 시작점에서 다른 모든 정점으로의 최단 경로를 구하는 프로그램을 작성하시오.
단, 모든 간선의 가중치는 10 이하의 자연수이다.
첫째 줄에 정점의 개수 V와 간선의 개수 E가 주어진다. (1≤V≤20,000, 1≤E≤300,000) 모든 정점에는 1부터 V까지 번호가
매겨져 있다고 가정한다. 둘째 줄에는 시작 정점의 번호 K(1≤K≤V)가 주어진다. 셋째 줄부터 E개의 줄에 걸쳐 각 간선을
나타내는 세 개의 정수 (u, v, w)가 순서대로 주어진다. 이는 u에서 v로 가는 가중치 w인 간선이 존재한다는 뜻이다.
u와 v는 서로 다르며 w는 10 이하의 자연수이다
5
1
5
1
1
2
2
3
•
출력
•
출력 예제
•
팁
6
1
2
3
3
4
4
1
2
3
4
5
6
첫째 줄부터 V개의 줄에 걸쳐, 모든 정점으로의 최단 경로의 경로 값을 출력한다.
시작점 자신은 0으로 출력하고, 경로가 존재하지 않는 경우에는 INF를 출력하면 된다.
0
2
3
7
INF
방향이 있는 간선이므로 링크드리스트에 저장 시 방향에 주의한다.