4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... ·...

25
1. 기본 개념 (Page 31) 4.2 시간 복잡성(Time Complexity) T p = 컴파일 시간 + 실행 시간 컴파일 시간은 고정 & 한번만 필요 질문: T p 어떻게 계산할까? T p 컴파일러 option하드웨어 사양에 따라 가변 프로그램 단계 (Program Step)활용하자. Program Step 정의: 실행 시간이 프로그램의 특성과는 무관한 프로 그램의 문법적인 혹은 논리적인 단위 Program step계산: count이용 : Program 1.12 ~ Program 1.16

Transcript of 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... ·...

Page 1: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 31)

4.2 시간 복잡성(Time Complexity)

Tp = 컴파일 시간 + 실행 시간 컴파일 시간은 고정 & 한번만 필요 질문: Tp를 어떻게 계산할까?

Tp는 컴파일러 option과 하드웨어 사양에 따라 가변 프로그램 단계 수(Program Step)을 활용하자.

Program Step

정의: 실행 시간이 프로그램의 특성과는 무관한 프로그램의 문법적인 혹은 논리적인 단위

Program step의 계산: count를 이용

예: Program 1.12 ~ Program 1.16

Page 2: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 32)

Program 1.12: Count 이용 예(1)

float sum(float list[], int n) float tempsum = 0; count++; // for assignment int i; for (i = 0; i < n; i++) count++; // for the for loop count++; // for assignment tempsum += list[i]; count++; // last execution of for count++; // for return return tempsum;

Page 3: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 33)

Program 1.13: 1.12의 단순화

float sum(float list[], int n) float tempsum = 0; int i; for (i = 0; i < n; i++) count += 2; count += 3; return 0;

Page 4: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 34)

Program 1.14: Count 이용 예(2)

float rsum(float list[], int n) count++; // for if conditional if (n) count++; // for return and rsum invocation return rsum(list, n-1) + list[n-1]; count++; return list[0];

Page 5: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 35)

Program 1.15: 행렬 더하기

void add(int a[][MAX_SIZE], int b[][MAX_SIZE], int c[][MAX_SIZE], int rows, int cols) int i, j; for (i = 0; i < rows; i++) for (j = 0; j < cols; j++) c[i][j] = a[i][j] + b[i][j];

Page 6: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 36)

Program 1.16: Count 이용 예(3)

void add(int a[][MAX_SIZE], int b[][MAX_SIZE], int c[][MAX_SIZE], int rows, int cols) int i, j; for (i = 0; i < rows; i++) count++; // for i for loop for (j = 0; j < cols; j++) count++; // for j for loop c[i][j] = a[i][j] + b[i][j]; count++; // for assignment statement count++; // last time of j for loop count++; // last time of i for loop

Page 7: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 37)

Program 1.17: 1.16의 단순화

void add(int a[][MAX_SIZE], int b[][MAX_SIZE], int c[][MAX_SIZE], int rows, int cols) int i, j; for (i = 0; i < rows; i++) for (j = 0; j < cols; j++) count += 2; count += 2; count++;

Page 8: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 38)

Step Count Table (1)

Statement

Float sum( float list[ ], int n ) float tempsum = 0; int i; for ( i = 0; i < n; i++ ) tempsum += list[i]; return tempsum;

0 0 0 0 0 0 1 1 1 0 0 0 1 n+1 n+1 1 n n 1 1 1 0 0 0

Total

s/e Frequency Total step

2n+3

Page 9: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 39)

Step Count Table (2)

Statement

Float rsum( float list[ ], int n ) if (n) return rsum(list, n-1)+ list[n-1]; return list[0];

0 0 0 0 0 0 1 n+1 n+1 1 n n 1 1 1 0 0 0

Total

s/e Frequency Total step

2n+2

Page 10: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 40)

Step Count Table (3)

Statement

void add( int a [ ] [MAX_SIZE] … ) int i, j; for ( i = 0; i < rows; i++ ) for ( j = 0; j < cols; j++ ) c[ i ][ j ] = a[ i ][ j ] + b[ i ][ j ];

0 0 0 0 0 0 0 0 0 1 rows+1 rows+1 1 rows · (cols+1) rows · cols + rows 1 rows · cols rows · cols 0 0 0

Total

s/e Frequency Total step

2rows · cols + 2rows + 1

Page 11: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 41)

4.3 근사 표현(Ο, Ω, Θ)

