Home [컴퓨터과학 개론] 4강 - 자료 구조
Post
Cancel

[컴퓨터과학 개론] 4강 - 자료 구조

💡해당 게시글은 방송통신대학교 이관용, 정광식 교수님의 '컴퓨터과학 개론' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 컴퓨터 프로그래밍을 시작하면서 가장 기본이 되는 내용인 자료 구조를 살펴봄
  • 비선형 자료 구조인 트리와 그래프에 대해 알아보고, 그래프와 트리의 순회 방법과 표현 방법에 대해서 학습함
  • 트리는 계층 구조를 표현하기에 적당하고, 그래프는 현실 세계 네트워크나 네비게이션의 목적지와 출발지를 표현하고 계산하는 데 가장 많이 사용되는 자료구조임



학습 목표


  • 트리와 그래프와 같은 자료 구조에 대해서 이해할 수 있음
  • 트리의 노드를 순회할 수 있는 방법에 대해서 이해할 수 있음
  • 그래프의 노드를 순회하는 방법에 대해서 이해할 수 있음



강의록


트리

트리 용어 정의

  • 개념
    • 데이터 간의 관계를 나타내는 비선형 자료 구조

      image

    • 노드(node)라고 불리는 부분과 노드를 연결하는 가지(branch, edge)로 구분됨
    • 노드 사이에는 계층적인 관계성을 갖음

      image

    • 노드(node)
      • 정보 항목을 의미함
    • 루트(root)
      • 빈 트리가 아닌 경우에 맨 꼭대기에 있는 하나의 노드
    • 차수(degree)
      • 각 노드에 있는 가지의 수
    • 잎 노드(leaf node) = 단말 노드(terminal node)
      • 노드의 차수가 0인 노드
    • 내부 노드(internal node) = 비단말 노드(non-terminal node)
      • 루트 노드와 단말 노드를 제외한 나머지 노드
    • 조상(선조) 노드
      • 루트 노드로부터 어떤 노드 X까지의 경로(가지들의 모음) 상에 존재하는 모든 노드를 X의 조상 노드라고 함
    • 자손(후손) 노드
      • 어떤 노드 X에서 단말 노드까지의 경로 상에 존재하는 모든 노드를 자손 노드라고 함
    • 레벨(level)
      • 루트 노드로부터의 거리(가지의 수)를 의미함

      image

    • 트리의 깊이(depth)/높이(height)
      • 루트 노드로부터 가장 긴 경로에 있는 단말 노드의 레벨에 1의 값을 더한 것
      • ex) 깊이 = 4
    • 서브 트리(subtree)
      • 특정 노드를 루트 노드로 하고, 그 아래에 있는 연결된 구조의 트리
    • 숲(forest)
      • n개의 서브 트리를 가진 트리에서 루트 노드를 제거해서 얻을 수 있는 분리 된 서브 트리의 집합

이진 트리

이진 트리(binary tree)

  • 개념
    • 트리 중에서 차수가 2인 트리
    • 모든 노드의 차수는 최대 2를 넘지 않음
    • 모든 노드는 최대 2개의 서브 트리를 가짐

    image

    • 각 서브 트리는 왼쪽 서브 트리와 오른쪽 서브 트리로 구분 됨
    • 왼쪽 노드와 오른쪽 노드에 순서의 의미를 부여함
    • 이진 트리의 각 서브 트리는 다시 이진 트리가 됨

이진 트리의 높이

  • 최대 높이
    • N개의 노드를 가진 이진 트리의 높이를 계산으로 구할 수 있음
    • 최대 높이
      • N으로 노드의 개수와 같음

      image

  • 최소 높이
    • 모든 내부 노드가 최대 2개의 자식 노드를 갖는 경우로서 [log₂N ]+1이 높이가 됨

      image

이진 트리 순회 연산

  • 개념
    • 일정한 순서에 따라 트리에 있는 각 노드를 한 번씩 방문하는 것

    image

  • DLR(전위 순회;preorder)
    • 루트 노드 방문 → 왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문
  • LDR(중위 순회;inorder)
    • 왼쪽 서브 트리 방문 → 루트 노드 방문 → 오른쪽 서브 트리 방문
  • LRD(후위 순회;postorder)
    • 왼쪽 서브 트리 방문 → 오른쪽 서브 트리 방문 → 루트 노드 방문

포화 이진 트리(full binary tree)

  • 개념
    • 깊이가 k인 이진 트리 중에서 노드의 개수가 2ᵏ - 1개인 이진 트리
    • 깊이가 k인 이진 트리가 가질 수 있는 노드의 최대 개수는 2ᵏ - 1개
    • 단말 노드의 개수가 2ᵏ - 1개
    • 각 레벨에서 빈 자리가 없이 노드를 모두 가지고 있음
    • 모든 내부 노드들은 2개의 자식 노드를 가짐

    image

  • 포화 이진 트리에서 각 노드에 번호를 부여한 경우

    image

