[자료구조] 자료구조 정리

one_jeje·2022년 12월 28일
0

1. Array

  • 동일한 타입의 데이터만 저장 가능
  • 고정된 크기
  • 0부터 시작하는 인덱스로 데이터에 접근 가능 → 모든 요소에 빠르게 접근 가능, 원하는 데이터에 무작위로 접근(RandomAccess) 가능
  • 다차원으로 생성 가능
  • but, 데이터 추가/삭제는 각 원소를 shift해야 하므로 오래 걸림(시간복잡도: O(n))
  • Stack 구현 시 주로 사용

1-1. Array List

  • 가변되는 크기
  • 데이터 추가/삭제 시 메모리를 재할당 하므로 속도가 Array보다 느림

2. Linked List

  • head → 데이터 + 포인터 → 데이터 + 포인터
  • 다음 노드의 주소를 가지고 있는 포인터를 가지고 있음
  • 배열은 크기가 고정되어 있어 메모리의 낭비가 있으나, Linked List는 메모리의 낭비가 적음
  • 데이터 추가/삭제는 빠름(시간복잡도: O(1))
  • but, 순차 접근만이 가능
  • Queue 구현 시 주로 사용

3. Stack

  • 동일한 타입의 데이터만 저장 가능
  • LIFO(Last In, First Out)
  • 중간에 값을 끼워넣을 수 없음(전부 빼고 다시 넣어야 함)
  • 실행 취소나 메모리의 지역변수 및 매개변수 저장되는데에 주로 사용
  • 인덱스만 줄이면 되니까(LIFO) Array List로 주로 구현

4. Queue

  • 동일한 타입의 데이터만 저장 가능(?)
  • FIFO(First In, First Out)
  • OS의 프로세스 관리, 캐시, 너비 우선 탐색에 주로 사용
  • 객체만 줄이면 되니까(FIFO) Linked List로 주로 구현

5. Tree

  • 노드가 계층적으로 이어진 비선형 자료 구조
  • 사이클이 생기지 않는 그래프의 특수한형태
  • 디렉터리 구조에 주로 사용

5-1. BST(Binary Search Tree)

  • 이진트리: 자식 노드가 최대 2개
  • 이진 탐색 트리(BST): 이진 탐색(효율적 탐색) + 연결 리스트(데이터 추가/삭제 유용)
  • 왼쪽 트리의 모든 값은 부모보다 작아야 하고, 오른쪽 트리의 모든 값은 부모보다 커야 함(Q. 같은 값은?)
  • 시간복잡도: O(h = 높이) → 트리가 한 쪽으로 치우쳐진 worst case는 O(n)

5-2. RBT(Red-Black Tree)

  • BST에서 데이터 추가/삭제의 문제점 해결을 위해 등장
  • 자식이 없을 경우 포인터는 NIL
  • 모든 노드를 Red or Black으로 칠하는데 연결된 노드끼리는 색이 겹치지 않음(즉, 자식과 부모는 항상 색이 다름)

6. Heap

  • 완전 이진 트리: 자식 노드는 반드시 0 or 2개를 가져야하며, 왼쪽부터 채워짐(Array로 구현 가능)
  • 최대 힙: 부모 노드가 자식 노드보다 크거나 같음
  • 최소 힙: 부모 노드가 자식 노드보다 작거나 같음
  • 최댓값 or 최솟값 찾을 때 주로 사용
  • 우선순위큐(시간복잡도: O(log n))에 주로 사용

7. Hash Table

  • 해시함수를 통해 인덱스와 키로 저장
  • Null은 허용 x
  • 데이터 크기에 상관없이 삽입 및 검색에 효율적이며 빠름(시간복잡도: O(1) ~ O(n))
  • 데이터 베이스 인덱스 구현이나 사용자 로그인 인증에 주로 사용

7-1. Hash Map

  • 병렬 처리를 하지 않을 때(동기화 고려 x) thread-safe하지 않음(?)
  • Null 허용

8. Graph

  • 정점과 간선으로 이루어진 자료구조(간선은 없을 수도)
  • 웹 페이지 및 링크를 나타나는 데 주로 사용

+) Ref

https://jin-network.tistory.com/127
https://mangkyu.tistory.com/89
https://dev-coco.tistory.com/159

0개의 댓글