210513_자료구조(Data Structure)

자료(data):

문자, 숫자, 소리, 그림, 영상 등 실생활을 구성하고 있는 값들

필요에 따라 데이터의 특징을 잘 파악(분석)하여 정리하고 활용해야 함

자료구조(Data Structure):

여러 데이터들의 묶음을 어떻게 저장할 것이고, 사용할 것인지 정의한 것

많은 자료구조를 알아두면, 어떠한 상황이 닥쳤을 때 적합한 자료구조를 빠르고 정확하게 적용하여 문제를 해결할 수 있다.

배열(Array)과 같은 미리 정의된 데이터 타입을 이용하여 자료구조를 유사하게 구현하여 문제를 해결

Stack

쌓다, 쌓이다, 포개지다 와 같은 뜻
접시를 쌓아 놓은 형태와 비슷하게 자료(data)를 쌓는 자료구조입니다.
ex) Call Stack - 함수를 쌓는 재귀함수의 동작 방식

제한적 접근
LIFO(Last In First Out) 혹은 FILO(First In Last Out)
브라우저에서 뒤로 가기, 앞으로 가기 기능을 구현

Queue

줄을 서서 기다리다, 대기 행렬
먼저 들어간 자료(data)가 먼저 나오는 FIFO(First In First Out) 혹은 LILO(Last In Last Out)

입력된 순서대로 처리해야 할 필요가 있는 상황에서 사용

컴퓨터 장치들 사이 속도의 차이나 시간 차이를 극복하기 위한 임시 기억 장치의 자료구조로 Queue가 사용됨. -> 버퍼(buffer)
버퍼링(buffering)

유튜브와 같은 동영상 스트리밍 앱을 통해 동영상을 시청할 때, 다운로드 된 데이터(data)가 영상을 재생하기에 충분하지 않은 경우가 있다. 이때 동영상을 정상적으로 재생하기 위해 Queue에 모아 두었다가 동영상을 재생하기에 충분한 양의 데이터가 모였을 때 동영상을 재생.

Array.prototype에는 Stack, Queue 사용을 위해 어떤 메서드가 존재하나요?

Array.prototype.pop() : 배열의 끝에서부터 추출
Array.prototype.push() : 배열의 끝에서부터 삽입

배열로 Stack, Queue를 사용할 때 주의해야 할 사항

Stack
데이터의 최대 갯수를 미리 정해야함
따라서 데이터 저장 공간의 낭비가 발생할 수 있다
-미리 최대 갯수만큼 저장 공간을 확보해야함 (1000)

배열로 Stack을 사용할 때 push, pop 이외에 필요한 메서드 구현


class Stack {
  items = []
  push = (element) => this.items.push(element)
  pop = () => this.items.pop()
  isempty = () => this.items.length === 0
  empty = () => (this.items.length = 0)
  size = () => this.items.length
}

const stack = new Stack()
stack.push(1)
stack.push(2)
stack.push(3)
console.log(stack.size()) //3
console.log(stack.pop()) //[ 3 ]
console.log(stack.size()) //2


const stack = new Stack()
stack.push(2)
console.log(stack.items) //[ 2 ]

isempty: to check if the stack is empty,(or contains?)
empty: to empty the stack,
size: to get the stack size

배열로 Queue를 사용할 때 push, shift 이외에 필요한 메서드 구현

enqueue: enserts an element at the end of the queue(=push)
dequeue: removes an element from the front of a queue. (=shift)
peek: getting the element at the front, just returns the element at the front without modifying the queue.

참고페이지

javascript의 배열과 Stack, Queue의 차이
링크텍스트
push와 pop은 빠르지만 shift와 unshift는 느립니다.

Graph

여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조.
다른 점들이 직접적인 관계를 가지고 있다면 바로 이어주는 선이 존재하고, 간접적인 관계를 가지고 있다면 다른 여러 점을 거쳐서 이어지는 선이 존재할 수 있다. 여기서 이야기 하는 점은 그래프에서는 정점(vertex)이라고 표현하고, 선은 간선(edge) 이라고 표현

  • 비가중치 그래프 : 가중치(연결의 강도가 얼마나 되는지)가 적혀 있지 않다
    각 정점간의 연결 유무만을 판단

    • 서울에서 부산까지 갈수 있음만 알수있다
  • 가중치 그래프 : 자세한 정보 , 간선의 연결정도(거리 등) 표현

    • 정점: 서울, 대전, 부산
    • 간선: 서울—140km—대전, 대전—200km—부산, 부산—325km—서울)