동기 정확한 step count를 계산하는 것은 쉽지 않다. Program step의 정의 자체가 정확하지 않다. 100n + 10과 30n + 30의 비교

접근 방법

Tp(n) = c1n2 + c2n 이라고 가정 n이 충분히 클 경우, 임의의 c3에 대해 Tp(n) > c3n

정의: f(n) = O(g(n)) iff

∃(c and n0 > 0) such that f(n) ≤ cg(n) for all n, n ≥ n0.

Page 12: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 42)

근사 표현(1): f(n) = O(g(n))

Example 3n + 2 = Ο(n) as 3n + 2 ≤ 4n for all n ≥ 2 3n + 3 = Ο(n) as 3n + 3 ≤ 4n for all n ≥ 3 100n + 6 = Ο(n) as 100n + 6 ≤ 101n for all n ≥ 6 10n2 + 4n = Ο(n2) as 10n2 + 4n ≤ 11n2 for all n ≥ 5 6*2n + n2 = Ο(2n) as 6*2n + n2 ≤ 7*2n for all n ≥ 4 3n + 2 ≠ Ο(1) & 10n2 + 4n + 2 ≠ O(n)

f(n) = O(g(n))일 경우, g(n)은 f(n)의 upper bound

10n2 + 4n = Ο(n4) as 10n2 + 4n ≤ 10n4 for all n ≥ 2

Theorem: If f(n) = amnm + ... + a1n + a0, then f(n) = O(nm). Proof: ∑ ∑∑

= =

=

≥≤≤m

i

m

i

mmii

mim

ii nannanna i

0 001 allfor ,

Page 13: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 43)

근사 표현(2): f(n) = Ω(g(n))

정의: f(n) = Ω(g(n)) iff ∃(c and n0 > 0) such that f(n) ≥ cg(n) for all n, n ≥ n0. g(n)은 f(n)의 lower bound

Example

3n + 2 = Ω(n) as 3n + 2 ≥ 3n for all n ≥ 1 10n2 + 4n = Ω(n2) as 10n2 + 4n ≥ 10n2, ∀n ≥ 1 6*2n + n2 = Ω(2n) as 6*2n + n2 ≥ 6*2n, ∀n ≥ 1 3n + 2 = Ω(1), 10n2 + 4n = Ω(n), 6*2n + n2 = Ω(n2)

Theorem: If f(n) = amnm + ... + a1n + a0 and am > 0,

then f(n) = Ω(nm).

Page 14: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 44)

근사 표현(3): f(n) = Θ(g(n))

정의: f(n) = Θ(g(n)) iff ∃ (c1, c2, and n0 > 0) such that c1g(n) ≤ f(n) ≤ c2g(n)

for all n, n ≥ n0. g(n)은 f(n)의 lower bound이면서 upper bound임

Example

3n + 2 = Θ(n) as 3n + 2 ≥ 3n for all n ≥ 2 and 3n + 2 ≤ 4n for all n ≥ 2

10n2 + 4n + 2 = Θ(n2), 6*2n + n2 = Θ(2n) 3n + 2 ≠ Θ(1), 3n + 2 ≠ Θ(n2)

Theorem: If f(n) = amnm + ... + a1n + a0 and am > 0,

then f(n) = Θ(nm).

Page 15: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 45)

예제 프로그램들의 근사 표현

Tsum(n) = 2n + 3 = Θ(n) Trsum(n) = 2n + 2 = Θ(n) Tadd(row, col) = 2row * col + 2row + 1 = Θ (row * col)

Binary Search: Θ(log2 n) ← see Program 1.6

T(n) = T(n/2) + 1 T(1) = 1

Permutation: Θ(n*n!) ← see Program 1.8

Tperm(0, n) = (n + 1) * Tperm(1, n) Tperm(n, n) = n + 1

Magic Square (Figure 1.6 & Program 1.22)

Page 16: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 46)

예: Magic Square

Magic Square의 정의 n × n 행렬에 1부터 n2까지의 정수를 채우는데, 각 행과 열, 그리고 대각선의 합이 모두 동일.

n = 5인 magic square (합은 65)

15 8 1 24 17

23 5 7 14 16

4 6 13 20 22

3 21 19 12 10

11 18 25 2 9

Page 17: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 47)

Program 1.22: Magic Square (1)

