자료구조

개발 공부 기록·2021년 5월 15일
0
post-thumbnail
  • 자료구조란 여러 데이터들의 묶음을 어떻게 저장할 것이고, 사용할 것인지 정의한 것
  • 문자, 숫자, 소리, 그림, 영상 등 실생활을 구성하고 있는 것들을 자료(data)
    => 자료들이 잘 분석이 되고, 정리되고 활용되어야만 의미가 있다
  • 대부분의 자료구조특정한 상황에 문제를 해결하는 데에 특화
    => 많은 자료구조를 알아두어야 어떠한 상황이 닥쳤을 때 적합한 자료구조를 사용하여 문제를 해결 가능

Stack

  • Stack은 자료(data)를 쌓는 자료구조
  • Stack 자료구조의 특성은 입출이 하나인 제한적 접근 (후입선출)
    => LIFO(Last In First Out) 혹은 FILO(First In Last Out)
  • 브라우저에서 뒤로 가기, 앞으로 가기 기능을 구현할 때 Stack 자료구조가 활용됨
  • 배열로 Stack을 사용할 때 push,pop 메소드 활용

Queue

QueueStack과 반대되는 개념으로, 먼저 들어간 자료(data)가 먼저 나오는 FIFO(First In First Out) 혹은 LILO(Last In Last Out) 의 특성을 가지고 있는 자료구조 (선입선출)

Queue는 자료(data)가 입력된 순서대로 처리해야 할 필요가 있는 상황에서 사용


예시) 컴퓨터(출력 버튼) - Queue(임시 기억 장치)에 하나씩 들어옴 - 들어온 순서부터 인쇄 작업 (프린터)
=>
컴퓨터 장치들 사이에서 자료(data)를 주고 받을 때 각 장치들 사이에 존재하는 속도의 차이나 시간 차이를 극복하기 위한 임시 기억 장치로 Queue가 사용 이것을 통틀어 버퍼(buffer)라고 한다.
CPU는 빠른 속도로 인쇄 자료(data)를 만든 다음, 인쇄 작업 Queue에 저장하고 다른 작업을 수행하고 프린터는 인쇄 작업 Queue에서 자료(data)를 가져가서 일정한 속도로 인쇄

다른 예시) 유튜브 시청을 할 때의 버퍼링은 다운로드 된 자료(data)가 영상을 재생하기에 충분하지 않다면 순서대로 Queue에 모아 두었다가 충분한 양이 되었을 때 비디오를 복원하여 재생


  • 배열로 Queue을 사용할 때 push,shift 메소드 활용

Graph

여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조

서로 다른 점들이 직접적인 관계를 가지고 있다면 바로 이어주는 선이 존재하고, 간접적인 관계를 가지고 있다면 다른 여러 점을 거쳐서 이어지는 선이 존재할 수 있다.
=> 그래프에서는 점은 정점(vertex)이라 하고 선은 간선(edge)이라고 한다.
정점을 이어주는 간선이 없으면 관계가 없다라 표현한다.

가중치(연결의 강도가 얼마나 되는지)가 적혀 있지 않은 그래프는 비가중치 그래프
=> 비가중치 그래프를 가중치 그래프로 바꿔 주어 자세한 정보 표현해줌

예시) 포털 사이트 검색 엔진, SNS, 네비게이션