무방향그래프(undirected graph)
단방향 그래프(directed): ex) 일방통행 도로
진입차수(in-degree) / 진출차수(out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선의 수
인접(adjacency): 두 정점간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점
자기 루프(self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우. 다른 정점을 거치지 않음
사이클(cycle): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현. 서울 —> 대전 —> 부산 —> 서울 로 이동이 가능- 사이클이 존재하는 그래프

인접 행렬(adjacency matrix)


단방향그래프

무방향그래프

2차원 배열의 모습
두 정점 사이에 관계가 있는지, 없는지 확인
가장 빠른 경로(shortest path)를 찾고자 할때 주로 사용됨
서로 인접하지 않다면 0을, 인접하다면 1을 저장하기 때문에 메모리를 많이 차지하게 됩니다.
인접 행렬은 연결 가능한 모든 경우의 수를 저장합니다.

인접 리스트(adjacency list)



각 정점이 인접한 다른 정점들(노드의 경우 각각의 노드에 연결된 노드들)을 원소로 같는 리스트들의 배열
(adj[i]: i번째 정점(노드)에 연결된 정점들을 원소로 갖는 리스트)
각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트에는 자신과 인접한 다른 정점들이 담겨 있다
메모리를 효율적으로 사용하고 싶다면 인접 행렬 대신 인접 리스트를 사용

Tree

무방향 그래프의 한 구조
데이터가 바로 아래에 있는 하나 이상의 데이터에 무방향으로 연결되는 계층적 자료구조(하나의 뿌리로부터 가지가 사방으로 뻗은 형태)
비선형 구조
아래로만 뻗기 때문에 사이클이 없

루트(Root) 하나의 꼭짓점 데이터를 시작으로 여러 개의 데이터를 간선(edge)으로 연결
노드(Node): 데이터
부모 노드(Parent Node) / 자식 노드(Child Node) / 리프 노드(leaf Node) 자식이 없는 노드(나무의 잎)

레벨(Level): 노드와 노드의 간격(거리)/ 첫 번째 노드인 루트- Level 1
높이(Height): 루트부터 가장 안쪽에 있는 노드까지의 레벨
노드의 깊이(depth): 특정 노드부터 시작하여 루트까지의 레벨
형제 노드(sibling Node) : 같은 레벨에 나란히 있는 노드들은
ex)컴퓨터의 디렉토리 구조

Binary Search Tree

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

이진 탐색 트리(Binary Search Tree):
모든 왼쪽 자식들은 루트나 부모보다 작은 값이고, 모든 오른쪽 자식들은 루트나 부모보다 큰 값인 특징을 가지고 있는 이진 트리

자료구조정리블로그

Tree traversal

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

전, 중, 후의 기준 : 루트
순서 : 왼쪽부터 오른쪽

전위 순회 : 가장 먼저 방문할 노드는 루트입니다. 루트에서 시작해 왼쪽의 노드들을 순차적으로 둘러본 뒤, 왼쪽의 노드 탐색이 끝나면 오른쪽 노드를 탐색

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

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

이진트리와 BST 이외에 어떠한 트리가 있을까요?
균형 이진 탐색 트리란 무엇일까요?
(Advanced) 힙이란 무엇일까요?

BFS / DFS

그래프의 탐색 :

하나의 정점을 시작으로 그래프의 모든 정점들을 한 번씩 방문(탐색)하는 것을 목적

Breadth-First Search, 너비 우선 탐색

가까운 정점부터 탐색
두 정점 사이의 최단 경로를 찾고 싶을 때

Depth-First Search, 깊이 우선 탐색

하나의 경로를 끝까지 탐색한 후, 미국 도착이 아니라면 다음 경로로 넘어가 탐색
해당 경로를 완벽하게 탐색 가능

FOR STUDY : How to use Graph, Tree Data Structure in Coding Tests

좋은 웹페이지 즐겨찾기