Post

🦊 4. Trees and Graphs

4. Trees and Graphs

트리의 μ’…λ₯˜

νŠΈλ¦¬λŠ” λ…Έλ“œλ‘œ 이루어진 μžλ£Œκ΅¬μ‘°μ΄λ‹€.

  • νŠΈλ¦¬λŠ” ν•˜λ‚˜μ˜ 루트 λ…Έλ“œλ₯Ό κ°–λŠ”λ‹€.
  • 루트 λ…Έλ“œλŠ” 0개 μ΄μƒμ˜ μžμ‹ λ…Έλ“œλ₯Ό 가진닀.
  • κ·Έ μžμ‹ λ…Έλ“œ λ˜ν•œ 0개 μ΄μƒμ˜ μžμ‹ λ…Έλ“œλ₯Ό 가지며 μ΄λŠ” 반볡적으둜 μ •μ˜λœλ‹€.

νŠΈλ¦¬μ—λŠ” 사이클이 μ‘΄μž¬ν•  수 μ—†λ‹€.

λ…Έλ“œλ“€μ€ νŠΉμ • μˆœμ„œλ‘œ λ‚˜μ—΄λ  μˆ˜λ„ 있고 그렇지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

각 λ…Έλ“œλŠ” μ–΄λ– ν•œ μžλ£Œν˜•μœΌλ‘œλ„ ν‘œν˜„ κ°€λŠ₯ν•˜λ‹€.

각 λ…Έλ“œλŠ” λΆ€λͺ¨ λ…Έλ“œλ‘œμ˜ 연결이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλ‹€.

1
2
3
4
Class Node {
	public String name;
	public Node[] children;
}

이 λ…Έλ“œ 클래슀λ₯Ό ν¬ν•¨ν•˜λŠ” Tree 클래슀λ₯Ό μ •μ˜ν•  μˆ˜λ„ μžˆλ‹€.

λ©΄μ ‘ λ¬Έμ œμ—μ„œλŠ” μΌλ°˜μ μ€ Tree 클래슀λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

트리 및 κ·Έλž˜ν”„ λ¬Έμ œλ“€μ€ λŒ€λΆ€λΆ„ 세뢀사항이 λͺ¨ν˜Έν•˜κ±°λ‚˜ κ°€μ • μžμ²΄κ°€ ν‹€λ¦° κ²½μš°κ°€ λ§Žλ‹€.

λ‹€μŒ μ΄μŠˆλ“€μ— μœ μ˜ν•˜κ³  ν•„μš”ν•˜λ©΄ λͺ…ν™•ν•˜κ²Œ ν•΄ 쀄 것을 μš”κ΅¬ν•˜μž.

트리 vs 이진 트리

이진 νŠΈλ¦¬λŠ” 각 λ…Έλ“œκ°€ μ΅œλŒ€ 두 개의 μžμ‹μ„ κ°–λŠ” νŠΈλ¦¬μ΄λ‹€.

λͺ¨λ“  νŠΈλ¦¬κ°€ 이진 νŠΈλ¦¬λŠ” μ•„λ‹ˆλ‹€.

μ’…μ’… 이진 νŠΈλ¦¬κ°€ μ•„λ‹Œ 트리λ₯Ό 닀뀄야 ν•œλ‹€.

예λ₯Ό λ“€μ–΄ μ „ν™”λ²ˆν˜Έλ₯Ό ν‘œν˜ˆν•  λ•Œ 트리λ₯Ό μ‚¬μš©ν•œλ‹€κ³  κ°€μ •ν•˜λ©΄,

각 λ…Έλ“œκ°€ 10개의 μžμ‹ (0 ~ 9)을 κ°–λŠ” 10μ°¨ 트리λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

μžμ‹μ΄ μ—†λŠ” λ…Έλ“œλŠ” 말단 λ…Έλ“œ 라고 λΆ€λ₯Έλ‹€.

이진 트리 vs 이진 탐색 트리

