알고리즘의 효율성 분석elearning.kocw.net/KOCW/document/2015/myongji/leechungki/... ·...

Post on 09-Mar-2020

0 views 0 download

Transcript of 알고리즘의 효율성 분석elearning.kocw.net/KOCW/document/2015/myongji/leechungki/... ·...

알고리즘의 효율성 분석

명지대학교

컴퓨터공학과

이 충기 교수

주: 본 강의자료는 ‘알기 쉬운 알고리즘(양성봉 저)’ 교재에서 제공한 것을 수정한 것임.

지난 주 강의 내용

•수학적 귀납법

•기본 공식 증명

•수열과 점화식

•선형 점화식 해 구하기

이번 주 강의 내용

•알고리즘의 효율성

•시간 복잡도

•알고리즘 복잡도 분석 방법

•복잡도의 점근적 표기

• O(Big-Oh) 표기

• Ω(Big-Omega)-표기

• Θ(Theta)-표기

알고리즘의 세 가지 요소

•효율적 알고리즘이 되기 위한 세 가지 요소

• ____의 효율성

• ____의 효율성

• ____의 효율성

•프로그래머들이 프로그램을 개발할 때 항상

고민하는 내용

시간의 효율성

•모든 알고리즘에서 가장 중요하게 생각하는 요소

•주어진 조건에서 문제를 해결하기 위해

가능한 한 빠른 시간 안에 가장 효율적으로 해결책을 찾는 것이 진정한 알고리즘

•예: 게임 소프트웨어

•알고리즘에 따라 작성된 프로그램이 컴퓨터 메모리를 얼마나 사용하느냐?

•대부분의 운영체제(OS)는 하나의 메모리를 여러 개의 프로그램이 공유해서

사용

•메모리를 효율적으로 관리하고 사용하는

것이 더욱 중요

공간의 효율성

코드의 효율성

• 개발자 입장과 컴퓨터 입장에서 보는 관점이 다름

• (개발자 입장) ____________ 코드가 좋은 코드

• 개발자가 시간이 지나서 다시 코드를 수정해야 하는 경우 쉽게 수정할 수 있어야 한다.

• 다른 개발자가 코드를 볼 때에도 쉽게 이해할 수 있어야 한다.

• 프로그램의 소스 코드

• 다른 사람이 보고 이해하기 쉽도록 작성

• 이해하기가 쉽지 않은 코드는 주석(comment)을 이용하여 작성

• 변수나 함수를 작성할 때, 의미가 모호한 이름을 사용하지 말고 다른 사람이 볼 때 쉽게 이해할 수 있는 이름으로 작성

• (컴퓨터 입장) 컴파일러와 하드웨어에 좀 더 최적화된 코드

알고리즘의 효율성 표현

•알고리즘의 효율성은 알고리즘의 _______

또는 알고리즘이 수행하는 동안 사용되는

__________의 크기로 나타낼 수 있다.

•이들을 각각 시간복잡도(time complexity),

공간복잡도(space complexity)라고 한다.

•일반적으로 알고리즘들을 비교할 때에는 시간복잡도가 주로 사용된다.

시간복잡도

•시간복잡도는 알고리즘이 수행하는 _______

에 따라서 _______이 몇 번 수행되는 지를 함수로 표현

•표현 척도

• 단위 연산(basic operation)

• 비교(comparison), 배정(assignment)

• 입력 크기(input size)

• 배열의 크기, 리스트(list)의 길이, 행렬에서 행과 열의 크기, 트리(tree)에서 정점(node)와 연결선(edge)의 수

예: 시간복잡도 분석

•10장의 숫자 카드들 중에서 최대

숫자 찾는 문제를 순차탐색으로 찾는 경우에 숫자 비교가 단위 연산이고, 총 비교 횟수는 __이다.

•n장의 카드가 있다면, ____번의 비교 수행: 시간복잡도 = n-1

알고리즘 복잡도 분석 방법 (1)

• _____ 경우 분석(Every-case analysis)

• 입력크기에만 종속

• 입력 값과는 무관하게 결과 값은 항상 일정

• _____ 경우 분석(Worst-case analysis)

• 입력크기와 입력 값 모두에 종속

• 단위연산이 수행되는 횟수가 최대인 경우 선택

• _____ 경우 분석(Best-case analysis)

• 입력크기와 입력 값 모두에 종속

• 단위연산이 수행되는 횟수가 최소인 경우 선택

알고리즘 복잡도 분석 방법 (2)

•____ 경우 분석(Average-case analysis)

•입력크기와 입력 값 모두에 종속

•모든 입력에 대해서 단위연산이 수행되는

기대치(평균)

•각 입력에 대해서 확률 할당 가능

•일반적으로 최악의 경우보다 계산이 복잡

최선 경우: 지하철역 도착 후 바로 승차

학교 통학 시간

소요 시간 = _____________________

최악 경우: 지하철 도착 후 놓치다

학교 통학 시간

소요 시간 = ______________________

평균 경우: 최악과 최선의 중간

학교 통학 시간

소요 시간 = ______________________

복잡도의 점근적 표기 •

복잡도의 점근적 표기

