점근 기능은 무엇입니까? 어쨌든 점근선이란 무엇입니까?
크기 n 의 입력에 적용될 때 알고리즘에 의해 소비되는 자원의 양 (CPU 시간, RAM, 디스크 공간 등 ) 을 설명 하는 함수 f (n) 이 주어지면 성능을 설명 하기 위해 최대 3 개의 점근 표기법을 정의합니다. 큰 n .
점근선 (또는 점근 기능) 단순히 다른 기능 (또는 관계) g (n)이 있음을 F (n은) 로 가까이 갈수록 도착 n은 더 크고 더 큰 성장, 그러나 결코 확실히 도달. 점근 함수에 관해 이야기하는 것의 장점은 f (n)에 대한 표현 이 매우 복잡 하더라도 일반적으로 얘기하기가 훨씬 간단하다는 것 입니다. 점근 함수는 f (n)를 위 또는 아래로 제한 하는 경계 표기법의 일부로 사용됩니다 .
(참고 : 여기에 채택 된 의미에서, 점근 함수는 세 개의 큰 O / Θ / Ω 표기법 모두가이 상수를 고려하지 않기 때문에 0이 아닌 상수를 수정 한 후에 원래의 함수에만 가깝습니다.)
세 가지 점근 적 경계 표기법은 무엇이며 어떻게 다른가요?
세 가지 표기법이 모두 다음과 같이 사용됩니다.
f (n) = O (g (n))
여기서 f (n) 은 관심있는 함수이고 g (n) 은 f (n) 을 근사하려는 다른 점근 함수입니다 . 이것은 엄격한 의미에서 평등으로 간주하지만,하지 말아야 빠른 방법 사이의 공식적인 성명 f는 (N) 에 대한 성장 N 에 비해 g (N) 으로, n은 커지게된다. 순수 주의자들은 종종 대체 표기법 f (n) ∈ O (g (n)) 을 사용하여 기호 O (g (n)) 이 실제로 공통 성장률을 공유하는 전체 기능 군 임을 강조합니다 .
Θ가 큰 (세타) 표기는 상태 평등 의 성장에 대한 F (n)은 (이에 대한 자세한 이상) 상수 인자까지한다. =
성장률 에 대한 연산자 와 유사하게 작동 합니다.
Big-O 표기법 은 f (n) 의 성장에 대한 상한을 나타냅니다 . 성장률 에 대한 연산자 와 유사하게 작동 합니다.≤
Big-Ω (Omega) 표기법 은 f (n) 의 증가에 대한 하한을 나타냅니다 . 성장률 에 대한 연산자 와 유사하게 작동 합니다.≥
있습니다 많은 다른 점근 표기법 ,하지만 그들은 컴퓨터 과학 문헌에 거의 자주 발생하지 않습니다.
Big-O 표기법과 그 의미는 종종 시간 복잡성 을 비교하는 방법 입니다.
시간 복잡성은 무엇입니까?
시간 복잡도는 알고리즘이 입력 크기 n 의 함수로 실행하는 데 걸리는 시간 T (n)의 총칭 입니다. 이는 실시간 (예 : 초), CPU 명령 수 등으로 측정 할 수 있습니다. 일반적으로 알고리즘은 일상적인 폰 노이만 아키텍처 컴퓨터 에서 실행되는 것으로 가정 합니다. 물론 시간 복잡성을 사용하여 상황이 다를 수있는 더 이국적인 컴퓨팅 시스템에 대해 이야기 할 수 있습니다!
Big-O 표기법을 사용하여 공간 복잡성 에 대해 이야기하는 것도 일반적 입니다. 공간 복잡성은 알고리즘을 완료하는 데 필요한 메모리 (스토리지)의 양으로 RAM, 디스크 등이 될 수 있습니다.
하나의 알고리즘은 느리지 만 메모리를 적게 사용하는 반면 다른 알고리즘은 빠르지 만 더 많은 메모리를 사용하는 경우가 있습니다. 자원이 다르게 제한되는 경우 각기 다른 상황에서 더 적합 할 수 있습니다. 예를 들어, 내장 프로세서는 메모리가 제한적이며 느린 알고리즘을 선호하는 반면, 데이터 센터의 서버는 많은 양의 메모리를 갖고 빠른 알고리즘을 선호 할 수 있습니다.
빅 ϴ 계산
알고리즘의 Big-ϴ 계산은 작은 교과서 나 학기 반 학기의 절반 정도를 채울 수있는 주제입니다.이 섹션에서는 기본 사항을 다룹니다.
의사 코드에서 함수 f (n)이 주어진 경우 :
int f(n) {
int x = 0;
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
return x;
}
시간 복잡성은 무엇입니까?
외부 루프는 n 번 실행됩니다 . 외부 루프가 실행될 때마다 내부 루프가 n 번 실행됩니다 . 이것은 실행 시간을 T (n) = n 2에 둡니다 .
두 번째 기능을 고려하십시오.
int g(n) {
int x = 0;
for (int k = 1 to 2) {
for (int i = 1 to n) {
for (int j = 1 to n) {
++x;
}
}
}
return x;
}
외부 루프는 두 번 실행됩니다. 가운데 루프는 n 번 실행됩니다 . 중간 루프가 실행될 때마다 내부 루프가 n 번 실행됩니다 . 이것은 실행 시간을 T (n) = 2n 2에 둡니다 .
이제 문제는 두 기능 의 점근 적 실행 시간은 얼마입니까?
이를 계산하기 위해 다음 두 단계를 수행합니다.
- 상수를 제거하십시오. 입력으로 인해 알고리즘 시간이 증가함에 따라 다른 용어가 실행 시간을 지배하므로 중요하지 않습니다.
- 가장 큰 항을 제외하고 모두 제거하십시오. 마찬가지로 N이 무한대, N 2는 빠르게 앞지르 N .
여기에서 핵심 은 지배적 인 용어에 초점을 맞추고 해당 용어로 단순화합니다 .
T (n) = n 2 ∈ ϴ (n 2 )
T (n) = 2n 2 ∈ ϴ (n 2 )
용어가 여러 개인 다른 알고리즘이있는 경우 동일한 규칙을 사용하여 단순화합니다.
T (n) = 2n 2 + 4n + 7 ∈ ϴ (n 2 )
이 모든 알고리즘의 핵심 은 가장 큰 항에 집중하고 상수를 제거하는 것 입니다. 우리는 실제 실행 시간이 아니라 상대적 복잡성을보고 있습니다.
Big-Ω 및 Big-O 계산
첫째, 비공식 문헌 에서“Big-O”는 종종 그리스 문자가 타이핑하기 까다롭기 때문에 Big-Θ와 동의어 로 취급 된다는 점에주의하십시오. 따라서 파란색에서 누군가가 알고리즘의 Big-O를 요구하면 아마도 Big-Θ를 원할 것입니다 .
앞에서 정의한 공식적인 의미 에서 Big-Ω 및 Big-O를 실제로 계산 하려면 중요한 문제가 있습니다. 주어진 함수에 대해 무한히 많은 Big-Ω 및 Big-O 설명이 있습니다! 42 이하의 숫자가 무엇인지 묻는 것과 같습니다. 있습니다 많은 가능성.
T (n) ∈ ϴ (n 2 )가 있는 알고리즘 의 경우 다음 중 공식적으로 유효한 명령문입니다.
- T (n) ∈ O (n 2 )
- T (n) ∈ O (n 3 )
- T (n) ∈ O (n 5 )
- T (n) ∈ O (n 12345 × e n )
- T (n) ∈ Ω (n 2 )
- T (n) ∈ Ω (n)
- T (n) ∈ Ω (로그 (n))
- T (n) ∈ Ω (로그 (log (n)))
- T (n) ∈ Ω (1)
그러나 T (n) ∈ O (n) 또는 T (n) ∈ Ω (n 3 ) 상태는 올바르지 않습니다 .
상대적 복잡성은 무엇입니까? 어떤 클래스의 알고리즘이 있습니까?
두 개의 다른 알고리즘을 비교하면 입력이 무한대로 갈수록 복잡성이 증가합니다. 우리가 다른 유형의 알고리즘을 보면, 그것들은 상대적으로 동일하게 유지되거나 (예를 들어, 일정한 요소에 의해 다른) 크게 확산 될 수 있습니다. 이것이 Big-O 분석을 수행하는 이유입니다. 큰 입력에서 알고리즘이 합리적으로 수행되는지 확인합니다.
알고리즘 클래스는 다음과 같이 분류됩니다.
Θ (1)-상수. 예를 들어, 목록에서 첫 번째 숫자를 선택하면 항상 같은 시간이 걸립니다.
Θ (n)-선형. 예를 들어, 목록을 반복하면 항상 목록 크기 n에 비례하여 시간이 걸립니다 .
Θ (log (n))-대수 (기본적으로 염기는 중요하지 않습니다). 이진 검색과 같이 각 단계에서 입력 공간을 나누는 알고리즘이 예입니다.
Θ (n × log (n))-선형 시간 대수 ( "선형"). 이러한 알고리즘은 일반적으로 모든 입력을 반복하고 ( n ) 반복 하고 정복합니다 ( log (n) ) . 많은 인기있는 정렬 알고리즘 (병합 정렬, Timsort)이이 범주에 속합니다.
Θ (n m )-다항식 ( n 은 임의의 상수 m으로 올림 ). 이것은 매우 일반적인 복잡성 클래스이며 종종 중첩 루프에서 발견됩니다.
Θ (m n )-지수 (임의 m 은 n으로 올림 ). 많은 재귀 및 그래프 알고리즘이이 범주에 속합니다.
Θ (n!)-계승. 특정 그래프 및 조합 알고리즘은 요인 복잡성입니다.
최선 / 평균 / 최악의 사례와 관련이 있습니까?
아니요. Big-O 및 해당 표기법은 특정 수학 함수에 대해 설명 합니다 . 그것들은 알고리즘의 효율을 특징 짓는 데 도움이되는 수학적 도구이지만, 최고의 / 평균 / 최악의 경우의 개념은 여기에 설명 된 성장률 이론과 관련이 없습니다.
알고리즘의 Big-O에 대해 이야기하려면 정확히 하나의 매개 변수를 사용하여 알고리즘 의 특정 수학적 모델을 커밋해야합니다 n
. 이는 어떤 의미에서든 입력의 "크기"를 설명해야합니다. 그러나 실제 세계에서 입력은 길이보다 훨씬 더 많은 구조를 가지고 있습니다. 이것은 정렬 알고리즘이라면, 나는 문자열에 공급 수 "abcdef"
, "fedcba"
또는 "dbafce"
. 그들 모두는 길이가 6이지만, 그중 하나는 이미 정렬되어 있고, 하나는 반대로되어 있으며, 마지막은 임의의 혼란입니다. 입력이 이미 정렬 된 경우 Timsort와 같은 일부 정렬 알고리즘이 더 잘 작동합니다. 그러나이 비균질성을 어떻게 수학적 모델에 통합 시키는가?
일반적인 접근 방식은 입력이 임의의 확률 론적 분포에서 나온 것으로 가정하는 것입니다. 그런 다음 length가있는 모든 입력에 대한 알고리즘의 복잡성을 평균합니다 n
. 이것은 알고리즘 의 평균 사례 복잡성 모델을 제공합니다. 여기에서 평소와 같이 Big-O / Θ / Ω 표기법을 사용하여 평균 사례 동작을 설명 할 수 있습니다.
그러나 서비스 거부 공격이 우려되는 경우보다 비관적 일 수 있습니다. 이 경우 유일한 입력은 알고리즘에 가장 많은 슬픔을 유발하는 입력 이라고 가정하는 것이 더 안전 합니다. 이것은 최악의 복잡한 알고리즘 모델을 제공합니다. 나중에 최악의 모델의 Big-O / Θ / Ω 등에 대해 이야기 할 수 있습니다 .
마찬가지로, 알고리즘이 최상의 모델 에 도달하는 데 가장 적은 문제가 있다는 입력에만 관심을 집중 한 다음 Big-O / Θ / Ω 등을 볼 수 있습니다.