이진 탐색 νŠΈλ¦¬λŠ” λͺ¨λ“  λ…Έλ“œκ°€ λ‹€μŒ 쑰건을 λ§Œμ‘±ν•˜λŠ” νŠΈλ¦¬μ΄λ‹€.

1
'λͺ¨λ“  μ™Όμͺ½ μžμ‹λ“€ <= n < 'λͺ¨λ“  였λ₯Έμͺ½ μžμ‹λ“€' 속성이 λͺ¨λ“  λ…Έλ“œ n에 λŒ€ν•΄ λ°˜λ“œμ‹œ 참이닀.

λ‹€μŒ μ™Όμͺ½ νŠΈλ¦¬λŠ” 이진 탐색 νŠΈλ¦¬μ΄μ§€λ§Œ 였λ₯Έμͺ½μ€ 12κ°€ 8의 μ™Όμͺ½μ— 있기 λ•Œλ¬Έμ— 이진 탐색 νŠΈλ¦¬κ°€ μ•„λ‹ˆλ‹€.

κ· ν˜• vs λΉ„κ· ν˜•

κ· ν˜• 트리의 일반적인 μœ ν˜•μœΌλ‘œλŠ” λ ˆλ“œ-λΈ”λž™νŠΈλ¦¬μ™€ AVL νŠΈλ¦¬κ°€ μžˆλ‹€.

λ§Žμ€ νŠΈλ¦¬κ°€ κ· ν˜• μž‘ν˜€ 있긴 ν•˜μ§€λ§Œ μ „λΆ€ 그런 것은 μ•„λ‹ˆλ‹€.

κ· ν˜•μ„ μž‘λŠ”λ‹€λŠ” 것이 μ™Όμͺ½κ³Ό 였λ₯Έμͺ½ λΆ€λΆ„ 트리의 크기가 μ™„μ „νžˆ κ°™κ²Œ ν•˜λŠ” 것을 μ˜λ―Έν•˜μ§€λŠ” μ•ŠλŠ”λ‹€.

μ™„μ „ 이진 트리

μ™„μ „ 이진 νŠΈλ¦¬λŠ” 트리의 λͺ¨λ“  λ†’μ΄μ—μ„œ λ…Έλ“œκ°€ 꽉 μ°¨ μžˆλŠ” 이진 νŠΈλ¦¬μ΄λ‹€.

λ§ˆμ§€λ§‰ 레벨이 꽉 μ°¨ μžˆμ§€ μ•Šμ•„λ„ λ˜μ§€λ§Œ λ…Έλ“œκ°€ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ 순차적으둜 μ±„μ›Œμ Έμ•Ό ν•œλ‹€.

μ „ 이진 트리

μ „ 이진 νŠΈλ¦¬λŠ” λͺ¨λ“  λ…Έλ“œμ˜ μžμ‹μ΄ μ—†κ±°λ‚˜ μ •ν™•νžˆ 두 개 μžˆλŠ” 경우λ₯Ό λ§ν•œλ‹€.

μžμ‹μ΄ ν•˜λ‚˜λ§Œ μžˆλŠ” λ…Έλ“œκ°€ μ‘΄μž¬ν•΄μ„œλŠ” μ•ˆ λœλ‹€.

포화 이진 트리

포화 이진 νŠΈλ¦¬λŠ” μ „ 이진 νŠΈλ¦¬μ΄λ©΄μ„œ μ™„μ „ 이진 틀인 경우λ₯Ό λ§ν•œλ‹€.

λͺ¨λ“  말단 λ…Έλ“œκ°€ 같은 λ ˆλ²¨μ— 있고 λ§ˆμ§€λ§‰ 레벨의 λ…Έλ“œμ˜ κ°œμˆ˜κ°€ μ΅œλŒ€μ΄μ–΄μ•Ό ν•œλ‹€.

이진 트리 순회

μ€‘μœ„ 순회

μ€‘μœ„μˆœνšŒ(in-order traversal)λŠ” μ™Όμͺ½ 가지 β†’ ν˜„μž¬ β†’ 였λ₯Έμͺ½ 가지 μˆœμ„œλ‘œ λ…Έλ“œλ₯Ό λ°©λ¬Έν•œλ‹€.

