인접행렬

  • 자기 자신 : 0
  • 연결 된 엣지 : 1 (또는 1*weight)
  • 연결 안 된 엣지 : Inf (무한대 값으로 0과 구분)
# infinite 값을 선언하기
INF = float('inf')

# 행렬 그래프로 나타내기 - 가중치 weight 고려해서 표현
graph = [
    [0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]
 

도시끼리 연결되었는지 어떻게 확인할까?

graph[0][1]
>>> 7 (0번과 1번 도시가 연결됨)

graph[2][1]
>>> inf (2번과 1번 도시가 연결 안 됨)
 

 

인접리스트

모든 노드에 연결된 노드에 대한 정보를 차례차례 연결하여 저장

# 연결된 도시만 리스트로 표현

graph = [
    [(1, 7), (2, 5)], # --> 0번 도시의 연결 리스트업
    [(0, 7)], # --> 1번 도시의 연결 리스트업
    [(0, 5)]  # --> 2번 도시의 연결 리스트업
]
 

도시끼리 연결되었는지 연결리스트로는 어떻게 확인할까?

graph[0][0][1]
>>> 7

# 행렬보다 직관성은 떨어질 수 있다.
 

리스트 대신 딕셔너리로 표현하여 연결성을 좀 더 직관적으로 표현할 수도 있다.

graph_dict = {
    "0" : [("1", 7), ("2", 5)],
    "1" : [("0", 7)],
    "2" : [("0", 5)],
}
 

만약 문제에서 0번 도시가 없고 1번 도시부터 있는 경우

graph = [
    [], # --> 0번 도시는 비워두고 시작
    [(1, 7), (2, 5)], # --> 1번 도시부터 기록
    [(0, 7)],
    [(0, 5)] 
]
 

이렇게 0번 도시를 빈칸으로 넣어 주면 나중에 인덱스 헷갈릴 일이 없다!!! 꿀팁

 

 

[메모리]

인접 행렬(Adjacency Matrix): 모든 관계를 저장하므로 노드 개수가 많을 수록 불필요한 메모리가 소요된다.

인접 리스트(Adjacency List): 연결된 정보만을 저장하기 때문에 메모리를 효율적으로 사용한다.

출처 입력

[속도]

인접 행렬(Adjacency Matrix): 모든 경우의 수가 제시되어 있으므로 인접리스트보다 빠르다.

인접 리스트(Adjacency List): 인접행렬방식에 비해 정보를 얻는 속도가 느리다. 인접리스트방식에서는 연결된 데이터를 하나씩 확인해야 하기 때문이다.

출처 입력

"두 노드 간에 연결이 있는지 없는지에 대한 확인" 문제

→ 인접행렬이 빠르다

 

"노드에 연결된 모든 노드들을 순회/탐색" 문제

→ 인접리스트가 효율적이다

 

+ Recent posts