완전 이진 트리(complete binary tree)

  • 개념
    • 트리의 최대 레벨이 k일 때, 레벨 k-1까지는 포화 이진 트리를 형성하고, 레벨 k에서는 왼쪽부터 오른쪽으로 채워진 트리임
    • 총 노드의 개수가 2ᵏ ⁺ ¹ - 1을 초과하지 않으면서, 포화 이진 트리의 노드 번호에 해당하는 연속적인 번호를 갖는 트리임

    image

경사 이진 트리(skewed binary tree)

  • 개념
    • 한 쪽 방향으로만 가지가 뻗어 나간 이진 트리
    • 왼쪽 방향으로만 가지가 뻗어 나간 경사 이진 트리
    • 오른쪽으로만 가지가 뻗어 나간 경사 이진 트리

    image

그래프

그래프의 개념과 용어

  • 그래프 G
    • 정점(vertext)들의 유한 집합 V두 개의 정점을 연결하는 간선(edge)들의 유한 집합 E로 정의
    • G = (V, E)로 표시 됨

    image

  • 무방향 그래프(undirected graph)
    • 간선이 방향성이 없는 간선으로 연결 된 그래프

    image

  • 방향 그래프(directed digraph)
    • 두 정점을 연결하는 간선이 방향성을 가지는 간선으로 연결 된 그래프

    image

  • 그래프의 집합 표현 방법

    image

    • G1 그래프
      • V(G1) = {1, 2, 3, 4}
      • E(G1) = {(1, 2),(1, 3),(1, 4),(2, 3),(2, 4),(3, 4)}
    • G2 그래프
      • V(G2) = {1, 2, 3, 4}
      • E(G2) = {<1, 2>, <1, 3>, <3, 2>, <3, 4>, <4, 1>, <4, 2>}
  • 용어
    • 두 정점이 간선으로 직접 연결되어 있으면 두 정점은 인접(adjacent)해 있다고 하며 해당 간선은 두 정점에 부수(incident)되었다고 함
    • 인접한다
      • 정점 간의 관계
    • 부수되었다
      • 정점과 간선 간의 관계
    • 경로 (path)
      • 간선으로 연결된 정점들의 순차적 나열을 의미함
    • 경로의 길이
      • 경로에 포함된 간선의 개수
    • 단순 경로 (simple path)
      • 경로 상에 존재하는 정점들이 모두 다른 경로
    • 사이클 (cycle)
      • 세 개 이상의 정점을 가진 경로 중에서 시작 정점과 끝 정점이 같은 경로
    • 단순 사이클 (simple cycle)
      • 시작 정점과 끝 정점을 제외하고 모든 정점이 다른 사이클
    • 두 정점은 서로 연결되었다
      • 두 정점 사이에 경로가 존재함
    • 그래프가 서로 연결되었다
      • 무방향 그래프에서 서로 다른 모든 정점들 사이에 경로가 존재함
    • 무방향 그래프에서 한 정점의 차수(degree)
      • 정점에 부수된 간선의 개수임
    • 방향 그래프 정점의 차수는 진입 차수와 진출 차수로 나뉨
      • 진입 차수 (indegree)
        • 다른 정점에서 해당 정점으로 향하는 간선의 개수
      • 진출 차수 (outdegree)
        • 해당 정점에서 다른 정점으로 향하는 간선의 개수
    • 트리는 그래프의 특수한 형태로 봄
      • 무방향 그래프에서 모든 정점이 서로 연결되어 있으면서 사이클이 존재하지 않는 그래프를 트리라고 함

그래프의 표현

그래프의 표현

  • 개념
    • 그래프를 컴퓨터 프로그래밍 언어로 구현하기 위해서는 인접 행렬(adjacency matrix)이나 인접 리스트(adjacency list)를 이용하여 표현함
    • 인접 행렬을 이용하여 n개의 정점을 가진 그래프를 표현하기 위해서는 n×n 크기의 2차원 배열을 이용함
    • 인접 행렬 A[i][j]에 값이 존재하면 그래프의 정점 v에서 정점 vⱼ 사이에 간선이 존재함을 의미하고 A[i][j]의 값은 1로 정함
  • 인접 행렬
    • 그래프

      image

    • 인접 행렬을 사용한 그래프의 표현

      image

  • 인접 리스트
    • 그래프

      image

    • 인접 리스트를 사용한 그래프의 표현

      image

그래프의 탐색

  • 개념
    • 그래프의 모든 정점을 체계적으로 방문하는 것
    • 깊이 우선 탐색 (depth first search)과 너비 우선 탐색 (breadth first search)이 있음

      image

깊이 우선 탐색

  • 개념
    • 최근의 방문하지 않은 인접한 하나의 정점을 우선적으로 방문함
    • 최종적인 방문 순서는 (1, 2, 4, 5, 7, 6, 3)이 됨
    • 최종 방문 순서는 구현 방법에 따라 달라질 수 있음