• 복잡도를 단순한 함수로 표현하기 위해 점근적 표기 (Asymptotic Notation)를 사용한다.

• 입력 크기 n이 _____________복잡도를 간단히

표현하기 위해 사용하는 표기법은 다음과 같다:

• O(Big-Oh) -표기

• Ω(Big-Omega) -표기

• Θ(Theta) -표기

O(Big-Oh)-표기

• O-표기는 복잡도의 ________

을 나타낸다.

• 복잡도가 f(n) = 2n2 - 8n + 3 이라면, f(n)의 O-표기는 O(n2)이다. 먼저 f(n)의 단순화된 표현은 n2이다.

• 단순화된 함수 n2에 임의의 상수 c를 곱한 cn2이 n이 증가함에 따라 f(n)의 상한이 된다. 단,

c>0.

• 복잡도 f(n) = O(g(n))을 그래프로 나타내면 아래와 같다.

• n이 증가함에 따라 O(g(n))이 점근적 상한이라는 것 (즉, cg(n)이 n0보다 큰 모든 정수 n에 대해서 항상 f(n)보다 크거나 같다는 것)을 보여 준다. 단, c는 0보다 큰 상수이다.

O(Big-Oh)-표기

Ω(Big-Omega)-표기

•복잡도의 ___________을 의미한다.

• f(n) = 2n2 - 8n + 3의 Ω-표기는 Ω(n2)이다.

• f(n) = Ω(n2)은 “n이 증가함에 따라 2n2 - 8n

+ 3이 cn2보다 작을 수 없다”라는 의미이다.

이때 상수 c = 1로 놓으면 된다.

• O-표기 때와 마찬가지로, Ω-표기도 복잡도

다항식의 최고차항만 계수 없이 취하면 된다.

• 복잡도 f(n) = Ω(g(n))을 그래프로 나타내면 아래와 같다.

• 즉, n이 증가함에 따라 Ω(g(n))이 점근적 하한이라는 것 (즉, cg(n)이 n0보다 큰 모든 정수 n에 대해서 항상 f(n)보다 작거나 같다는 것)을 보여준다. 단, c는 0보다 큰 상수이다.

Ω(Big-Omega)-표기

Θ(Theta)-표기

• O-표기와 Ω-표기가 같은 경우에 사용한다.

• f(n) = 2n2 + 10n + 3 = O(n2) = Ω(n2)이므로,

f(n) = Θ(n2)이다.

• “f(n)은 n이 증가함에 따라 n2과 동일한 증가율을 가진다”라는 의미이다.

• f(n) ≠ Θ(n), f(n) ≠ Θ(nlogn), f(n) ≠ Θ(n3),

f(n) ≠ Θ(2n)이다.

• 복잡도 f(n) = Θ(g(n))을 그래프로 나타내면 아래와 같다.

• 즉, n0보다 큰 모든 정수 n에 대해서 f(n)은 c1 g(n) 보다 크거나 같고 c2 g(n) 보다 작거나 같다는 것을 보여준다. 단, c1 와 c2 는 0보다 큰 상수이다.

Θ(Theta)-표기

자주 사용하는 O-표기

• O(1) 상수 시간 (Constant time)

• O(logn) 로그(대수) 시간 (Logarithmic time)

• O(n) 선형 시간 (Linear time)

• O(n logn) 로그 선형 시간 (Log-linear time)

• O(n2) 제곱 시간 (Quadratic time)

• O(n3) 세제곱 시간 (Cubic time)

• O(2n) 지수 시간 (Exponential time)

O-표기의 포함 관계

2n2+10n+3

n3+n2-10n+3

2n

5n+4

14, 1000

3logn+6

O(2n)

O(n3),

O(n2)

O(logn)

O(1)

O(n)

O(nk)

복잡도 함수의 증가율

왜 효율적인 알고리즘이 필요한가? • 10억 개의 숫자를 정렬하는데 PC에서 O(n2) 알고리즘은

300여년이 걸리는 반면에 O(n logn) 알고리즘은 5분 만에

정렬한다.

O(n2) 1,000 1백만 10억

PC < 1초 2시간 300년

슈퍼컴 < 1초 1초 1주일

O(nlogn) 1,000 1백만 10억

PC < 1초 <1초 5분

슈퍼컴 < 1초 <1초 <1초

바보 같은 예

좋은 예

알고리즘

빠른 알고리즘

• 효율적인 알고리즘은 슈퍼컴퓨터보다 더 큰 가치가 있다.

• 값 비싼 하드웨어의 기술 개발보다 효율적인 알고리즘 개발이 훨씬 더 경제적이다.

결론

요약 • 알고리즘의 효율성은 주로 시간복잡도 (Time Complexity)

로 나타낼 수 있다.

• 시간복잡도는 알고리즘이 수행하는 기본적인 연산 횟수를

입력 크기에 대한 함수로 표현한다.

• 알고리즘의 복잡도 표현 방법:

• 최악 경우 분석 (worst case analysis)

• 평균 경우 분석 (average case analysis)

• 최선 경우 분석 (best case analysis)

• 점근적 표기 (Asymptotic Notation): 입력 크기 n이 무한대로 커질 때의 복잡도를 간단히 표현하기 위해 사용하는 표기법