반응형

그래프란?

그래프는 정점(Vertex)과 간선(Edge)으로 이루어진 자료구조이다.

정확히는 정점(Vertex)간의 관계를 표현하는 조직도라고 볼 수 있다.

이러한 면에서 트리는 그래프의 일종인 셈이다.

 

하지만 그래프는 트리와는 달리 정점마다 간선이 있을 수도 있고 없을 수도 있으며, 루트노드와 부모와 자식이라는 개념이 존재하지 않는다.

 

그래프와 트리의 차이점에 대해서는 아래의 표로 좀 더 자세하게 설명하겠다.

 

그래프와 트리의 차이

 

그래프와 관련된 용어

  • 정점(Vertex) : 노드(node) 라고도 하며 정점에는 데이터가 저장된다. (0, 1, 2, 3)
  • 간선(Edge) : 정점(노드)를 연결하는 선으로 link, branch 라고도 부른다.
  • 인접 정점(adjacent Vertex) : 간선에 의해 직접 연결된 정점 (0과 2은 인접정점)
  • 단순 경로(simple path) : 경로 중에서 반복되는 정점이 없는 경우. 한붓그리기와 같이 같은 간선을 지나가지 않는 경로 ( 0->3->2->1 은 단순경로 )
  • 차수(degree) : 무방향 그래프에서 하나의 정점에 인접한 정점의 수 (0의 차수는 3)
  • 진출 차수(in-degree) : 방향 그래프에서 외부로 향하는 간선의 수
  • 진입 차수(out-degree) : 방향 그래프에서 외부에서 들어오는 간선의 수
  • 경로 길이(path length) : 경로를 구성하는데 사용된 간선의 수
  • 사이클(cycle) : 단순 경로의 시작 정점과 종료 정점이 동일한 경우

그래프의 구현 방법

그래프를 구현하는 방법에는 인접행렬인접리스트 방식이 있다. 두 개의 구현방식은 각각의 상반된 장단점을 가지고 있다.

 

  • 인접행렬 방식

    인접행렬은 그래프의 노드를 2차원 배열로 만든 것이다.
    노드들 간에 직접 연결이 되어있으면 1을, 아니면 0을 넣어서 행렬을 완성시킨 것이다.

  • 인접행렬의 장점
    • 2차원 배열 안에 모든 정점들의 간선 정보가 담겨있기 때문에 두 정점에 대한 연결 정보를 조회할 때 O(1) 의 시간복잡도면 가능하다.
    • 인접리스트에 비해 구현이 쉽다.
  • 인접행렬의 단점
    • 모든 정점에 대해 간선 정보를 대입해야 하므로 $O(n^2)$ 의 시간복잡도가 소요된다.
    • 무조건 2차원 배열이 필요하기 때문에 필요 이상의 공간이 낭비된다.

  • 인접리스트 방식
    인접리스트는 그래프의 노드를 리스트로 표현한 것이다.

    주로 정점의 리스트 배열을 만들어 관계를 설정하며 노드들 간에 직접 연결이 되어있으면 해당 노드의 인덱스에 그 노드를 삽입해주면 된다.

    즉, 1에는 2와 3이 직접 연결되어 있기 때문에 배열의 1번째 칸에 2와 3을 넣어준다.
  • 인접리스트의 장점
    1. 정점들의 연결 정보를 탐색할 때 O(n) 시간이면 가능하다.
    2. 필요한 만큼의 공간만 사용하기 때문에 공간의 낭비가 적다.
  • 인접리스트의 단점
    1. 특정 두 점이 연결되었는지 확인하려면 인접행렬에 비해 시간이 오래걸린다. (O(E) 시간 소요. E는 간선의 개수)
    2. 구현이 비교적 어렵다.

 

그래프의 종류

  • 무방향 그래프(Undirected Graph)
    무방향 그래프는 두 정점을 연결하는 간선에 방향이 없는 그래프이다.

  • 방향 그래프(Directed Graph)
    방향 그래프는 두 정점을 연결하는 간선에 방향이 존재하는 그래프이다.
    간선의 방향으로만 이동할 수 있다.
  • 가중치 그래프(Weighted Graph)
    가중치 그래프는 간선에 가중치(비용)가 할당된 그래프로, 두 정점을 이동할 때 비용이 드는 그래프이다.
  • 연결 그래프(Connected Graph)
    무방향 그래프에 있는 모든 정점 쌍에 대해서 항상 경로가 존재하는 그래프
    즉, 노드들이 하나도 빠짐없이 간선에 의해 연결되어 있는 그래프로 트리(Tree)가 대표적인 예이다.
  • 비연결 그래프(Disconnected Graph)

    무방향 그래프에서 특정 정점 사이에 경로가 존재하지 않는 그래프
    즉, 노드들 중 간선에 의해 연결되어 있지 않은 그래프이다.

  • 완전 그래프(Complete graph)
    그래프의 모든 정점이 서로 연결되어 있는 그래프이다. (인접 연결)

  • 순환그래프(Cycle)

    단순 경로에서 시작 정점과 도착 정점이 동일한 그래프이다. (A에서 시작-> A에서 끝 가능)

  • 비순환그래프(Acyclic Graph)

    사이클 그래프를 제외한 그래프로, 사이클이 없는 그래프이다.

  • 신장트리(Spanning Tree)

