[ALGO] Lect1. 자료구조/알고리즘의 정의
교수: 성균관대학교 소프트웨어학과 허재필 교수님
사이트: http://www.kmooc.kr/courses/course-v1:SKKUk+SKKU_46+2021_T1/course/
👉 자료구조, Data Structure
자료구조는 말 그대로 “자료의 구조”를 의미한다. 자료의 구조를 표현하기 위해서는 일반적으로 다음의 3가지 요소가 필요하다.
- 자료의 값 (Data values)
- 자료들 간의 관계 (Relationships among data values)
- 자료에 적용될 수 있는 연산 (Operations that can be applied to the data)
Fundamental data structures
데이터의 구조는 크게 기본 데이터 유형(Primitive)과 기본이 아닌 데이터 유형(Non-primitive)으로 나눌 수 있다.
1. 기본 데이터 유형(Primitive)
프로그래밍 언어에 의해 미리 정의된 데이터 타입을 의미한다. 변수 값의 크기와 유형이 미리 정의되어있다. 가령 C에서는 integer
, float
, character
와 같은 primitive data가 존재한다.
2. 기본이 아닌 데이터 유형(Non-primitive)
프로그래밍 언어에 의해 정의되지 않고 프로그래머에 의해 생성된 데이터 타입이다. 데이터를 저장하는 메모리 위치를 참조하기 때문에 “참조 변수(reference varaibels)” 또는 객체 참조(object references)”라고도 불린다. Non-primitive data는 다음과 같이 세 가지로 분류할 수 있다.
2.1. 선형 데이터 구조, Linear
선형 데이터 구조는 데이터 요소가 순차 또는 선형으로 배열된 구조를 의미한다. 컴퓨터 메모리가 선형 방식으로 배열되어 있기 때문에 구현하기 쉽다는 특징이 있다. array
, stack
, queue
, linked list
는 선형 구조를 갖는다.
stack과 queue 모두 차례로 쌓인 구조이지만, stack은 들어온 역 순으로 데이터가 읽히고 queue는 들어온 순서대로 데이터가 읽힌다는 점에 차이가 있다.
2.2. 비선형 데이터 구조, Non-linear
비선형 데이터 구조는 순차적 또는 선형으로 배열되지 않은 데이터 구조를 의미한다. 선형 데이터 구조에 비해 구현하기 쉽지 않지만, 컴퓨터 메모리를 더 효율적으로 사용할 수 있는 장점을 갖는다. 예로는 tree
와 graph
가 있다.
tree는 두 정점 사이에 하나의 path만 존재하는 반면, graph는 둘 이상의 path가 허용된다. graph는 tree를 일반화한 것이라고 볼 수 있다.
2.3. 파일 데이터 구조, Files
파일 구조는 서로 관련있는 필드로 구성된 레코드 집합인 파일에 대한 자료 구조로, 보조 기억 장치에 데이터가 실제로 기록되는 형태이다. 예로 sequential file
, index file
, direct file
이 있다.
Graph traversal algorithms
선형 데이터 구조에서 데이터 요소는 단일 실행에서만 순회할 수 있는 반면, 비선형 데이터 구조에서 데이터 요소는 다중 실행을 통해 순회가 가능하다. graph나 tree와 같은 비선형 데이터를 순회하는 대표적인 알고리즘에는 DFS와 BFS가 있다.
🗣 뒤에서 더욱 자세히 다루도록 한다.
👉 추상화, Abstraction
컴퓨터 과학에서 추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다. 가령 경복궁을 찾아간다고 할 때, 아래의 왼쪽 그림(위성사진)보다는 오른쪽 그림(약도)이 더 보기 쉽다.
이처럼 필수 정보만 제공하고 세부 사항을 숨기는 프로세스를 추상화라고 하며, 컴퓨팅 사고(computational thinking)에서 중요한 능력 중 하나이다.
👉 알고리즘, Algorithm
알고리즘은 연산의 시퀀스이다. 적절한 알고리즘은 다음의 두 조건을 만족해야 한다.
- 모든 가능한 input instance*에 대해서 정답을 도출해야 한다.
- 반드시 알고리즘은 종료되어야 한다.
인스턴스는 알고리즘의 입력이 되는 데이터로, 필요한 정보를 모두 포함한다.
다양한 알고리즘 중에 더 좋은 알고리즘을 판별하기 위해서는 다양한 요소에 대해 분석해보아야 한다. 대표적으로 점근적 표기법(Asymptotic notation)을 이용하여 알고리즘의 복잡도(complexity)를 분석할 수 있다. 복잡도는 크게 시간 복잡도(time complexity)와 공간 복잡도(space complexity)로 나눌 수 있다.
Fundamental Algorithms
여기서는 대략적으로 어떤 알고리즘이 있는지만 살펴보고, 각 알고리즘에 대한 자세한 내용은 후에 다루도록 한다.
- 정렬 알고리즘(Sorting Algorithm): 원소들을 일정한 순서대로 열거하는 알고리즘
- 최단 경로 알고리즘(Shortest Path Algorithm): graph에서 한 노드에서 다른 노드로 가는 가장 빠른 길을 찾는 알고리즘
- 최소 신장 트리 알고리즘(Minimum Spanning Tree Algorithm): graph를 tree로 변환하는 알고리즘
- 위상 정렬 알고리즘(Topological Sort Algorithm): 방향을 가진 유향 그래프의 꼭짓점들(vertex)을 변의 방향을 거스르지 않도록 나열하는 알고리즘
- 동적 계획법 알고리즘(Dynamic Programming Algorithm): 복잡한 문제를 간단한 sub-problem으로 나누어 푸는 알고리즘
👉 실습 환경
앞으로의 실습은 C++ 프로그래밍 언어를 이용하여 진행된다. Dev-c++(경량 프로그램) 혹은 vscode 코드 편집기를 사용하여 실습을 진행한다.
👉References
- 위키백과-추상화: https://ko.wikipedia.org/wiki/%EC%B6%94%EC%83%81%ED%99%94(%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B3%BC%ED%95%99)
- edureka-Know All About the Various Data Types in Java: https://www.edureka.co/blog/data-types-in-java/
- Geeksforgeeks-Difference between Linear and Non-linear Data Structures: https://www.geeksforgeeks.org/difference-between-linear-and-non-linear-data-structures/