#include <stdio.h> #define MAX_SIZE 15 // Square의 최대 크기 void main(void) // 순차적으로 magic square 작성 int square[MAX_SIZE][MAX_SIZE]; int i, j, row, column; // 배열의 첨자들 int size; // Square의 크기로 입력 받음. int count; // 1부터 size * size까지 증가 printf("Enter the size of the square: "); scanf("%d", &size); if (size < 1 || size > MAX_SIZE + 1) // 입력 오류 검사 printf("Error! Size is out of range\ n"); return;

Page 18: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 48)

Program 1.22: Magic Square (2)

if (!(size % 2)) // square의 크기는 홀수여야 함. print("Error! Size is even\ n"); return; for (i = 0; i < size; i++) // square의 모든 원소를 for (j = 0; j < size; j++) // 0으로 초기화 square[i][j] = 0; square[0][(size-1) / 2] = 1; // 첫 행의 중간부터 시작 i = 0; // i는 현재 행 번호 j = (size – 1) / 2; // j는 현재 열 번호 for (count = 2; count <= size * size; count++) row = (i–1 < 0) ? (size–1) : (i–1); // 위쪽 행 column = (j–1 < 0) ? (size–1) : (j–1); // 왼쪽 열 if (square[row][column] != 0) i = (++i) % size; // 못 갈 경우, 아래로

Page 19: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 49)

Program 1.22: Magic Square (3)

else // 갈 수 있을 경우, i와 j를 대각선 위로. i = row; j = column; square[i][j] = count; // 변경된 위치에 다음 수 추가 // 생성된 magic square를 출력 printf("Magic Square of size %d : \ n\ n", size); for (i = 0; i < size; i++) for (j = 0; j < size; j++) printf("%5d", square[i][j]); printf("\ n"); // 한 줄에 한 행씩 출력 printf("\ n\ n"); Time Complexity = Θ(size2)

Page 20: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 50)

5. 성능 측정(Performance Measurement)

알고리즘의 복잡성 함수를 그래프로 표시

Selection Sort의 실제 실행 시간을 측정한 후 그래프로 표시

Page 21: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 51)

0

10

20

30

40

50

60

0 2 4 6 8 10

대표적인 복잡성 함수의 그래프

f

logn

n

nlogn

n2 2n

n

Page 22: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 52)

Program 1.23: Selection sort의 시간 측정(1)

#include <stdio.h> #include <time.h> #define MAX_SIZE 1601 #define ITERATIONS 26 #define SWAP(x, y, t) ((t) = (x), (x) = (y), (y) = (t)) void main(void) // 다양한 배열 크기에 대해 // Selection sort의 실행 시간을 측정 int i, j, position; int list[MAX_SIZE]; int sizelist[] = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600; // 배열의 크기 clock_t start, stop; // 시작 시간과 종료 시간 double duration; // 경과 시간 = stop – start printf(" n time\ n");

Page 23: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 53)

Program 1.23: Selection sort의 시간 측정(2)

for (i = 0; i < ITERATIONS; i++) // 26개의 배열 크기 for (j = 0; j < sizelist[i]; j++) list[j] = sizelist[i] – j; // 역순으로 초기에 저장 start = clock(); // 시작 시간 측정 sort(list, sizelist[i]); // sort 함수 호출 stop = clock(); // 종료 시간 측정 // CLOCKS_PER_SEC = 초당 클럭의 수. Macro: 1000 duration = ((double) (stop – start)) / CLOCKS_PER_SEC; printf("%6d %.2f\ n", sizelist[i], duration);

Selection Sort의 시간 복잡성은?

Page 24: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

1장. 기본 개념 (Page 54)

Program 1.23의 실행 결과

Note: 요즘 컴퓨터로 실행할 경우…

n Time n Time

30 · · · 100 .00

.11

.22

.38

.60

.82

1.15

1.48

200

300

400

500

600

700

800

900

1000

1100

1200

1300

1400

1500

1600

1.86

2.31

2.80

3.35

3.90

4.54

5.22

5.93

Page 25: 4.2 시간 복잡성(Time Complexity) - KOCWcontents.kocw.net/KOCW/document/2015/yeungnam/... · 2016. 9. 9. · 4.2 시간 복잡성(Time Complexity) . T. p = 컴파일 시간 +

0

5

10

15

20

25

30

0 40000 80000 120000 160000

1장. 기본 개념 (Page 55)

실행 결과를 그래프로 그리면?

n

sec

Intel Core i7-4790 @ 3.60GHz, 8.00GB RAM