자료형 & 추상 자료형
추상 자료형
추상화란?
- 어떤 시스템의 간략화 된 기술 또는 명세
- 정보은닉
추상 자료형이란?
- ADT : Abstract Data Type
- 데이터나 연산이 무엇인가를 정의
- 데이터나 연산을 어떻게 구현할 것인지는 정의하지 않음
자료형 vs 추상 자료형
자료형이란?
- 데이터의 집합 + 연산의 집합
자료형 예시
데이터 | { …, -2, -1, 0, 1, 2, … } |
연산 | +, -, *, /, % |
추상 자료형이란?
- 데이터 : 집합 개념
- 연산의 정의 : 연산의 이름, 매개변수, 연산의 결과, 연산이 수행하는 기능 등을 기술
즉, 연산은 함수와 유사하다.
추상 자료형 예시
<자연수 ADT="">자연수> | |
---|---|
데이터 | 1에서 시작하여 INT_MAX까지의 순서화된 정수의 부분 범위 |
연산 | add(x, y) : x+y가 INT_MAX보다 작으면 x+y 반환 distance(x, y) : x가 y보다 크면 x-y 반환, x가 y보다 작으면 y-x 반환 |
추상 자료형 & 자료구조
추상 자료형과 자료구조의 관계
자료구조
자료구조는 추상 자료형을 프로그래밍 언어로 구현한 것
추상 자료형 구현
C언어에서의 추상 자료형
- 데이터 : 구조체
- 연산 : 함수
실행 시간 측정법
함수
사용 함수
#include <time.h>
clock()
### 반환값 - clock_t 타입 - 호출되었을 때의 시스템 시각 ### 예시 코드 ```c #include
# 알고리즘 성능 분석 ## 알고리즘 복잡도 분석 ### 복잡도 분석 종류 - **시간 복잡도 분석** : 알고리즘의 수행 시간 분석 - **공간 복잡도 분석** : 수행시 필요로 하는 메모리 공간 분석
## 시간 복잡도 ### 연산 고려 조건 - 산술 연산 - 대입 연산 - 비교 연산 - 이동 연산 > **보통 반복 루프 제어 연산은 고려X** ### 특징 - 입력 개수 n에 영향 받음 - 시간복잡도 함수 ⇒ T(n) ### 계산 예시 ```c #include
# 빅오 표기법 ## 설명 ### 정의 두 개의 함수 f(n)과 g(n)이 주어졌을 때, 모든 n≥n0에 대하여 \|f(n)\| ≤ c\|g(n)\|을 만족하는 2개의 상수 c, n0이 존재하면 f(n) = O(g(n))이다. ### 특징 빅오는 상한이다. ### 계산 방법 차수가 가장 큰 항 이외의 항 무시, 또한 해당 항의 계수도 무시 ### 예시 "T(n) = 2n^2 + 5n +10"일때 ⇒ O(n^2)
## 빅오 표기법의 종류 ### 종류 - **O(1)** : 상수형 - **O(logn)** : 로그형, 문제가 절반씩 연속적으로 줄어드는 경우 ```c for(int i=1; i<n; i*=2) { //do } ``` - **O(n)** : 선형 - **O(nlogn)** : 로그선형 - **O(n^2)** : 2차형 - **O(n^k)** : k차형 - **O(2^n)** : 지수형 - **O(n!)** : 팩토리얼형 ### 빅오 표기법의 복잡도 순 O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^k) < O(2^n) < O(n!)
# 빅오메가 표기법 ## 배경 ### 빅오의 상한 문제 - 빅오는 상한이기 때문에 O(n)을 만족한다면, O(n^2) 등도 모두 만족함 ## 설명 ### 정의 > **두 개의 함수 f(n)과 g(n)이 주어졌을 때, 모든 n≥n0에 대하여 |f(n)| ≥ c|g(n)|을 만족하는 2개의 상수 c, n0이 존재하면 f(n) = Ω(g(n))이다.** ### 특징 - 빅오메가는 하한이다.
# 빅세타 표기법 ## 설명 ### 정의 > **두 개의 함수 f(n)과 g(n)이 주어졌을 때, 모든 n≥n0에 대하여 c1|g(n)| ≤ |f(n)| ≤ c2|g(n)|을 만족하는 3개의 상수 c1, c2, n0이 존재하면 f(n) = θ(g(n))이다.** ### 특징 - O() == Ω()
# 1차원 배열 ## 설명 ### 배열의 특징 - 직접 접근 방식 - 항목 접근 시간 복잡도 ⇒ O(1) | <링크드 리스트(연결 리스트)> | |------------------------------| |순사접근방식 (첫 요소부터 하나씩 찾아감)| |항목 접근 시간 복잡도 ⇒ O(n)|
### 배열의 초기화 `자료형 변수명[크기n] = { 요소1, 요소2, ..., 요소n }` <예시> ```c int nums[5] = { 1, 2, 3 }; ``` >배열의 크기보다 적은 수의 요소로 초기화 ⇒ 나머지 공간을 0으로 채움
## 문자열 : 특별한 1차원 배열 ### 선언방법 `char 변수명[크기] = "문자열";` ```c #include
### 문자열 복사 함수 ```c #include
### 문자열 비교 함수 ```c #include
# 2차원 배열 ## 설명 ### 선언 방법 `데이터타입 배열이름[행의개수][열의개수] int nums[5][3];` ### 초기화 방법 ```c int nums[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} } ``` ### 특징 : row-oriented 같은 행끼리 붙여서 메모리에 저장 ![2차원배열 저장형태](/assets/img/2021-06-26-DATASTRUCTURE_Begin/Untitled_4.png)
# 파라미터 전달 방식 ## 변수의 전달 ### 특징 - 값 자체를 복사하여 전달한다. ### 예시 ```c #include
## 배열의 전달 ### 특징 - 주소를 복사하여 전달한다. - 함수로 배열(주소)을 전달할 때, 길이도 같이 전달해야 한다. (보통 배열의 길이까지 매개변수로 받는다.)
# 구조체 ## 설명 ### 구조체란? - 데이터타입이 각각 요소마다 다른 배열 ## 사용 방법 1 : struct ### 정의 방법 ```c #include
## 사용 방법 2 : typedef ### 정의 방법 ```c #include
## 멤버 접근 ### 항목 연산자 - .(마침표) 사용 - 구조체의 멤버변수가 문자열타입일 때, 대입 연산자로 값 할당 불가능 ⇒ strcpy 함수 사용 ### 예시 ```c #include
## 구조체 복사 ### 대입 연산자 - 대입 연산자 사용시 깊은 복사를 함 ### 예시 ```c #include
# 배열과 구조체 응용 : 다항식 ## 설명 ### 다항식 형태 - p(x) = a_nx^n + a_{n-1}x^{n-1} +... + a_1x + a_0 ### 다항식의 차수 - 다항식의 차수(degree) : 다항식에서 가장 큰 차수
## 다항식의 배열 표현 : 다항식의 왼쪽부터 계수 저장 ### 방법 다항식의 왼쪽 항부터 계수를 배열에 저장한다. - 항의 계수 : 배열에 저장 - 항의 차수 : 배열의 인덱스 > '다항식의 차수' - '배열 요소 중 해당요소의 인덱스' = 차수 ![왼쪽부터 계수 저장](/assets/img/2021-06-26-DATASTRUCTURE_Begin/Untitled_2.png) ### 예시 다항식 - p(x) = 10x^{5}+6x+3 ### 다항식 변환 - 다항식을 1차원 배열로 표현하기 위해 변환한다. - p(x) = 10x^{5}+6x+3 = 10x^{5}+0x^{4}+0x^{3}+0x^{2}+6x+3x^0 ### 예시 코드 ```c #include
## 다항식의 배열 표현 : 다항식의 오른쪽부터 계수 저장 ### 방법 다항식의 오른쪽 항부터 계수를 배열에 저장한다. - 항의 계수 : 배열에 저장 - 항의 차수 : 배열의 인덱스 > '배열 요소 중 해당요소의 인덱스' = 차수 ![오른쪽부터 계수저장](/assets/img/2021-06-26-DATASTRUCTURE_Begin/Untitled_3.png) ### 예시 다항식 - p(x) = 10x^{5}+6x+3 ### 다항식 변환 - 다항식을 1차원 배열로 표현하기 위해 변환한다. > p(x) = 10x^{5}+6x+3 = 10x^{5}+0x^{4}+0x^{3}+0x^{2}+6x+3x^0 ### 예시 코드 ```c #include
## 다항식 구현 : 방법 1 ### 방법 1 vs 방법 2 - 다항식의 차수 - 배열의 인덱스 = 각 항의 차수 ⇒ 방법 1 - 배열의 인덱스 = 각 항의 차수 ⇒ 방법 2 ### 코드 ```c #include
## 다항식 구현 : 방법 2 ### 방법 1 vs 방법 2 - 다항식의 차수 - 배열의 인덱스 = 각 항의 차수 ⇒ 방법 1 - 배열의 인덱스 = 각 항의 차수 ⇒ 방법 2 ### 코드 ```c #include
## 희소 다항식의 표현 ### 희소 다항식이란? 대부분 항의 계수가 0인 다항식 > 10x^{100} + 7 ### 기존 방식의 문제점 희소 다항식을 1차원 배열로 표현한다면, 메모리 낭비가 심해짐 ### 해결법 "각 항의 차수와 계수를 담는 구조체"를 멤버로 갖는 구조체 이용 ![희소다항식 표현](/assets/img/2021-06-26-DATASTRUCTURE_Begin/Untitled_4.png) ### 예시 코드 ```c #include
---
- 성결대학교 컴퓨터 공학과 박미옥 교수님 (2021)
- 최영규, 『두근두근 자료구조』