너비 우선 탐색

  • 개념
    • 최근의 방문하지 않은 인접한 모든 정점을 모두 방문함
    • 최종적인 방문 순서는 (1, 2, 3, 4, 5, 6, 7)이 됨
    • 최종 방문 순서는 구현 방법에 따라 달라질 수 있음

정리 하기

  • 트리
    • 노드와 가지로 구성되어 나무 뿌리 모양의 데이터의 계층 관계를 나타내는 자료 구조
  • 트리 순회 방법
    • 전위 순회, 중위 순회, 후위 순회가 있음
  • 그래프
    • 정점들의 유한 집합과 정점들의 쌍을 연결하는 간선의 유한 집합



연습 문제


  1. 트리의 루트 노드에서 리프 노드에 이르는 가장 긴 경로에 존재하는 노드의 개수를 무엇이라고 하는가?

    a. 깊이

    • 노드를 연결하는 것을 가지(branch, edge)라고 하며, 각 노드에 있는 가지의 수를 차수(degree)라고 함
    • 루트 노드로부터의 거리(가지의 개수)를 레벨이라고 함
    • 레벨은 하나의 트리에서도 다를 수 있음
    • 레벨에서 가장 큰 값을 트리의 깊이라고 함
  2. 이진 트리에 대한 설명으로 올바른 것은?

    a. 노드가 하나도 없는 공백 트리도 이진트리임

    • 이진 트리의 최대 차수는 2임
    • 두 개까지의 자식 노드를 가질 수 있음
    • 깊이가 2인 이진트리는 레벨 0에서 루트 노드 하나를 가지며, 레벨 1에서는 루트 노드의 자식 노드 2개를 가짐
    • 레벨 2에서 4개의 노드를 가지기 때문에 최대 7개 노드 가질 수 있음
    • 서브 트리는 대칭적인 관계를 가지는 것이 아님
  3. 그래프 관련 용어에 대한 설명으로 틀린 것은?

    a. 각 정점과 인접해 있는 정점들의 나열을 사이클이라고 한다.

    • 세 개 이상의 정점을 가진 경로 중에서 시작 정점과 끝 정점이 같은 경로를 사이클(cycle)이라고 함
    • 그래프 관련 용어에 대한 설명
      • 간선이 두 정점을 직접적으로 연결 시키고 있을 때 두 정점을 인접한 정점이라고 함
      • 두 정점 사이에 경로가 존재하는 경우를 연결 되었다고 함
      • 방향 그래프에서 적어도 두 정점이 연결되어 있지 않을 때 약하게 연결 되었다고 함
        • 방향 그래프에서 적어도 두 정점 사이에 어느 한쪽으로만 경로가 존재할 때, 약하게 연결되었다고 함



정리 하기


  • 트리
    • 노드와 가지로 구성되어 나무 뿌리 모양의 데이터의 계층 관계를 나타내는 자료 구조
    • 트리(tree)
      • 데이터 간의 관계를 나타내는 비선형 자료구조로서 노드(node)라고 불리는 부분과 노드를 연결하는 가지(branch, edge)로 구분됨
    • 잎 노드(leaf node)
      • 단말 노드(terminal node)라고도 하며, 노드의 차수가 0인 노드
    • 내부 노드(internal node)
      • 비단말 노드(non-terminal node)라고도 하며, 루트 노드와 단말 노드를 제외한 나머지 노드
    • 이진 트리 (binary tree)
      • 트리 중에서 차수가 2인 트리를 의미하고, 모든 노드의 차수는 최대 2를 넘지 않으며 모든 노드는 최대 2개의 서브 트리를 가짐
    • 이진 트리의 순회
      • 일정한 순서에 따라 트리에 있는 각 노드를 한 번씩 방문하는 것
    • 포화 이진 트리
      • 이진 트리 중에서도 깊이가 k인 이진 트리가 가질 수 있는 최대 노드의 개수(-1)를 가진 이진 트리
    • 완전 이진 트리
      • 총 노드의 개수가 (-1)을 초과하지 않으면서 포화 이진 트리의 번호와 일치하는 이진 트리
    • 경사 이진 트리
      • 한쪽 방향으로 치우친 트리
  • 트리 순회 방법으로 전위 순회, 중위 순회, 후위 순회가 있음
  • 그래프 : 정점들의 유한 집합과 정점들의 쌍을 연결하는 간선의 유한집합
    • 그래프(graph)
      • 정점(vertex)들의 유한 집합 V와 두 개의 정점을 연결하는 간선(edge)들의 유한 집합 E로 정의되며, G=(V,E)로 표시됨
    • 무방향 그래프(undirected graph)
      • 간선이 방향성이 없는 간선으로 연결된 그래프
    • 방향 그래프(directed graph, digraph)
      • 두 정점을 연결하는 간선이 방향성을 가지는 간선으로 연결된 그래프
    • 그래프의 표현
      • 인접 행렬
      • 인접 리스트
    • 그래프 순회 방식
      • 깊이 우선 탐색
      • 너비 우선 탐색
Contents

Google Colab 환경의 Matplotlib 한글 폰트 깨짐 현상

-