이진 탐색 트리λ₯Ό μ€‘μœ„ μˆœνšŒν•˜λ©΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°©λ¬Έν•˜κ²Œ λœλ‹€.

1
2
3
4
5
6
7
void inOrderTraversal(TreeNode node) {
	if (node != null) {
		inOrderTraversal(node.left);
		visit(node);
		inOrderTraversal(node.right);
	}
}

μ „μœ„ 순회

μ „μœ„μˆœνšŒ(pre-order traversal)은 μžμ‹ λ…Έλ“œλ³΄λ‹€ ν˜„μž¬ λ…Έλ“œλ₯Ό λ¨Όμ € λ°©λ¬Έν•˜λŠ” 방법이닀.

κ°€μž₯ λ¨Όμ € λ°©λ¬Έν•˜κ²Œ λ˜λŠ” λ…Έλ“œλŠ” μ–Έμ œλ‚˜ λ£¨νŠΈμ΄λ‹€.

1
2
3
4
5
6
7
void preOrderTraversal(TreeNode node) {
	if (node != null) {
		visit(node);
		preOrderTraversal(node.left);
		preOrderTraversal(node.right);
	}
}

ν›„μœ„ 순회

ν›„μœ„μˆœνšŒ(post-order traversal)λŠ” λͺ¨λ“  μžμ‹ λ…Έλ“œλ“€μ„ λ¨Όμ € λ°©λ¬Έν•œ λ’€ λ§ˆμ§€λ§‰μ— ν˜„μž¬ λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜λŠ” 방법을 λ§ν•œλ‹€.

κ°€μž₯ λ§ˆμ§€λ§‰μ— λ°©λ¬Έν•˜κ²Œ 될 λ…Έλ“œλŠ” 항상 λ£¨νŠΈμ΄λ‹€.

1
2
3
4
5
6
7
void postOrderTraversal(TreeNode node) {
	if (node != null) {
		postOrderTraversal(node.left);
		postOrderTraversal(node.right);
		visit(node);
	}
}

이진 νž™(μ΅œμ†Œνž™κ³Ό μ΅œλŒ€νž™)

μ΅œμ†Œνž™μ€ 트리의 λ§ˆμ§€λ§‰ λ‹¨κ³„μ—μ„œ 였λ₯Έμͺ½ 뢀뢄을 λΊ€ λ‚˜λ¨Έμ§€ 뢀뢄이 가득 μ±„μ›Œμ Έ μžˆλ‹€λŠ” μ μ—μ„œ μ™„μ „ 이진 트리이며, 각 λ…Έλ“œμ˜ μ›μ†Œκ°€ μžμ‹λ“€μ˜ μ›μ†Œλ³΄λ‹€ μž‘λ‹€λŠ” νŠΉμ„±μ΄ μžˆλ‹€.

λ”°λΌμ„œ λ£¨νŠΈλŠ” 트리 μ „μ²΄μ—μ„œ κ°€μž₯ μž‘μ€ μ›μ†Œμ΄λ‹€.

μ‚½μž…

μ΅œμ†Œνž™μ— μ›μ†Œλ₯Ό μ‚½μž…ν•  λ•Œ μ–Έμ œλ‚˜ 트리의 λ°‘λ°”λ‹₯μ—μ„œ μ‚½μž…μ„ μ‹œμž‘ν•œλ‹€.

μƒˆλ‘œμš΄ μ›μ†ŒλŠ” μ™„μ „ 트리의 속성에 μœ„λ°°λ˜μ§€ μ•Šλ„λ‘ λ°‘λ°”λ‹₯ κ°€μž₯ 였λ₯Έμͺ½μœΌλ‘œ μ‚½μž…λœλ‹€.

이후 μ œλŒ€λ‘œ 된 자리λ₯Ό 찾을 λ•ŒκΉŒμ§€ λΆ€λͺ¨ λ…Έλ“œμ™€ κ΅ν™˜ν•΄ λ‚˜κ°€λ©°

