그냥 게임개발자

인접행렬과 인접리스트의 차이 본문

내 개인적인 공부/알고리즘

인접행렬과 인접리스트의 차이

sudoju 2024. 4. 22. 22:54

졸리네요

 

항상 지하철 만석이니 피곤이 가시질 않네요.

 

뭐 어쨌든

인접행렬과 인접리스트 중 어느 것을 써야 할까요?

뭐 그냥 편한 거 쓰면 됩니다.

 

근데 차이는 한번 비교해보죠.

 

공간복잡도의 차이

  • 인접 행렬 : O(V^2)
  • 인접 리스트 : O(V + E)

V는 Vertex(정점)이며 E는 Edge(간선)입니다.

행렬은 정점이 10개라면 10 * 10 배열이 생기는 것이며

리스트는 정점이 10개의 그 10개의 간선이 2개라면  12개의 리스트가 생깁니다.

 

시간복잡도의 차이

간선 한개 찾기

  • 인접행렬 : O(1)
  • 인접리스트 : O(V)
for (int i = 0; i < V; ++i)
{
    // 인접행렬
    for (int j = 0; j < V; ++j)
    {
        if (arr[i][j])
        {
        
        }
    }
    
    // 인접리스트
    for (int j = 0; j < adj[i].size(); ++j)
    {
        if (adj[i][j])
        {
            
        }
    }
}

이렇게 보듯이 인접행렬은 바로 인덱스를 통해 접근하지만

인접리스트는 정점의 개수만큼 순차적으로 접근하게 됩니다.

 

모든 간선 찾기

  • 인접 행렬의 공간복잡도 O(V^2)
  • 인접 리스트의 공간복잡도 O(V + E)

 

그래서 결론이 뭐냐.

 

 

이렇게 그래프가 희소할 때는 인접리스트를 사용하는게 좋다.

이유는 벌써 정점이 8개면 인접행렬은 64공간의 배열을 만들어야 합니다.

하지만 리스트는 13개의 공간밖에 안필요하죠.

 

다만 아래처럼 조밀한 형태의 그래프라면 인접행렬이 더 좋습니다.

어차피 다 연결이 되어있고 메모리적 효율성으로 봤을 때 동일해지며, 참조 속도도 더 빠르기 때문입니다.

 

끄으으읕

'내 개인적인 공부 > 알고리즘' 카테고리의 다른 글

연결된 컴포넌트(Connected Component)  (1) 2024.04.22
맵과 방향 벡터  (0) 2024.04.22
인접리스트  (0) 2024.04.22
인접행렬(2)  (0) 2024.04.22
인접 행렬(1)  (0) 2024.04.21