ㅈㅎㅅ
: 입력에 대한 올바른 해ㅅㅎㅅ
: 각 단계 수행 가능ㅇㅎㅅ
: 일정 시간 내 종료ㅎㅇㅅ
: 효율적일수록 가치 상승최초의 알고리즘
최대공약수
알고리즘
최대공약수: 두 정수 x, y의 약수 중 가장 큰 수
gcd(x, y)
원리
자연수 x, y(x > y)일 때,
gcd(x, y) == gcd(y, x - y)
C
#include <stdio.h>
#define SWAP(a, b){int t; t = a; a = b; b = t;}
int gcd(int x, int y){
if (x < y) SWAP(x, y);
if(y==0) return x;
return gcd(y, x % y);
}
Python
def gcd_recur(x, y):
if x < y:
temp = x
x = y
y = temp
if y == 0: return x
return gcd(y, x % y)
def gcd_iter(x, y):
while y:
if x < y:
temp = x
x = y
y = temp
temp = x % y
x = y
y = temp
return x
Pseudo code
//배열 A에 10개 숫자 있을 때(A[10])
max = A[0]
for i = 1 to 9
if (A[i] > max) max = A[i]
return max
C
#include<stdio.h>
int find_max(int A[], int n){
int i, max = A[0];
for(i = 0; i < n; i++)
if(A[i] > max)
max = A[i];
return max;
}
연산 횟수를 입력 크기 함수
로 나타냄점근적
표기(O, Θ, Ω)상한
e.g. f(n) = 2n^2 - 8n + 3
- 두 그래프의 교차점 이후 f(n)은 cn^2보다 절대로 커질 수 없다.
- n 증가함에 따라 cn^2은 f(n)의
상한
이 된다.- 따라서
O(n^2)
은 f(n)의 점근적 상한
- 표기 예
- n>=2, 3n + 2 <=
4n
→O(n)
- n>=2, 3n + 3 <=
3n^2
→O(n^2)
동일한 증가율(상한과 하한 사이)
- n0 이후 모든 n에 대해 c1g(n), c2g(n) 모두 상한, 하한을 동시에 만족한다.
- 따라서
Θ(g(n))
- 표기 예
- n >=2,
3n <= 3n + 2 <= 4n →Θ(n)
하한
- 교차점 이후 cg(n)은 f(n)에 대해 항상 작다.
따라서 n 증가함에 따라 cg(n)은 f(n)의하한
이 된다.
따라서Ω(g(n))
은 f(n)의 점근적 하한
- 표기 예
- n>=2, 3n + 2 >= 4n →
Ω(n)
O(1)
– 상수 시간 : 한 단계만 처리O(log n)
– 로그 시간 : 단계들이 연산마다 특정 요인에 의해 줄어듦O(n)
– 선형 시간 : 단계의 수와 입력값 n이 1:1 선형 관계O(n log n)
- 로그 선형 시간O(n^2)
– 제곱 시간 : 단계의 수 = 입력값 n의 제곱O(n^3)
– 세제곱 시간O(C^2)
- 지수 시간: 상수 C의 n제곱O(n!)
- 팩토리얼 시간성능(오른쪽으로 갈수록 시간 오래 걸림 = 성능 저하)
1 < 2 < 3 < 4 < 5 < 6 < 7 < 8
- 스터디 추가자료