728x90
Graph 표현
Dictionary + Array
var graph : [String: [String]] = [:]
graph.updateValue(["B","C"], forKey: "A")
graph.updateValue(["A","D"], forKey: "B")
graph.updateValue(["A","G","H","I"], forKey: "C")
graph.updateValue(["D","B","E","F"], forKey: "D")
graph.updateValue(["E","D"], forKey: "E")
graph.updateValue(["F","D"], forKey: "F")
graph.updateValue(["G","C"], forKey: "G")
graph.updateValue(["H","C"], forKey: "H")
graph.updateValue(["I","C","J"], forKey: "I")
graph.updateValue(["J","I"], forKey: "J")
for item in graph {
print(item)
}
output
(key: "C", value: ["A", "G", "H", "I"])
(key: "I", value: ["I", "C", "J"])
(key: "J", value: ["J", "I"])
(key: "E", value: ["E", "D"])
(key: "H", value: ["H", "C"])
(key: "D", value: ["D", "B", "E", "F"])
(key: "A", value: ["B", "C"])
(key: "F", value: ["F", "D"])
(key: "B", value: ["A", "D"])
(key: "G", value: ["G", "C"])
BFS
- 방문한 노드와 방문할 노드를 담을 Queue 두개를 사용한다.
- 방문할 노드가 없을 때 까지 반복한다.
func bfs(graph : [String:[String]], startNode : String) -> [String] {
var visitedQueue : [String] = []
var needVisitQueue : [String] = []
needVisitQueue.append(startNode)
while needVisitQueue.count != 0 {
let node = needVisitQueue.removeFirst()
if !visitedQueue.contains(node) {
visitedQueue.append(node)
needVisitQueue.append(contentsOf: graph[node]!)
}
}
return visitedQueue
}
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
큐동작 과정
더보기
[]
["A"]
["A"]
["B", "C"]
["A", "B"]
["C", "A", "D"]
["A", "B", "C"]
["A", "D", "A", "G", "H", "I"]
["A", "B", "C"]
["D", "A", "G", "H", "I"]
["A", "B", "C", "D"]
["A", "G", "H", "I", "D", "B", "E", "F"]
["A", "B", "C", "D"]
["G", "H", "I", "D", "B", "E", "F"]
["A", "B", "C", "D", "G"]
["H", "I", "D", "B", "E", "F", "G", "C"]
["A", "B", "C", "D", "G", "H"]
["I", "D", "B", "E", "F", "G", "C", "H", "C"]
["A", "B", "C", "D", "G", "H", "I"]
["D", "B", "E", "F", "G", "C", "H", "C", "I", "C", "J"]
["A", "B", "C", "D", "G", "H", "I"]
["B", "E", "F", "G", "C", "H", "C", "I", "C", "J"]
["A", "B", "C", "D", "G", "H", "I"]
["E", "F", "G", "C", "H", "C", "I", "C", "J"]
["A", "B", "C", "D", "G", "H", "I", "E"]
["F", "G", "C", "H", "C", "I", "C", "J", "E", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["G", "C", "H", "C", "I", "C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["C", "H", "C", "I", "C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["H", "C", "I", "C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["C", "I", "C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["I", "C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["C", "J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F"]
["J", "E", "D", "F", "D"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["E", "D", "F", "D", "J", "I"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["D", "F", "D", "J", "I"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["F", "D", "J", "I"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["D", "J", "I"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["J", "I"]
["A", "B", "C", "D", "G", "H", "I", "E", "F", "J"]
["I"]
시간복잡도
- O(V + E)
- 반복문이 V + E 만큼 수행됨
DFS
- 방문할 노드는 Stack 사용
- 방문한 노드엔 Queue 사용
func dfs(graph : [String:[String]], startNode : String) -> [String] {
var visitedQueue : [String] = []
var needVisitQueue : [String] = []
needVisitQueue.append(startNode)
while needVisitQueue.count != 0 {
let node = needVisitQueue.removeLast()
if !visitedQueue.contains(node) {
visitedQueue.append(node)
needVisitQueue.append(contentsOf: graph[node]!)
}
}
return visitedQueue
}
["A", "C", "I", "J", "H", "G", "B", "D", "F", "E"]
시간복잡도
- O(V + E)
- 반복문이 V + E 만큼 수행됨
728x90
'Algorithm > Study' 카테고리의 다른 글
다익스트라 알고리즘 (0) | 2021.01.21 |
---|---|
탐욕 알고리즘과 예제문제 (Swift) (0) | 2021.01.20 |
Swift Heap (0) | 2021.01.18 |
이진트리 연산 (0) | 2021.01.16 |
이진트리 순회 (0) | 2021.01.16 |
댓글