CS/Algorithm

자료구조

태나미 2022. 3. 3. 16:46
자료구조(data structure)는 컴퓨터 과학에서 효율적인 접근 및 수정을 가능케 하는 자료의 조직, 관리, 저장을 의미한다. 자료 구조는 데이터 값의 모임, 또 데이터 간의 관계, 그리고 데이터에 적용할 수 있는 함수나 명령을 의미한다. - 위키백과

자료구조의 종류

선형 구조 : 한 종류의 데이터가 선처럼 길게 나열된 자료구조.

  • 배열
  • 해시
  • 스택
  • 연결리스트

비선형 구조 : 선형 구조가 아닌 모든 자료구조. i번째 값을 탐색한 뒤의 i+1이 정해지지 않는 구조

  • 그래프
  • 트리

자바스크립트의 자료구조

배열(Array)

  • 배열은 대부분의 프로그래밍 언어에서, 가장 간단하고 가장 많이 쓰이는 자료구조형이다.
  • 일반적인 배열은 인덱스로 배열 요소에 빠르게 접근할 수 있습니다. 하지만 특정 요소를 탐색하거나 요소를 삽입 또는 삭제하는 경우에는 효율적이지 않습니다.
  • 자바스크립트 배열은 해시 테이블로 구현된 객체이므로 인덱스로 배열 요소에 접근하는 경우, 일반적인 배열보다 성능적인 면에서 느릴 수 밖에 없는 구조적인 단점을 갖습니다. 하지만 특정 요소를 탐색하거나 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있습니다.
  • 장점 : Fast lookup, Fast push/pop, Ordered
  • 단점 : Slow inserts, Slow deletes, Slow searching, Fixed size

해시 테이블(Hash Table)

  • Hash Table은 Key와 Value가 쌍을 이룬 형태로 데이터가 저장되어 있는 자료구조형을 지칭합니다.
  • 객체는 Hash Table이라는 자료구조의 종류 중 하나입니다.
  • 배열 내 데이터도 Key와 Value로 이루어져 있기는 하지만 배열에서는 Key가 오직 index, 즉 숫자만 가능한 것에 비해
    Hash Table에서는 문자열 또한 Key가 될 수 있습니다.
  • 장점 : Fast Search, Fast Insertion, Fast Deletion, Fast lookup
  • 단점 : 무작위 주소 할당으로 인한 문제

연결 리스트(Linked List)

  • Linked List는 value pointer가 한 쌍인 노드가 모여있는 자료구조형을 의미합니다.
    위 사진에서 푸른색 부분은 data를 저장하고 있고, 초록색 부분은 다음 노드를 가리키는 pointer 역할을 하는 address 부분입니다.
  • Linked List에서 가장 앞 쪽 시작부분을 Head,가장 마지막 부분을 Tail이라고 부릅니다.
  • Tail의 pointer는 더 이상 가리킬 노드가 존재하지 않으므로 Null을 가리키게 됩니다.
  • 장점 : Fast Insertion, Fast Deletion, Ordered, Flexible Size
  • 단점 : Slow lookup, More Memory

 

 

스택(Stack) / 큐(Queue)

  • 스택과 큐 모두 Linear한 자료구조형입니다.

1) 스택(Stack)

  • LIFO(Last In, First Out), 마지막으로 삽입된 데이터 제일 먼저 나가는 개념입니다.
  • 자바스크립트에서 스택은 array 또는 Linked List를 이용하여 만들 수 있습니다.
    • 1) array 각 element들이 서로 연관되어 있기 때문에 속도가 더 빠릅니다. 하지만 메모리 공간이 한정되어 있기 때문에 할당된 메모리를 다 사용하면 현재 배열을 다른 곳에 복사하기 때문에 메모리를 조금 더 사용하게 될 수도 있습니다.
    • 2) Linked List 메모리 여기저기에 흩어져있기 때문에 상대적으로 느릴 수 있습니다. 하지만 반면 메모리 공간이 한정되어 있지 않고 얼마든지 계속 값을 추가할 수 있다는 장점이 있습니다.

2) 큐(Queue)

  • FIFO(First In, First Out), 제일 먼저 들어온 데이터가 제일 먼저 나가는 개념입니다.
  • 큐 또한 자바스크립트에서 스택은 array 또는 Linked List를 이용하여 만들 수 있습니다
    • array의 경우 앞에서부터 element를 제거해야 하는데 그 경우 index를 다시 재조정해야 하기 때문에 O(n)이 됩니다.
    • Queue는 Linked List로 만들게 되면 array보다 시간 복잡도가 훨씬 효율적입니다.
  • 장점 : Fast Operation(removing, pushing), Fast Peek, Ordered
  • 단점 : Slow Lookup

트리(Tree)

  • 트리는 노드로 이루어진 자료 구조입니다. 하나의 루트 노드를 갖게 되며, 루트 노드는 0개 이상의 자식 노드를 갖고 있습니다.
  • 데이터를 순차적으로 저장하지 않기 때문에 비선형 자료구조입니다.
  • 루트 노드(root node): 부모가 없는 노드, 트리는 하나의 루트 노드만을 가집니다.
  • 단말 노드(leaf node): 자식이 없는 노드, ‘말단 노드’ 또는 ‘잎 노드’라고도 부릅니다.
  • 트리는 이진 트리, 이진 탐색 트리, 균형 트리(AVL 트리, red-black 트리), 이진 힙(최대힙, 최소힙) 등이 있습니다. 자세히

 

그래프(Graph)

  • 단순히 노드(N, node)와 그 노드를 연결하는 간선(E, edge)을 하나로 모아 놓은 자료 구조
  • 루트 노드라는 개념이 없고, 부모-자식 관계라는 개념이 없습니다.
  • 정점(vertex): 위치라는 개념. (node 라고도 부름),
  • 간선(edge): 위치 간의 관계. 즉, 노드를 연결하는 선 (link, branch 라고도 부름)
  • 그래프 종류로는 크게 방향 그래프와 무방향 그래프가 있습니다. 자세히
  • 그래프의 탐색 방법으로는 깊이 우선 탐색(DFS) 와 너비 우선 탐색 (BFS)가 있습니다.
    • 깊이 우선 탐색(DFS, Depth-First Search): 루트 노드(혹은 다른 임의의 노드)에서 시작해서 다음 분기로 넘어가기 전에 해당 분기를 완벽하게 탐색하는 방법
    • 너비 우선 탐색(BFS, Breadth-First Search): 루트 노드(혹은 다른 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법

 



출처: 

https://soldonii.tistory.com/category/Javascript%20%EA%B3%B5%EB%B6%80/Data%20Structure%20+%20Algorithms%28-%29?page=3

https://ko.wikipedia.org/wiki/%EC%9E%90%EB%A3%8C_%EA%B5%AC%EC%A1%B0

https://velog.io/@blackb0x/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0

https://poiemaweb.com/js-array-is-not-arrray

https://gmlwjd9405.github.io/2018/08/13/data-structure-graph.html

https://gmlwjd9405.github.io/2018/08/12/data-structure-tree.html