Graph
- 노드,정점 (Node)와 간선 (Egde)로 구성
- 들어오는 간선 수를 indegree
- 나가는 간선 수를 outdegree
- 최단거리 구하기..
저장하는 방법 - 인접행렬
방향성을 추가하면?
가중치를 추가하면?
sparse 한 그래프라면? - 인접리스트
- 0이 차지하는 비율이 절반 이상(sparse) 이므로 메모리 낭비 - 인접리스트로 표현
- (도착지, 가중치)
- 1의 indegree - 0 / outdegree - 3
Tree
- 노드,정점 (Node)와 간선 (Egde)로 구성
- 상위 하위 관계를 나눌 수 있음
- 싸이클이 없다.
- 모든 노드가 연결이 되어야 한다.
- 간선의 수는 N-1, 노드의 수는 N개이다.
Tree에서 사용하는 명칭
- 부모(Parent)와 자식(Child)
- 선조(Ancestor)와 자손(Descendant)
- 뿌리(Root)와 잎(Leaf)
Tree 저장방식
- 부모만 저장 : 1개만 저장
- 1 2 3 4 5 6 7 8
-
- O(N) 1차원 배열에 저장
- 장점 : 선조에 대한 노드를 재귀적으로 따라갈 수 있다.
- 자식들까지 저장 : root에서 뻗어나가기 쉬움
- 장점 : 순환하기 좋다.
Tree 예제 1
- 총 9명이 존재
- 7번 노드와 3번 노드 사이의 촌수를 구하고 싶다.
- 부모자식 관계는 총 7개가 있다.
- 공통된 조상이 있어야 촌수가 존재한다.
- 공통 조상(LCA) 으로 부터의 각각의 거리의 합 = 촌수
N = int(input())
A, B = map(int, input().split()) // 7명 입력 받기
p = [0 for_ in range(N+1)] // 관계 저장, 7개의 관계 부모 초기값 0으로 지정
for _ in range(int(input())):
x, y = map(int, input())
p[y] = x // y의 부모는 x로 지정
Aa, Ba = [], [] // 자신을 포함한 자신들의 조상을 올려보냄
Ad, Bd = 0, 0 // 나와의 촌수
while p[A] > 0: // 최상단 부모를 찾을 때 까지
Aa.append((A, Ad))
Ad += 1
A = p[A]
// A가 3일 때
// 3의 부모인 1이 p[A]가 되고
// 3과 1의 가중치를 Ad로 넣고
// 해당 부모인 p[A]는 나 자신 A가 된다.
while p[B] > 0: // 최상단 부모를 찾을 때 까지
Ba.append((B, Bd))
Bd += 1
B = p[B]
for i in Aa:
for j in Ba;
if i[0] == j[0]: // 첫번째 조상이 같을 경우
print(i[1] + j[1]) // 촌수 출력
exit()
print(-1)
이진트리
- 부모 노드가 X 이면, 왼쪽 노드가 2X 오른쪽 노드가 2X+1
- 이진트리를 바탕으로 Heap과 Bst가 나타남
Tree 예제 2
- 이진트리
- 나를 2로 나눈 몫은 무조건 부모이다.
- 33, 79의 공통 부모 찾기
while not a==b:
if a>b: a//=2
else: b//=2
print(a)
Heap
- 우선순위가 가장 높은 값을 Root 노드로 만듦
- 첫째 루트는 랜덤하게 지정하고 값을 붙이면서 크기가 큰 값이 root 가 되도록 설정함
- 가장 큰 값이 최상단 ROOT가 되어야 한다
- 큰 이진트리가 있다고 가정할 때, 총 갯수는?
- 높이가 N일 때, 2^(N+1) -1개
- 제일 하단 노드부터 제일 상단 노드로 올라갈 때 까지의 시간복잡도는?
- O(N)
- 총 개수는 대략 2^N 이고, 이를 K로 표현하면,
N = log2K
O(logN)
Binary Search Tree (BST)
- 나보다 작은건 왼쪽으로, 큰건 오른쪽으로
- 검색의 시간 복잡도 O(logN)
- 단점 : 한쪽 ( 왼쪽 or 오른쪽 )으로 치우쳐질 수 있다 ( 메모리 낭비 )
'Algorithm > basic' 카테고리의 다른 글
stack/queue/deque (0) | 2021.07.22 |
---|---|
sort (select/bubble/quick/merge/radix) (0) | 2021.07.22 |
수학 (진수와진법/최대공약수/최소공배수/소인수분해, 재귀함수) (0) | 2021.07.20 |
읽기와 분석 (시간복잡도/공간복잡도 등) (0) | 2021.07.15 |