μ΅œμ†Œ μ›μ†Œλ₯Ό μœ„μͺ½μœΌλ‘œ μ˜¬λ¦°λ‹€.

νž™μ— μžˆλŠ” λ…Έλ“œμ˜ 개수λ₯Ό n이라 ν•  λ•Œ 이 연산은 O(log N) μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.

μ΅œμ†Œ μ›μ†Œ 뽑아내기

μ΅œμ†Œ μ›μ†ŒλŠ” μ–Έμ œλ‚˜ κ°€μž₯ μœ„μ— 놓인닀.

νž™μ—μ„œ μ–΄λ–»κ²Œ μ œκ±°ν•˜λŠλƒκ°€ κΉŒλ‹€λ‘œμš΄ 뢀뢄이닀.

μ΅œμ†Œ μ›μ†Œλ₯Ό μ œκ±°ν•œ 후에 νž™μ— μžˆλŠ” κ°€μž₯ λ§ˆμ§€λ§‰ μ›μ†Œμ™€ κ΅ν™˜ν•œλ‹€.

κ·Έ λ‹€μŒ μ΅œμ†Œνž™μ˜ μ„±μ§ˆμ„ λ§Œμ‘±ν•˜λ„λ‘ ν•΄λ‹Ή λ…Έλ“œλ₯Ό μžμ‹ λ…Έλ“œμ™€ κ΅ν™˜ν•΄ λ‚˜κ°μœΌλ‘œμ¨ λ°‘μœΌλ‘œ 보낸닀.

이 μ•Œκ³ λ¦¬μ¦˜λ„ O(log N) μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.

트라이

접두사 트리 (prefix tree) 라고도 λΆˆλ¦°λ‹€.

νŠΈλΌμ΄λŠ” Nμ°¨ 트리의 λ³€μ’…μœΌλ‘œ 각 λ…Έλ“œμ— 문자λ₯Ό μ €μž₯ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

λ”°λΌμ„œ 트리λ₯Ό μ•„λž˜μͺ½μœΌλ‘œ μˆœνšŒν•˜λ©΄ 단어 ν•˜λ‚˜κ°€ λ‚˜μ˜¨λ‹€.

* λ…Έλ“œ(Null Node)λŠ” μ’…μ’… λ‹¨μ–΄μ˜ 끝에 λ‚˜νƒ€λ‚˜μ„œ 단어가 μ™„μ„±λ˜μ—ˆμŒμ„ μ•Œλ¦°λ‹€.

접두사λ₯Ό λΉ λ₯΄κ²Œ 찾아보기 μœ„ν•œ μ•„μ£Ό ν”ν•œ λ°©μ‹μœΌλ‘œ λͺ¨λ“  μ–Έμ–΄λ₯Ό νŠΈλΌμ΄μ— μ €μž₯ν•˜λŠ” 방식이 μžˆλ‹€.

트라이λ₯Ό μ΄μš©ν•˜λ©΄ μ•„μ£Ό λΉ λ₯΄κ²Œ 확인 κ°€λŠ₯ν•˜λ‹€.

νŠΈλΌμ΄λŠ” 길이가 K 인 λ¬Έμžμ—΄μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ O(K) μ‹œκ°„μ— ν•΄λ‹Ή λ¬Έμžμ—΄μ΄ μœ νš¨ν•œ 접두사인지 확인할 수 μžˆλ‹€.

κ·Έλž˜ν”„

νŠΈλ¦¬λŠ” κ·Έλž˜ν”„μ˜ ν•œ μ’…λ₯˜μ΄λ‹€.

ν•˜μ§€λ§Œ λͺ¨λ“  κ·Έλž˜ν”„κ°€ νŠΈλ¦¬λŠ” μ•„λ‹ˆλ‹€.

νŠΈλ¦¬λŠ” 사이클이 μ—†λŠ” ν•˜λ‚˜μ˜ μ—°κ²° κ·Έλž˜ν”„μ΄λ‹€.

