선형 자료 구조와 비선형 자료 구조

55555-Jyeon·2024년 4월 20일
0

Stretch Shallow

목록 보기
3/3
post-thumbnail
post-custom-banner
본 게시글은 <면접을 위한 CS 전공지식노트>의 내용을 정리한 글입니다.


자료 구조

data structure
  • 자료 구조는 효율적으로 데이터를 관리, 수정, 삭제, 탐색, 저장할 수 있는 데이터 집합
  • C++은 STL을 기반으로 전반적인 자료 구조를 가장 잘 설명할 수 있는 언어

STL
C++의 표준 템플릿 라이브러리이자 스택, 배열 등 데이터 구조의 함수 등을 제공하는 라이브러리의 묶음



복잡도

시간 복잡도

  • 입력 크기에 대해 어떠한 알고리즘이 실행되는 데 걸리는 시간
  • 주요 로직의 반복 횟수를 중점으로 측정
  • 일반적으로 빅오 표기법으로 나타냄
  • 효율적인 코드로 개선하는데 쓰이는 척도
빅오 표기법
  • 입력 범위 n을 기준으로 로직이 몇 번 반복되는지 나타내는 표기법
  • 가장 영향을 많이 끼치는 항의 상수 인자를 빼고 나머지 항을 제외
  • 입력 크기가 커질수록 연산량이 가장 많이 커지는 항만 신경 쓰면 된다는 이론

자료 구조에서의 시간 복잡도

아래는 자주 쓰이는 자료 구조의 시간 복잡도를 나타낸 표입니다.
보통 시간 복잡도를 생각할 때 평균과 최악을 고려하며 사용합니다.


공간 복잡도

  • 프로그램을 실행시켰을 때 필요로 하는 자원 공간의 양
  • 공간을 계속해서 필요로 하는 경우도 포함


선형 자료 구조

요소가 일렬로 나열돼 있는 자료 구조

연결 리스트

  • 데이터를 감싼 노드를 포인터로 연결해 공간적인 효율성을 극대화시킨 자료 구조
  • 삽입과 삭제 → O(1)
  • 탐색 → O(n)
  • next와 prev 포인터로 앞/뒤의 노드를 연결시킨 것
  • 맨 앞에 있는 node는 head node라고 함
  • 데이터 추가와 삭제에 용이

연결 리스트 종류

  • 싱글 연결 리스트 : next 포인터만
  • 이중 연결 리스트 : next 포인터 + prev 포인터 둘 다
  • 원형 이중 연결 리스트 : 마지막 노드의 next 포인터가 head node를 가리킴 (나머지는 이중 연결 리스트와 동일)

배열 (Array)

  • 같은 타입의 변수들로 이뤄짐
  • 크기가 정해져 있음
  • 인접한 메모리 위치에 있는 데이터를 모아놓은 집합
  • 중복을 허용
  • 순서가 존재
  • 접근/참조 → O(1)
  • 삽입과 삭제 → O(n)
  • 랜덤 접근 가능
  • 접근/참조에 용이

랜덤 접근과 순차적 접근

  • 랜덤 접근 : 동일한 시간에 배열과 같은 순차적인 데이터가 있을 때 임의의 인덱스에 해당하는 데이터에 접근할 수 있는 기능
  • 순차 접근 : 데이터를 저장된 순서대로 검색

배열과 연결 리스트의 차이

  • 배열 : 상자를 순서대로 나열한 데이터 구조 → 몇 번째 상자인지 알면 해당 상자의 요소를 끄집어낼 수 있음
  • 리스트 : 상자를 선으로 연결한 데이터 구조 → 상자 안 요소를 알기 위해선 상자 내부를 확인해야 함

접근/참조는 배열이 용이하고 추가와 삭제는 리스트가 용이합니다.


벡터 (Vector)

  • 동적으로 요소를 할당할 수 있는 동적 배열
  • 컴파일 시점에 개수를 모를 경우 사용
  • 중복을 허용
  • 순서 존재
  • 랜덤 접근 가능
  • 탐색과 맨 뒤 요소 삭제와 삽입 → O(1)
  • 맨 뒤가 아닌 요소 삭제와 삽입 → O(n)

스택 (Stack)

  • 선입선출 (LIFO)
  • 삽입과 삭제 → O(1)
  • 탐색 → O(n)
  • 사용 : 재귀적인 함수, 알고리즘, 웹 브라우저 방문 기록

