[CS 정리] 자료 구조(Data Structure)

김정욱·2021년 5월 26일
3

면접준비

목록 보기
1/6
post-thumbnail
post-custom-banner

자료구조 개념

  • 대량의 데이터효율적으로 관리하기 위해, 데이터를 저장정렬하는 방식
  • 데이터를 어떤 방식으로 저장하고 정렬하느냐에 따라 추출 방식데이터를 처리조작하는데 필요한 코드달라진다

자료구조 분류

배열(Array)

  • 한가지 데이터 타입데이터순차적으로 저장 및 정렬하는 자료구조
  • 각 데이터마다 Index를 부여하여 데이터 검색용이(장점)
  • 배열크기고정적(단점)
  • 데이터가 삭제되면 배열 전체의 데이터를 재정렬(단점)

리스트(List)

[ 선형 리스트(LinearList) ]

  • ArrayList 라고 하기도 함
    : 배열(Array)처럼 데이터들이 순서대로 늘어선 구조이기 때문
  • 데이터 접근용이 --> O(1)
  • 데이터 삽입/삭제불리 --> O(N)
  • 리스트의 크기제한되어 있어서 재조정하는 것은 많은 비용 소요

[ 연결 리스트(LinkedList) ]

ref : https://beginnersbook.com/2013/12/linkedlist-in-java-with-example/

  • 노드포인터구성
  • 배열(Array)단점보완형태의 자료구조
    --> 크기가변적인 배열(장점)
  • 포인터를 위한 저장 공간따로 필요(단점)
  • 데이터 접근불리 --> O(N)
  • 데이터 삽입/삭제용이 --> O(1)
  • 두개의 포인터를 가진 이중 연결리스트(Double Linked List) 존재

스택(Stack)

  • 후입선출(LIFO) 방식으로 데이터저장정렬하는 자료구조
  • 데이터입력출력top에서만 가능
  • 사용 되는 곳
    • 함수의 콜스택
    • 문자열 역순 출력
    • 연산자 후위표기법

큐(queue)

ref : https://galid1.tistory.com/483

  • 선입선출(FIFO) 방식으로 데이터저장정렬하는 자료구조
  • 데이터의 삽입에서만 / 삭제에서만 가능
  • 사용되는 곳
    • OS의 프로세스 스케쥴링 방식을 구현하기 위해 사용
    • 버퍼

그래프(Graph)

ref :
https://sarah950716.tistory.com/12

개념

  • 정점(V)간선(E)으로 이루어진 자료구조

종류

  • 종류
    • 방향 그래프
      : 두 정점을 연결하는 간선에 방향이 존재하는 그래프
    • 무방향 그래프
      : 두 정점을 연결하는 간선방향존재하지 않는 그래프
    • 가중치 그래프
      : 두 정점을 이동할 때 비용드는 그래프

구현 방법

(무향 그래프인 경우)

  • 인접 행렬(Array) : 2차원 배열을 이용해서 구현
    • 장점
      • 두 정점에 대한 연결 정보를 조회할 때, O(1) 소요
      • 구현이 쉽다
    • 단점
      • 특정 노드에 연결된 노드를 확인하려면, 모든 노드를 확인해야 함 --> O(V)
        (i번 노드에 연결된 것들을 확인하려면 adj[i][1] ~ adj[i][V]확인해야 함)
      • V^2 만큼메모리 공간이 항상 필요
  • 인접 리스트(List)
    • 장점
      • 실제로 연결된 노드에 대한 메모리만 필요
      • 특정 노드에 연결된 노드를 확인하려면, 연결된 간선 만큼만 보면 됨 --> O(E)
    • 단점
      • 두 정점에 대한 연결 정보를 조회 할 때, O(V) 소요
        (i번 노드j와 연결된 것확인하려면 adj[i]에 있는 모든 정점을 확인해야 하기 때문)