그래프 용어

  • 무향그래프(undirected graph): 양방향 <=> 일방통행은 단방향
  • 진입차수(in-degree) / 진출차수(out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선이 몇 개인지를 나타냄
  • 인접(adjacency): 두 정점간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점
  • 자기 루프(self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현 => 다른 정점을 거치지 않는다는 것이 특징
  • 사이클(cycle): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현

인접 행렬

인접 행렬정점들간의 인접함을 표시해 주는 행렬으로 2차원 배열의 모습

  1. 한 개의 큰 표와 같은 모습을 한 인접 행렬은 두 정점 사이에 관계가 있는지, 없는지 확인하기에 용이

  2. 진출하는 간선이 있는지 파악하기 위해선 헤당 행렬에 어떤 값이 저장되어있는지 바로 확인 가능
    => 간선이 있으면 1, 없으면 0으로 표시

  3. 가장 빠른 경로(shortest path)를 찾고자 할 때 주로 사용


인접 리스트

인접 리스트각 정점이 어떤 정점과 인접한지 리스트의 형태로 볼 수 있는 표현 방식
=> 각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트에는 자신과 인접한 다른 정점들이 담겨 있다

그래프를 인접 리스트로 구현할 때 정점별로 살펴봐야 할 우선 순위를 구현하고 싶다면, 리스트에 담겨진 정점들을 우선 순위별로 정렬하여 담을 수 있다. 우선 순위가 없다면 연결된 정점들을 단순히 나열한 리스트
=> 우선 순위를 다뤄야 한다면 더 적합한 자료구조(ex. queue, heap)를 사용하는 것이 합리적

인접 행렬은 연결 가능한 모든 경우의 수를 저장
=> 서로 인접하지 않다면 0을, 인접하다면 1을 저장하기 때문에 메모리를 많이 차지
=> 메모리를 효율적으로 사용하고 싶다면 인접 행렬 대신 인접 리스트를 사용


그래프의 모든 정점 탐색 방법

1. BFS

가까운 정점부터 탐색하고 없으면 그 다음의 정점 순회

너비를 우선적으로 탐색하는 방법을 BFS(Breadth-First Search)

주로 두 정점 사이의 최단 경로를 찾고 싶을 때 사용

2. DFS

하나의 경로를 끝까지 탐색한 후, 없으면 다음 경로로 넘어가 탐색

깊이를 우선적으로 탐색하는 방법을 DFS(Depth-First Search)

한 정점에서 시작해서 다음 경로로 넘어가기 전에 해당 경로를 완벽하게 탐색하고 싶을 때 사용
=> BFS보다 탐색 시간은 조금 늦을지라도 모든 노드를 완전히 탐색가능


Tree

  • 그래프의 여러 구조 중 무방향 그래프의 한 구조로 하나의 뿌리로부터 가지가 사방으로 뻗은 형태
  • 데이터가 바로 아래에 있는 하나 이상의 데이터에 무방향으로 연결되는 계층적 자료구조
  • 하나의 데이터 뒤에 여러 개의 데이터가 존재할 수 있는 비선형 구조
  • 계층적으로 표현이 되며 아래로만 뻗기 때문에 사이클이 없다.
  • 트리 구조루트(Root)라는 하나의 꼭짓점 데이터를 시작으로 여러 개의 데이터를 간선(edge)으로 연결
  • 데이터들을 노드(Node) : 부모 노드(Parent Node) / 자식 노드(Child Node)
    / 자식이 없는 노드는 나무의 잎과 같다고 하여 리프 노드(leaf Node)

루트에서 자신에게 걸리는 거리를 레벨(Level)이라고 부르며, 루트를 Level 1로 설정
노드와 노드의 간격(거리)를 레벨(Level)
루트부터 가장 안쪽에 있는 노드까지의 레벨을 트리의 높이(Height)
특정 노드부터 시작하여 루트까지의 레벨을 노드의 깊이(depth)
같은 레벨에 나란히 있는 노드들은 형제 노드(sibling Node)

예시) 파일시스템, 월드컵 토너먼트 대진표, 가계도(족보), 조직도 등.


트리의 구조

자식 노드가 최대 두 개인 노드들로 구성된 트리를 이진 트리

  • 완전 이진 트리: 마지막 레벨을 제외한 모든 노드가 가득 차 있어야 하고, 마지막 레벨의 노드는 전부 차 있지 않아도 되지만 왼쪽이 채워져야함
  • 정 이진 트리: 각 노드가 0 개 혹은 2 개의 자식 노드를 갖음
  • 포화 이진 트리: 정 이진 트리이면서 완전 이진 트리인 경우이며 모든 리프 노드의 레벨이 동일하고, 모든 레벨이 가득 채워져 있는 트리

모든 왼쪽 자식들은 루트나 부모보다 작은 값이고, 모든 오른쪽 자식들은 루트나 부모보다 큰 값인 특징을 가지고 있는 이진 트리를 이진 탐색 트리(Binary Search Tree)
=> 이진 탐색 트리는 균형 잡힌 트리가 아닐 때, 입력되는 값의 순서에 따라 한쪽으로 노드들이 몰리게 될 가능성이 있어 삽입과 삭제마다 트리의 구조를 재조정하는 과정을 거치는 알고리즘을 도입 가능


트리 순회 (Tree traversal)

어떠한 특정 목적을 위해 트리의 모든 노드를 한 번씩 방문하는 것트리 순회

순회할 때의 순서는 항상 왼쪽부터 오른쪽

1. 전위 순회

제일 처음 방문할 노드는 루트, 루트를 기준으로 왼쪽의 노드들을 둘러본 뒤, 왼쪽의 노드 탐색이 끝나면 오른쪽 탐색

2. 중위 순회

루트를 가운데에 두고 순회, 제일 왼쪽 끝에 있는 노드부터 순회하기 시작하여, 루트를 기준으로 왼쪽에 있는 노드의 순회가 끝나면 루트를 거쳐 오른쪽에 있는 노드로 이동하여 마저 탐색

3. 후위 순회

루트를 제일 마지막으로 순회, 제일 왼쪽 끝에 있는 노드부터 순회하기 시작하여, 루트를 거치지 않고 오른쪽으로 이동해 순회한 뒤, 제일 마지막으로 루트를 방문

profile
둔필승총(鈍筆勝聰) - 기억보다는 기록을

0개의 댓글