큐 (Queue)

  • 후입선출 (FIFO)
  • 삽입과 삭제 → O(1)
  • 탐색 → O(n)
  • 사용 : CPU 작업을 기다리는 프로세스, 스레드 행렬, 네트워크 접속을 기다리는 행렬, 너비 우선 탐색, 캐시


비선형 자료 구조

일렬로 나열하지 않고 자료 순서나 관계가 복잡한 구조


그래프 (Graph)

  • 정점과 간선으로 이뤄진 자료 구조
  • "어떠한 곳에서 무언가를 통해 간다." 에서 어떠한 곳은 정점(vertex), 무언가는 간선(edge)
  • 단방향 간선과 양방향 간선

  • 정점으로 나가는 간선을 해당 정점의 outerdegree, 들어오는 간선을 해당 정점은 indegress라고 함
  • 보통 어떤 정점으로붜 시작해 어떤 정점까지 간다 === "U에서부터 V까지 간다."
  • 가중치 : 간선과 정점 사이에 드는 비용

트리

  • 그래프 중 하나로 그래프의 특징처럼 정점과 간선으로 이뤄짐
  • 트리 구조로 배열된 일종의 계층적 데이터의 집합
  • 구성요소 : 루트 노드, 내부 노드, 리프 노드
  • 숲 : 트리로 이뤄진 집합

트리의 종류

이진 트리

자식의 노드 수가 두 개 이하인 트리

  • 정이진 트리 : 자식 노드가 0 또는 두 개인 이진 트리
  • 완전 이진 트리 : 왼쪽에서부터 채워져있는 이진 트리
  • 변질 이진 트리 : 자식 노드가 하나 밖에 없는 이진 트리
  • 포화 이진 트리 : 모든 노드가 꽉 차 있는 이진 트리
  • 균형 이진 트리 : 왼쪽과 오른쪽 노드의 높이 차이가 1 이하인 이진 트리

이진 탐색 트리 (BST)

노드의 오른쪽 하위 트리에는 '노드 값보다 큰 값'이 있는 노드만 포함되고 왼쪽 하위 트리에는 '노드 값보다 작은 값'이 들어 있는 트리


AVL 트리

Adelson-Velsky and Landis tree

  • 위에 있는 최악의 경우 선형적인 트리가 되는 것을 방지하고 스스로 균형을 잡는 이진 탐색 트리
  • 두 자식 서브 트리의 높이는 항상 최대 1만큼 차이가 난다는 특징 존재

레드 블랙 트리

  • 균형 이진 탐색 트리
  • 탐색, 삽입, 삭제 모두 시간 복잡도가 O(logn)
  • 각 노드는 빨간색/검은색의 색상을 나타내는 추가 비트를 저장
  • 삽입과 삭제 시 트리가 균형을 유지하도록 하는 데 사용
  • 규칙 : "모든 리프 노드와 루트 노드는 블랙이고 어떤 노드가 레드이면 그 노드의 자식은 반드시 블랙이다."

힙 (heap)

  • 완전 이진 트리 기반의 자료 구조
  • 최소힙과 최대힙
  • 해당 힙에 따라 특정한 특징을 지킨 트리
  • 어떤 값이 들어와도 특정 힙의 규칙을 지키도록 만들어짐

우선순위 큐 (Priority Queue)

  • 대기열이라고도 함
  • 우선순위가 높은 요소가 우선순위가 낮은 요소보다 먼저 제공되는 자료 구조
  • 힙을 기반으로 구현

맵 (Map)

  • 특정 순서에 따라 키와 매핑된 값의 조합으로 형성된 자료 구조
  • 레드 블랙 트리 자료 구조를 기반으로 형성
  • 삽입 시 자동으로 정렬
  • map은 해시 테이블을 구현할 때 사용
  • 정렬 보장이 되지 않는 unordered_map과 정렬을 보장하는 map으로 나뉨

셋 (Set)

  • 특정 순서에 따라 고유한 요소를 저장하는 컨테이너
  • 중복되는 요소는 없고 오로지 희소한 unique 값만 저장하는 자료 구조

해시 테이블 (hash table)

  • 무한에 가까운 데이터들을 유한한 개수의 해시 값으로 매핑한 테이블
  • 삽입,삭제, 탐색 시 평균적으로 O(1) 시간 복잡도를 가짐
  • unordered_map으로 구현


profile
🥞 Stack of Thoughts
post-custom-banner

0개의 댓글