추가

  • ST(Spanning Tree) = 신장 트리
    • 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프
      ( 모든노드 포함 + 사이클 X )
  • MST(Minmum Spanning Tree) = 최소 신장 트리
    • 최소한의 비용으로 구성되는 신장 트리
    • MST를 구하기 위한 알고리즘
      • 크루스칼(Kruskal) 알고리즘
      • 프림(Prim) 알고리즘
  • 그래프에서 순환(Cycle) 판단 방법
    • 무방향 그래프 --> 서로소 집합 사용
      • Union-Find 사용해서 판별 가능
    • 방향 그래프 --> DFS 활용
      • 모든 정점에 대해 DFS를 수행하는 방법 : O(V(V+E)) 소요
      • 방문 노드를 기록하고 재방문일 경우 Cycle로 판단하는 방법 : O(V) 소요
        --> 재귀로 DFS 수행, 각 재귀마다 방문 노드를 기록하며 재방문이 생기면 Cycle로 판단

트리(Tree)

ref :
https://zorba91.tistory.com/293
https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Plus-Tree

  • 정점(V)간선(E)를 이용해 사이클을 이루지 않도록 구성한 Graph의 특수한 형태의 자료구조
  • 루트노드 / 부모노드 / 자식노드 라는 관계가 형성
  • 종류
    • 이진 트리(Binary Tree)
      : 각 노드최대 두개의 자식을 갖는 트리
    • 이진 탐색 트리(Binary Search Tree)
      : 이진 트리를 기반하여 반드시 좌측에 위치한 노드우측에 위치한 노드보다 작은 값을 가지는 규칙이 있는 트리
      • 이진 탐색 트리 검사 알고리즘
        --> 노드를 중심으로 왼쪽 서브 트리의 최대값이 더 작고, 오른쪽 서브 트리의 최소값이 더 큰지 재귀로 확인
      • 이진 탐색 트리의 경우 편향되어 이 들어가면 최대 O(N)이 소요된다
        --> AVL Tree / Red-Black Tree의 등장 원인
    • 균형 트리
      : O(logN) 시간에 insert / find를 할 수 있을 정도로 균형이 잘 잡혀있는 트리 --> 레드-블랙 트리 / AVL트리
    • 등등 많은 트리 존재

AVL Tree

  • AVL Tree
    • 균형을 맞추는 방법
      : 왼쪽 / 오른쪽 서브트리높이 차이2이상일 때 회전을 통해서 트리의 높이균형있게 맞춤
    • 특징
      • Red-Black 트리시간복잡도는 같으나, 삽입/삭제시 회전이 더 자주 발생
      • Red-Black 트리보다 검색효율적

Red-Black Tree

  • Red-Black Tree
    • 균형을 맞추는 방법
      • ReColoring : 조건에 맞춰 Red/Black으로 재 색설정
      • ReStructuring : 조건에 맞춰 적절한 회전으로 균형을 조절
    • 특징
      • 이진 탐색 트리가장 효율적인 자료구조
      • AVL-Tree보다 삽입/삭제 연산이 효율적
      • AVL-Tree보다 검색비효율적

B-Tree

(모든 키 값데이터함께 존재 / 편의상 생략된 것)

  • 설명
    • 이진 트리확장하나의 노드가질 수 있는 자식 노드의 최대 숫자2보다 큰 트리 구조
    • 최대 M개의 자식을 가질 수 있는 B트리M차 B트리 라고 함
    • 내부적으로 다양한 트리 구성 조건을 통해, 트리의 균형을 맞추는 로직존재함
    • 최악의 경우에도 O(logN)검색 성능을 보장
    • 검색은 기존 이진 탐색 트리동일한 방식으로 수행
    • 다양한 삽입과정은 다음 글 참조 --> 그림으로 알아보는 B-Tree
  • B-Tree 구성 조건
    • 노드는 최대 M개 부터 M/2개 까지의 자식을 가질 수 있습니다
    • 노드에는 최대 M−1개 부터 [M/2]−1개의 키포함될 수 있습니다
    • 노드의 키가 x개라면 자식의 수는 x+1개 입니다
    • 최소차수는 자식수의 하한값을 의미하며, 최소차수가 t라면 M=2t−1을 만족합니다 (최소차수 t가 2라면 3차 B트리이며, key의 하한은 1개입니다)