κ·Έλž˜ν”„λŠ” λ‹¨μˆœνžˆ λ…Έλ“œμ™€ κ·Έ λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” κ°„μ„ (edge)λ₯Ό ν•˜λ‚˜λ‘œ λͺ¨μ•„놓은 것과 κ°™λ‹€.

  • κ·Έλž˜ν”„λŠ” λ°©ν–₯성이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλ‹€.
  • κ·Έλž˜ν”„λŠ” μ—¬λŸ¬ 고립된 λΆ€λΆ„ κ·Έλž˜ν”„λ‘œ ꡬ성될 수 μžˆλ‹€. λͺ¨λ“  정점 쌍 간에 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„λŠ” μ—°κ²° κ·Έλž˜ν”„ 라고 λΆ€λ₯Έλ‹€.
  • κ·Έλž˜ν”„μ—λŠ” 사이클이 μžˆμ„ μˆ˜λ„ 있고 없을 μˆ˜λ„ μžˆλ‹€. 사이클이 μ—†λŠ” κ·Έλž˜ν”„λŠ” λΉ„μˆœν™˜ κ·Έλž˜ν”„ 라고 λΆ€λ₯Έλ‹€.

인접 리슀트

인접 리슀트(adjacency list)λŠ” κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•  λ•Œ μ‚¬μš©λ˜λŠ” κ°€μž₯ 일반적인 방법이닀.

λͺ¨λ“  정점을 인접 λ¦¬μŠ€νŠΈμ— μ €μž₯ν•œλ‹€.

무방ν–₯ κ·Έλž˜ν”„λŠ” (a, b) 간선이 두 번 μ €μž₯λœλ‹€.

1
2
3
4
5
6
7
8
Class Graph {
	public Node[] nodes;
}

Class Node {
	public String name;
	public Node[] children;
}

κ·Έλž˜ν”„λŠ” νŠΈλ¦¬μ™€ 달리 νŠΉμ • λ…Έλ“œμ—μ„œ λ‹€λ₯Έ λͺ¨λ“  λ…Έλ“œλ‘œ 접근이 κ°€λŠ₯ν•˜μ§€λŠ” μ•Šμ•„ Graph λΌλŠ” 클래슀λ₯Ό μ‚¬μš©ν•œλ‹€.

λ°°μ—΄, ν•΄μ‹œν…Œμ΄λΈ”κ³Ό 각 μΈλ±μŠ€λ§ˆλ‹€ μ‘΄μž¬ν•˜λŠ” 또 λ‹€λ₯Έ 리슀트λ₯Ό μ΄μš©ν•΄ 인접 리슀트λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€.

1
2
3
4
5
6
7
0: 1
1: 2
2: 0, 3
3: 2
4: 6
5: 4
6: 5

인접 ν–‰λ ¬

인접 행렬은 NxN 뢈린 ν–‰λ ¬λ‘œμ¨ matrix[i][j] == true 이면 i -> j 간선이 μžˆλ‹€λŠ” 것이닀.

인접 행렬은 쑰금 νš¨μœ¨μ„±μ΄ 떨어진닀.

μ–΄λ–€ λ…Έλ“œμ— μΈμ ‘ν•œ λ…Έλ“œλ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ λͺ¨λ“  λ…Έλ“œλ₯Ό μ „λΆ€ μˆœνšŒν•΄μ•Ό ν•  수 μžˆλ‹€.

κ·Έλž˜ν”„ 탐색

깊이 μš°μ„  탐색(DFS)λŠ” 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄μ„œ λ‹€μŒ λΆ„κΈ°λ‘œ λ„˜κ±°κ°€κΈ° 전에 ν•΄λ‹Ή λΆ„κΈ°λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” 방법이닀.

λ„ˆλΉ„ μš°μ„  탐색(BFS)λŠ” 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄μ„œ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방법이닀.

DFSλŠ” κ·Έλž˜ν”„μ—μ„œ λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜κ³ μž ν•  λ•Œ μ„ ν˜Έλ˜λŠ” νŽΈμ΄λ‹€.

BFSλŠ” 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜 ν˜Ήμ€ μž„μ˜μ˜ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ μΌλ°˜μ μ΄λ‹€.

