때로는 중간에 무언가가있는 이상한 Θ 기호가있는 Θ (n)이 표시되고 때로는 O (n) 만 표시됩니다. 아무도이 기호를 입력하는 방법을 모르기 때문에 타이핑의 게으름입니까? 아니면 다른 의미입니까?
때로는 중간에 무언가가있는 이상한 Θ 기호가있는 Θ (n)이 표시되고 때로는 O (n) 만 표시됩니다. 아무도이 기호를 입력하는 방법을 모르기 때문에 타이핑의 게으름입니까? 아니면 다른 의미입니까?
답변:
알고리즘이 Θ (g (n))이면, n (입력 크기)이 클수록 알고리즘의 실행 시간이 g (n)에 비례한다는 것을 의미합니다.
알고리즘은 O (g (N))의 경우,은 알고리즘의 실행 시간은 N이 큰 것을 의미한다 얻는다 많아야 비례에 g (n)으로하여 출력한다.
일반적으로 사람들이 O (g (n))에 대해 이야기하더라도 실제로는 Θ (g (n))을 의미하지만 기술적으로는 차이가 있습니다.
O (n)은 상한을 나타낸다. Θ (n)은 타이트 바운드를 의미합니다. Ω (n)은 하한을 나타냅니다.
f (x) = Θ (g (x)) iff f (x) = O (g (x)) 및 f (x) = Ω (g (x))
기본적으로 알고리즘이 O (n)이라고 말하면 O (n 2 ), O (n 1000000 ), O (2 n )이지만 ... Θ (n) 알고리즘은 Θ (n 2 ) 가 아닙니다 .
실제로, f (n) = Θ (g (n))은 n의 충분히 큰 값을 의미하므로 , c의 일부 값에 대해 f (n)은 c 1 g (n) 및 c 2 g (n) 내에 바인딩 될 수 있습니다. 1 및 C 2 , 즉, F의 성장 속도는 점근 동일 g : g는 하한 수 및 및은 상부 (F)의 결합. 이것은 f가 g의 하한과 상한이 될 수 있음을 직접적으로 암시합니다. 따라서,
f (x) = Θ (g (x)) iff g (x) = Θ (f (x))
유사하게, f (n) = Θ (g (n))을 나타 내기 위해, g는 f의 상한 (즉, f (n) = O (g (n)))이고 f는 g (즉, f (n) = Ω (g (n)), 이것은 g (n) = O (f (n))과 정확히 같은 것입니다). 간결하게
f (x) = Θ (g (x)) iff f (x) = O (g (x)) 및 g (x) = O (f (x))
ω
함수의 느슨한 상한 및 하한을 나타내는 적은 오메가와 작은 오메가 ( ) 표기법도 있습니다.
요약:
f(x) = O(g(x))
(큰 OH)의 성장 속도가 수단f(x)
점근 적이며 이하 동일 의 성장률g(x)
.
f(x) = Ω(g(x))
(큰 오메가)의 성장 속도가 수단f(x)
점근이다 이상인 증가율g(x)
f(x) = o(g(x))
(little-oh)는의 성장률 이 의 성장률 보다f(x)
무증상 임을 의미합니다 .g(x)
f(x) = ω(g(x))
(리틀 오메가)의 성장 속도가 수단f(x)
점근 적이며 보다 증가율g(x)
f(x) = Θ(g(x))
(세타)의 성장 속도가 수단f(x)
점근이다 동등 의 증가율g(x)
보다 자세한 논의 는 Wikipedia에 대한 정의를 읽 거나 Cormen et al.의 Introduction to Algorithms와 같은 고전적인 교과서를 참조하십시오.
>= \Omega(...)
뜻입니까? 우리가 회원이라고 말하지만 \Omega(...)
그보다 크다면 이해합니까? 어떤 의미가 있습니까?
어떤 표기법이 무엇을 의미하는지 기억하는 간단한 방법 (트릭, 추측)이 있습니다.
모든 Big-O 표기법은 막대가있는 것으로 간주 될 수 있습니다.
Ω을 볼 때 막대는 맨 아래에 있으므로 (점근) 하한입니다.
Θ를 볼 때 막대는 분명히 중간에 있습니다. 따라서 (점근선) 단단한 경계입니다.
필기 O를 할 때 일반적으로 상단에서 마무리하고 구불 구불 한 그림을 그립니다. 따라서 O (n)은 함수의 상한입니다. 공평하게 말하면, 이것은 대부분의 글꼴에서 작동하지 않지만 이름의 원래 정당화입니다.
하나는 큰 "O"입니다
하나는 빅 세타입니다
http://en.wikipedia.org/wiki/Big_O_notation
Big O는 알고리즘이 주어진 표현보다 더 많은 단계에서 실행되지 않음을 의미합니다 (n ^ 2)
Big Omega는 알고리즘이 주어진 식보다 적은 단계로 실행됨을 의미합니다 (n ^ 2)
동일한 식에 대해 두 조건이 모두 참이면 큰 세타 표기법을 사용할 수 있습니다.
여기에 이미 아름답게 요약 된 이론적 정의를 제공하는 대신 간단한 예를 들겠습니다.
의 런타임 가정 f(i)
IS를 O(1)
. 다음은 점근 적 런타임이 코드 조각입니다 Θ(n)
. 그것은 항상 함수 호출 f(...)
n
시간을. 하한과 상한은 모두 n입니다.
for(int i=0; i<n; i++){
f(i);
}
아래 두 번째 코드 조각은 점근 적 런타임이입니다 O(n)
. f(...)
대부분의 경우 함수 를 호출합니다 n
. 상한은 n이지만 하한은 내부에서 발생하는 상황에 따라 Ω(1)
또는 Ω(log(n))
일 수 있습니다 f2(i)
.
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}
Θ(n)
n이 증가함에 따라 선형으로 증가 하는 코드 단편의 런타임 , 예를 들어 런타임 T는 T (n) = a * n + b로 표현 될 수 있습니다. 작은 n 값 (예 : n = 1 또는 2)의 경우 동작을 설명하는 가장 좋은 방법이 아닐 수 있습니다. 아마도 f (i)보다 훨씬 오래 걸리는 초기화 코드가있을 수 있습니다.
Theta는 큰 O와 Omega가 같은 특별한 상황을 언급하는 짧은 방법입니다.
따라서, 하나가 주장한다면 The Theta is expression q
, 그들은 또한 그것을 주장 Big O is expression q
하고있다 Omega is expression q
.
대략적인 비유 :
만약 : 세타는 "그 동물은 5 개의 다리를 가지고있다"고 주장한다. 그 다음은 다음과 같습니다. 큰 O는 참이고 ( "그 동물의 다리는 5 개 이하입니다.") Omega는 참입니다 ( "그 동물의 다리는 5 개 이상입니다.").
표현식이 반드시 특정 숫자 일 필요는 없지만 log (n), n, n ^ 2 등과 같은 다양한 크기의 함수이기 때문에 대충 유사합니다.
차트는 이전 응답 이해하기 쉽게 만들 수 :
영어로,
왼쪽에는 동일한 크기 차수 (즉, g (n) ) 인 상한과 하한이 있습니다 . 상수를 무시하고 상한과 하한의 크기가 같은 경우 유효하게 f (n) = Θ (g (n)) 라고 말할 수 있습니다. 또는 f (n)이 g (n)의 큰 세타에 .
더 간단한 예인 오른쪽부터 시작하여 상한 g (n) 은 단순히 크기 차이며 상수 c를 무시합니다 (모든 큰 O 표기법과 동일).
의 고려하자 f(n) > 0
및 g(n) > 0
모든 n
. 가장 빠른 실제 알고리즘에는 하나 이상의 작업이 있으며 시작 후에 실행이 완료되므로이를 고려해도됩니다. 이것은 f(n)
절대 값 ( |f(n)|
) 대신 값 ( )을 사용할 수 있기 때문에 미적분을 단순화합니다 .
f(n) = O(g(n))
일반:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ g(n)
의 경우 g(n) = n
:
f(n)
0 ≤ lim ──────── < ∞
n➜∞ n
예 :
Expression Value of the limit
------------------------------------------------
n = O(n) 1
1/2*n = O(n) 1/2
2*n = O(n) 2
n+log(n) = O(n) 1
n = O(n*log(n)) 0
n = O(n²) 0
n = O(nⁿ) 0
반례 :
Expression Value of the limit
-------------------------------------------------
n ≠ O(log(n)) ∞
1/2*n ≠ O(sqrt(n)) ∞
2*n ≠ O(1) ∞
n+log(n) ≠ O(log(n)) ∞
f(n) = Θ(g(n))
일반:
f(n)
0 < lim ──────── < ∞
n➜∞ g(n)
의 경우 g(n) = n
:
f(n)
0 < lim ──────── < ∞
n➜∞ n
예 :
Expression Value of the limit
------------------------------------------------
n = Θ(n) 1
1/2*n = Θ(n) 1/2
2*n = Θ(n) 2
n+log(n) = Θ(n) 1
반례 :
Expression Value of the limit
-------------------------------------------------
n ≠ Θ(log(n)) ∞
1/2*n ≠ Θ(sqrt(n)) ∞
2*n ≠ Θ(1) ∞
n+log(n) ≠ Θ(log(n)) ∞
n ≠ Θ(n*log(n)) 0
n ≠ Θ(n²) 0
n ≠ Θ(nⁿ) 0
결론 : 우리는 big O, big θ 및 big Ω을 동일한 것으로 간주합니다.
왜? 아래 이유를 말씀 드리겠습니다.
첫째로, 나는 하나의 잘못된 진술을 분명히 할 것입니다. 어떤 사람들은 우리가 최악의 시간 복잡성을 걱정한다고 생각하므로 항상 큰 θ 대신 큰 O를 사용합니다. 나는이 남자가 헛소리하고 있다고 말할 것이다. 상한과 하한은 시간 복잡성을 설명하는 데 사용되지 않고 하나의 함수를 설명하는 데 사용됩니다. 최악의 시간 함수에는 상한과 하한이 있습니다. 최고의 시간 함수에는 상한과 하한도 있습니다.
big O와 big θ의 관계를 명확하게 설명하기 위해 big o와 small o의 관계를 먼저 설명하겠습니다. 정의에서 우리는 작은 o가 큰 O의 부분 집합임을 쉽게 알 수 있습니다.
T (n) = n ^ 2 + n, 우리는 T (n) = O (n ^ 2), T (n) = O (n ^ 3), T (n) = O (n ^ 4)라고 말할 수 있습니다. 그러나 작은 o의 경우 T (n) = o (n ^ 2)는 작은 o의 정의를 충족하지 않습니다. 따라서 작은 o에 대해서는 T (n) = o (n ^ 3), T (n) = o (n ^ 4) 만 정확합니다. 중복 T (n) = O (n ^ 2)는 무엇입니까? 큰 θ입니다!
일반적으로, 우리는 큰 O가 O (n ^ 2)라고 말하지 않으며, T (n) = O (n ^ 3), T (n) = O (n ^ 4)라고 말하기는 어렵습니다. 왜? 우리는 큰 O를 무의식적으로 큰 θ로 간주하기 때문입니다.
마찬가지로, 우리는 또한 큰 Ω을 무의식적으로 큰 θ로 간주합니다.
한마디로, big O, big θ 및 big Ω은 정의와 같은 것이 아니지만 우리의 입과 뇌에서 같은 것입니다.