B+Tree

  • 설명
    • B-Tree유사하지만 리프노드(자식 노드가 없는 노드)연결리스트 형태로 연결되어 선형 검색이 가능한 트리
    • 모든 key,data리프노드에 모여있으며, 연결리스트로 연결된 구조 --> 순차 처리 가능
    • B+ 트리는 인덱스구조에서 순차접근에 대한 문제의 해결책으로 제시
    • B+ 트리의 비단말 노드(index set)들은 데이터의 빠른 접근을 위한 인덱스 역할만 하기 때문에 키와 포인터로만 구성
    • 실제 DB의 인덱스구성하는 자료 구조

B-Tree 와 B+Tree 차이점

  • 정리
    • B+Treeleaf node끼리 연결리스트로 연결되어 있다
    • B-Tree각 노드에서는 key 뿐만 아니라, data도 들어갈 수 있지만, B+Tree에서는 순차 집합(leaf node의 집합)에만 데이터가 들어갈 수 있음
    • B+TreeB-Tree와 달리 삽입/삭제 연산leaf node에서만 이루어짐

해시 테이블(Hash Table)

  • 데이터효율적으로 관리하기 위해, 임의의 길이 데이터고정된 길이의 데이터매핑하는 것
  • keyvalue한 쌍으로 저장하는 자료구조
  • keyHash함수로 연산하여 나온 결과(해시값, 해시주소)으로 Value를 찾는 방식을 사용
  • key이용하여 Value를 빠르게 검색 --> O(1)
  • 저장 공간많이 필요로 한다 --> 공간탐색시간맞바꾼 기법
  • 결국 데이터가 많아지면 충돌(collision)발생한다
  • 그래도 해시 테이블을 쓰는 이유?
    • 적은 자원으로 많은 데이터효율적으로 관리하기 위해
    • 무한한 데이터들을 유한한 개수의 해시값으로 매핑하면 작은 메모리로 관리 가능
  • 인덱스 값을 통한 조회평균 O(1)이 소요되지만, 해시 index값이 충돌할 경우 최대 O(n)이 소요

충돌 문제 해결

  • 체이닝(Chaining)
    • 연결리스트노드계속 계속 추가해 나가는 방식
      --> 제한 없이 계속 가능하나, 메모리 문제가 발생
  • 개방 주소화(Open Addressing)
    • 해시 함수로 얻은 주소가 아닌 다른 주소데이터를 저장할 수 있도록 허용 (해당 키 값에 저장되어있으면 다른 주소저장)
    • 개방 주소화 방식으로 다른 주소선택하는 방법들이 있다
      • 선형 탐색 : 정해진 고정 폭으로 옮기는 방법
      • 2차원 탐색 : 선형 탐사가 n칸 옆을 검사한다면, 이것은 n^2칸 옆을 검사
      • 중복 해싱(이중 해싱) : 두번째 해시함수를 사용하여 재 해싱

좋은 해시 함수란?

  • 충돌 문제해결하면서 단순 균등 해싱가깝도록 하는 것체이닝이든, 개방 주소화 방식이든 해시테이블의 성능을 높이는데 중요
  • 균등한 확률(equally likely)로, 독립적(idependently)으로 해시되는 것좋은해시 함수
    • 주민번호처럼 특정한 패턴을 가지는 되도록 불규칙적으로 만들어야 함

힙(Heap)

  • 트리구조기반으로 한 자료구조로, 데이터에서 최대값최소값빠르게 찾기 위해 고안완전이진트리(Complete Binary Tree)
  • 우선순위 큐(Priority queue)구현하기 위한 자료구조
  • 힙의 루트노드최대값이 있는 경우 --> 최대힙(Max Heap)
  • 힙의 루트노드에 최소값이 있는 경우 --> 최소힙(Min Heap)
  • Heapify 연산
    • Heap구조를 만들기 위한 연산
    • O(logN)시간복잡도 소요

트라이(trie)

ref : https://www.crocus.co.kr/1053

  • 문자열저장하고 효율적으로 탐색하기 위한 트리 형태자료구조
  • 문자열 하나를 찾는 데에는 O(M)시간복잡도로 해결 가능
    --> BST(이진탐색트리)였으면 문자열의 경우 O(M*logN)소요 / M=문자열 최대 길이
profile
Developer & PhotoGrapher
post-custom-banner

0개의 댓글