깊이 μš°μ„  탐색(DFS)

트리의 μˆœνšŒμ™€ κ·Έλž˜ν”„ νƒμƒ‰μ˜ κ°€μž₯ 큰 μ°¨μ΄λŠ” μ–΄λ–€ λ…Έλ“œλ₯Ό λ°©λ¬Έν–ˆμ—ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λ°˜λ“œμ‹œ 검사해야 ν•œλ‹€λŠ” 것이닀.

그렇지 μ•Šμ„ 경우 λ¬΄ν•œλ£¨ν”„μ— 빠질 μœ„ν—˜μ΄ μžˆλ‹€.

1
2
3
4
5
6
7
8
9
10
void search(Node root) {
	if (root == null) return;
	visit(root);
	root.visited = true;
	for each (Node n in root.adjacent) {
		if (n.visited == false) {
			search(n);
		}
	}
}

λ„ˆλΉ„ μš°μ„  탐색(BFS)

BFS λŠ” μž¬κ·€μ μœΌλ‘œ λ™μž‘ν•˜μ§€ μ•Šκ³  큐λ₯Ό μ‚¬μš©ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void search(Node root) {
	Queue queue = new Queue();
	root.marked = true;
	queue.enqueue(root);

	while (!queue.isEmpty()) {
		Node r = queue.dequeue();
		visit(r);
		foreach (Node n in r.adjacent) {
			if (n.marked == false) {
				n.marked = true;
				queue.enqueue(n);
			}
		}
	}
}

μ–‘λ°©ν–₯ 탐색

μ–‘λ°©ν–₯ 탐색은 μΆœλ°œμ§€μ™€ 도착지 사이에 μ΅œλ‹¨ 경둜λ₯Ό 찾을 λ•Œ μ‚¬μš©λ˜κ³€ ν•œλ‹€.

기본적으둜 μΆœλ°œμ§€μ™€ 도착지 두 λ…Έλ“œμ—μ„œ λ™μ‹œμ— λ„ˆλΉ„ μš°μ„  탐색을 μˆ˜ν–‰ν•œ λ’€, 두 탐색 지점이 μΆ©λŒν•˜λŠ” κ²½μš°μ— 경둜λ₯Ό μ°ΎλŠ” 방식이닀.

λͺ¨λ“  λ…Έλ“œκ°€ 적어도 k개의 이웃 λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ 있고 s β†’ t둜의 μ΅œλ‹¨ 거리가 dκ°€ λ˜λŠ” κ·Έλž˜ν”„λ₯Ό μƒκ°ν•΄λ³΄μž.

  • 전톡적인 BFS μ—μ„œλŠ” λ ˆλ²¨λ§ˆλ‹€ k 개의 λ…Έλ“œλ₯Ό 탐색해야 ν•˜λ―€λ‘œ d번 λ°˜λ³΅ν•˜λ©΄ O(K^d) 개의 λ…Έλ“œλ₯Ό νƒμƒ‰ν•œλ‹€.
  • μ–‘λ°©ν–₯ 탐색을 μ‚¬μš©ν•œλ‹€λ©΄ λŒ€λž΅ d/2 λ‹¨κ³„κΉŒμ§€ νƒμƒ‰ν•œ ν›„ μΆ©λŒν•œλ‹€. λ”°λΌμ„œ s 와 t κ°κ°μ—μ„œ λ°©λ¬Έν•  λ…Έλ“œλŠ” k^(d/2) κ°œκ°€ 될 것이고 전체 λ°©λ¬Έν•  λ…Έλ“œλŠ” λŒ€λž΅ 2*k^(d/2) κ°œκ°€ λœλ‹€.

즉, μ–‘λ°©ν–₯ 탐색은 BFS 보닀 적어도 k^(d/2) 만큼 λΉ λ₯΄λ‹€.

λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ λ§ν•˜λ©΄ 2λ°° 더 κΈ΄ κ²½λ‘œκΉŒμ§€ 찾을 수 μžˆλ‹€!

This post is licensed under CC BY 4.0 by the author.