[개발자되기: 자료구조 기초] Day-59

Kyoorim LEE·2022년 8월 16일
0

자료구조

자료구조의 분류

스택 (stack)

스택의 특징

  • 입력과 출력이 하나의 방향으로 이뤄짐
  • LIFO(Last In First Out) || FILO(First In Last Out)
  • 저장되는 데이터는 유한하고 정적
  • 스택의 크기는 제한되어 있음
    - 스택 오버플로우(stack overflow)

스택의 실사용 예제

브라우저의 뒤로 가기, 앞으로 가기 기능

큐 (queue)

  • 스택과 반대되는 개념
  • 입력과 출구 방향이 다름
  • FIFO(First In First Out) || LILO(Last In Last Out)

큐의 실사용 예제

프린터 인쇄작업
유튜브

  • 다운로드 된 데이터가 영상 재생에 충분치 않은 경우
  • 동영상의 정상적 재생을 위해
  • Queue에 모아 두었다가
  • 재생하기에 충분한 양의 데이터가 모였을 때 동영상을 재생함

버퍼링 buffering

컴퓨터 장치들 사이에서 데이터 주고받을 때 각 장치 사이에 존재하는 속도 차이와 시간 차이를 극복하기 위해 임시 기억 장치의 자료구조로 Queue 사용


Tree

트리 구조와 특징

루트(root)라는 꼭짓점 데이터를 시작으로 여러 개의 데이터를 간선(edge)로 연결함.

각 데이터를 노드(node)라고 하며 두 개의 노드가 상하 계층으로 연결되면 부모/자식 관계를 가짐

깊이

루트로부터 하위 계층의 특정 노드까지의 길이
루트노드는 깊이가 0

레벨

같은 깊이를 가지고 있는 노드를 묶어서 레벨로 표현
같은 레벨에 있는 노드를 형제 노드(Sibling Node)

높이

리프 노드를 기준으로 루트까지의 높이
ex) H, I, E, F, J의 높이 => 0
D, G의 높이 => 1
B, C의 높이 => 2
A의 높이 => 3

서브 트리

큰 트리 내부에 트리 구조를 갖춘 작은 트리

이진트리 (binary tree)

자식 노드가 최대 두 개인 노드들로 구성됨

정 이진 트리(Full binary tree)

각 노드가 0개 혹은 2개의 자식노드를 가짐

포화 이진 트리(Perfect binary tree)

정 이진 트리이면서 완전 이진 트리인 경우
모든 리프 노드의 레벨이 동일하고 모든 레벨이 가득 채워진 트리

완전 이진 트리

마지막 레벨을 제외한 모든 노드가 가득 차 있어야 함
마지막 레벨의 노드는 전부 차 있지 않아도 되지만 왼쪽은 다 채워져야 함

이진 탐색 트리 (Binary Search Tree)

이진 탐색과 연결 리스트를 결합한 이진트리

이진 탐색 트리 특징

  • 각 노드에 중복되지 않은 Key가 있음
  • 루트 노드의 왼쪽 서브 트리는 해당 노드의 키보다 작은 키를 갖는 노드들로 이뤄짐
  • 루트 노드의 오른쪽 서브 트리는 해당 노드의 키보다 큰 키를 갖는 노드들로 이뤄짐
  • 좌우 서브트리 모두 이진 탐색 트리
  • 모든 왼쪽 자식의 값이 루트나 부모보다 작고, 모든 오른쪽 자식의 값이 루트나 부모보다 큰 값을 가짐
  • 기존 이진 트리보다 탐색이 빠름

  1. 루트 노드 키와 찾고자 하는 값 비교
  2. 찾고자 하는 값이 루트 노드의 키보다 작다면 왼쪽 서브트리로 탐색 진행
  3. 찾고자 하는 값이 루트 노드의 키보다 크다면 오른쪽 서브트리로 탐색 진행

트리 순회

트리의 모든 노드를 한 번씩 방문하는 것

1. 전위 순회 (preorder traverse)

루트 -> 왼쪽노드 -> 오른쪽 노드
부모 노드가 먼저 생성되어야 하는 트리를 복사할 때 사용

2. 중위 순회 (inorder traverse)

제일 왼쪽 끝 노드 -> 루트 -> 오른쪽 노드
루트를 가운데에 두고 서브트리를 먼저 방문한 후 부모 노드를 방문하는 순회방식
이진 탐색 트리의 오름차순으로 값을 가져올 때 쓰임

3. 후위 순회 (postorder traverse)

제일 왼쪽 끝 노드 -> 루트 거치지 않고 오른쪽으로 바로 이동-> 마지막에 루트 방문
트리 삭제 시 사용 (자식 노드가 먼저 삭제 되어야 상위 노드를 삭제할 수 있기 때문)



그래프 Graph

여러개의 점들이 서로 복잡하게 연결되어 있는 관계

그래프의 구조

  • 직접적인 관계가 있는 경우 두 점 사이를 이어주는 선이 있음
  • 간접적 관계라면 몇 개의 점과 선에 걸쳐 이어짐
  • 점: 정점(vertex)
  • 선: 간선(edge)

그래프의 표현 방식 - 인접 행렬

  • A의 진출차수는 1개 입니다: A —> C
    [0][2] === 1
  • B의 진출차수는 2개 입니다: B —> A, B —> C
    [1][0] === 1
    [1][2] === 1
  • C의 진출차수는 1개입니다: C —> A
    [2][0] === 1

그래프의 표현 방식 - 인접 리스트

그래프 주요 용어

  • 정점 (vertex): 노드(node)라고도 하며 데이터가 저장되는 그래프의 기본 원소
  • 간선 (edge): 정점 간의 관계 (정점을 이어주는 선)
  • 인접 정점 (adjacent vertex): 하나의 정점에서 간선에 의해 직접 연결되어 있는 정점
  • 가중치 그래프 (weighted Graph): 연결의 강도(추가적인 정보, ex. 서울-부산으로 가는 거리 등)가 얼마나 되는지 적혀져 있는 그래프
  • 비가중치 그래프 (unweighted Graph): 연결의 강도가 적혀져 있지 않는 그래프
  • 무(방)향 그래프 (undirected graph): 앞서 보았던 내비게이션 예제는 무(방)향 그래프. 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는 것도 가능. 하지만 단방향(directed) 그래프로 구현된다면 편도만 가능. 만약 두 지점이 일방통행 도로로 이어져 있다면 단방향인 간선으로 표현가능.
  • 진입차수 (in-degree) / 진출차수 (out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선이 몇 개인지를 나타냄.
  • 인접 (adjacency): 두 정점 간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점.
  • 자기 루프 (self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현 => 다른 정점을 거치지 않음
  • 사이클 (cycle): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현. 내비게이션 그래프는 서울 —> 대전 —> 부산 —> 서울 로 이동이 가능하므로, 사이클이 존재하는 그래프.

너비 우선 탐색
두 정점 사이의 최단 경로를 찾을 떄 사용

  • level 1에 있는 모든 경우의 수를 다 본 후 level 2로 넘어감
  • 찾는 값이 있는 level 까지 내려가야 함

깊이 우선 탐색

  • 리프 노드(자식 없는 노드)가 나올 때까지 끝까지 탐색함
  • 찾는 값이 없을 경우 level 1의 다음 노드로 넘어가 또 끝까지 탐색함
profile
oneThing

0개의 댓글