본문 바로가기

Data Structures and Algorithms

0.1 자료구조

자료구조(Data Structure)는 아래와 같은 특징을 갖는다.

  • 컴퓨터가 데이터를 효율적으로 다룰 수 있게 도와주는 데이터 보관 방법
  • 컴퓨터가 데이터를 효율적으로 다룰 수 있게 도와주는 데이터에 관한 연산의 총체

우리가 흔히 알고 있는 INT는 32비트의 메모리 공간 안에 수를 할당하고 첫 비트를 부호 표현에 사용하는 등의 '보관 방법'을 정의하고 있고, 덧셈/뺄셈/나눗셈/곱셈/논리/시프트 등 다양한 '연산' 또한 정의하고 있다.

 

자료구조는 아래와 같이 단순 자료구조(Primitive Data Structure)와 복합 자료구조(Non-Primitive Data Structre)로 나뉜다. 단순 자료 구조는 이전의 INT와 같은 통상적으로 제공하는 기본 데이터 형식을 말한다.

 

자료구조
단순 자료구조(Primitive) 복합 자료구조(Non-Primitive)
INT 선형(Linear) 비선형(Non-Linear)
LONG 배열 트리
DOUBLE 링크드 리스트 그래프
.... 스택  
   
   

복합 자료구조는 선형 자료구조(Linear Data Structure)와 비선형 자료구조(Non-Linear Data Structure)로 나뉜다.

  • 선형 자료구조는 데이터 요소를 순차적으로 연결하는 자료구조이고, 구현하기 쉽고 사용하기 쉽다. 
  • 비선형 자료구조는 배열(Array), 링크드 리스트(Linked List), 스택(Stack), 큐(Queue) 등이 해당된다.

비선형 자료구조는 선형 자료구조와 달리 데이터 요소를 비순차적으로 연결한다. 한 데이터 요소에서 여러 데이터 요소로 연결되기도 하고, 여러 데이터 요소가 하나의 데이터 요소로 연결되기도 한다. 이는 트리와 그래프로 불리운다.


※ 중요 개념

추상 형식(ADT - Abstract Data Types)은 자료구조의 동작 방법을 표현하는 데이터 형식이다. 정리하면 추상 형식은 자료구조가 갖춰야 할 일련의 연산이라고 할 수 있다. 이 연산을 C 언어로 표현하면 함수가 된다.

리스트를 예로 들어보면 리스트는 데이터에 순차적으로 접근해서 그 리스트를 다룰 수 있도록 기능을 제공해야 한다. 특정 위치에 있는 노드에 접근(Get)하거나, 목록의 마지막에 데이터를 추가(Append)하거나, 목록의 중간에 삽입(Insert)하거나, 삭제(Delete)하는 기능들이다.

 

ADT는 정의하기 나름이다. 어떤 ADT가 특정 연산을 반드시 제공해야 된다는 법은 없다. 

추상 형식이 구조를 제시하면 자료구조는 이를 구현한다. 배열로 리스트를 구현한다고 가정해보면, 배열의 길이가 곧 리스트의 길이가 되고 배열의 첫 요소는 시작 노드, 배열의 마지막 요소는 마지막 노드가 된다. 현재 다루고 있는 요소의 첨자(Index)가 노드가 된다. 여기에 탐색/추가/삽입/수정/삭제와 같은 기능을 구현하면 하나의 자료구조가 완성된다.

 

ADT 자료구조
리스트 링크드 리스트
더블 링크드 리스트
환형 리스트
스택 배열 기반 스택
링크드 리스트 기반 스택
환형 큐
링크드 큐
트리 이진 트리
LCRS 트리
레드 블랙 트리
그래프 방향성 그래프
무방향성 그래프
배열 기반 힙
링크드 리스트 기반 힙

자료 구조는 왜 공부해야 하는가?

  • 첫째로, 자료구조의 내부를 이해하면 라이브러리에서 엉뚱한 자료구조를 선택하는 일을 피할 수 있다. 동일한 ADT를 사용하더라도 자료구조에 따라 프로그램의 성능이 크게 달라질 수 있다. 예로, 네트워크 프로그램에의 입출력 버퍼에는 링크드 큐보다 환형 큐를 사용하는 것이 처리 속도 면에서 유리하고 메모리의 효율이 더 중요한 프로그램에서는 링크드 큐가 환형 큐보다 낫다. 자료구조 지식이 있는 프로그래머는 그 이유를 이해하고 라이브러리 문서를 통해 적절한 자료구조를 선택할 수 있다.
  • 둘째로, 자료구조는 알고리즘에 데이터를 효율적으로 사용할 수 있게 도와주는 핵심 부품 역할을 하기 때문이다. 즉, 자료구조를 모르면 알고리즘을 공부하는 데 어려움이 따른다.