원래 그래프의 모든 노드가 연결되어 있으면서, 트리의 속성을 만족하는 그래프

트리의 속성을 만족하기 때문에 사이클이 존재하면 안된다.


  • 최소 신장트리(Minimum Spanning Tree)

    신장트리(Spanning Tree)중 간선의 가중치 합이 최소인 신장 트리

면접에서 나올 수 있는 질문

참고 자료

기여자


HongEunho

📦

 

반응형
반응형

배열 vs 연결리스트

배열

  • 배열은 입력된 데이터들이 메모리 공간에서 연속적으로 저장되어 있는 자료구조이다.
  • 메모리상에서 연속적으로 저장되어 있는 특징을 갖기때문에, index를 통한 접근이 용이하다.
  • 배열의 크기는 처음 생성할 때 정하며 이후에는 변경할 수 없다.
  • 시간복잡도
    • 탐색: O(1) 단, 접근하고자 하는 인덱스를 알고있어야 한다. 순차적으로 탐색시에는 O(n)
    • 삽입 및 삭제:
      • 배열의 처음 또는 중간에 삽입 및 삭제: O(n) 삽입 지점 이후의 데이터를 옮겨야 하기 때문이다.
      • 배열의 끝에 삽입 및 삭제: O(1)

연결리스트

  • 연결리스트는 여러 개의 노드들이 순차적으로 연결된 형태를 갖는 자료구조이며, 첫번째 노드를 헤드(Head),
    마지막 노드를 테일(Tail) 이라고 한다.
  • 각 노드는 데이터와 다음 노드를 가리키는 포인터로 이루어져있다.
  • 배열과는 다르게 메모리를 연속적으로 사용하지 않는다.
  • 배열과는 다르게 순차적으로 접근해야 하는 면에서 불리할 수도 있으나, 노드가 연결된 구조이기 때문에 삽입, 삭제에 용이하다.
  • 시간복잡도
    • 탐색: O(n)
    • 삽입 및 삭제: 삽입과 삭제 자체는 O(1) 이다.
      • 연결리스트의 처음에 삽입 및 삭제: O(1)
      • 연결리스트의 중간에 삽입 및 삭제: O(n) 탐색시간 소요
      • 연결리스트의 끝에 삽입 및 삭제:
        • 끝을 가리키는 별도의 포인터를 갖는 경우: O(1)
        • 끝을 가리키는 별도의 포인터를 갖지 않는 경우: O(n) 탐색시간 소요

연결리스트 연산

삽입

노드를 생성하고, 삽입하려는 위치를 찾는다.

삽입할 노드를 NewNode라고 하면, NewNode가 그 다음 노드를 가리키게 한다.

NewNode.next -> RightNode

새로 삽입한 노드의 이전 노드가 새로운 노드를 가리키게 한다.  

LeftNode.next -> NewNode

삭제

  1. 탐색을 통해 삭제하고자 하는 노드 (TargetNode)를 찾는다. 
    TargetNode의 왼쪽 노드가 TargetNode의 오른쪽 노드를 가리키게 한다.
    LeftNode.next -> TargetNode.next
    TargetNode가 RightNode를 가리키지 않게 한다 TargetNode.next -> NULL

배열과 연결리스트 비교

  배열 연결리스트
장점 인덱스를 통한 빠른 접근이 가능하다. 삽입과 삭제가 용이하다.
단점 삽입과 삭제가 오래 걸린다.
배열 중간에 있는 데이터가 삭제되면, 공간 낭비가 발생한다.
임의 접근이 불가능하여, 처음부터 탐색을 진행해야 한다.
용도 빠른 접근이 요구되고, 데이터의 삽입과 삭제가 적을 때 삽입과 삭제 연산이 잦고, 검색 빈도가 적을 때

 

이중 연결리스트와 원형 연결리스트

이중 연결리스트

  • 이중 연결리스트는 위에서 언급한 연결리스트(단순 연결리스트)와 다르게 전, 후로 탐색이 가능한 구조이다.
  • 즉, 단순 연결리스트의 노드는 데이터와 다음 노드의 주소를 저장한다면, 이중 연결리스트의 노드는 데이터, 이전 노드의 주소와 다음 노드의 주소를 저장하게 된다.
  • 장점
    • 단순 연결리스트에서는 최악의 경우 n번의 탐색을 해야하지만, 이중 연결리스트에서는 얻고자 하는 데이터의 위치가 tail에 가깝다면 tail에서 부터 역방향으로 탐색이 가능하기 때문에 탐색 시간을 줄일 수 있다.

원형 연결리스트

  • 원형 연결리스트는 단순 연결리스트의 마지막 노드가 null을 가리키는게 아닌, 처음 노드를 가리키는 구조이다.
  • 즉, head에서부터 순회를 반복적으로 진행하다보면 다시 처음으로 돌아오는 구조이다.
  • 이중 연결리스트도 마지막 노드가 처음 노드를 가리키는 구조가 되면, 이를 이중 원형 연결리스트라고 한다.

 

예상 면접 질문

  • 배열 또는 연결리스트의 특징과 그로 인해 갖는 장단점은 ?
  • 배열 또는 연결리스트를 사용하면 좋을 데이터의 예시와 이유

참고

기여자


Junho Moon

📦

반응형

+ Recent posts