Θ (n)과 O (n)의 차이점은 무엇입니까?


427

때로는 중간에 무언가가있는 이상한 Θ 기호가있는 Θ (n)이 표시되고 때로는 O (n) 만 표시됩니다. 아무도이 기호를 입력하는 방법을 모르기 때문에 타이핑의 게으름입니까? 아니면 다른 의미입니까?


8
분명하지는 않지만이 질문은 어제이 stackoverflow.com/questions/464078/… 과 중복 됩니다.
Bill the Lizard

답변:


600

간단한 설명 :

알고리즘이 Θ (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와 같은 고전적인 교과서를 참조하십시오.


1
"알고리즘이 O (g (n))이면, n이 커질수록 알고리즘의 실행 시간이 최대 g (n)에 비례한다는 것을 의미합니다." "알고리즘이 O (n)이라고 말하면 기본적으로 O (n2), O (n1000000), O (2n)도됩니다"라고 어떻게 말합니까?
Andy897

@ Andy897 "비례"의 정의에 따른다. Wikipedia에서 : "수학에서 하나의 변화가 항상 다른 변화를 동반하고 변화가 항상 상수 승수를 사용하여 관련되는 경우 두 변수는 비례합니다. 상수는 비례 계수 또는 비례 계수라고합니다 일정한."
Mehrdad Afshari

무슨 >= \Omega(...)뜻입니까? 우리가 회원이라고 말하지만 \Omega(...)그보다 크다면 이해합니까? 어떤 의미가 있습니까?
Johannes Schaub-litb

328

어떤 표기법이 무엇을 의미하는지 기억하는 간단한 방법 (트릭, 추측)이 있습니다.

모든 Big-O 표기법은 막대가있는 것으로 간주 될 수 있습니다.

Ω을 볼 때 막대는 맨 아래에 있으므로 (점근) 하한입니다.

Θ를 볼 때 막대는 분명히 중간에 있습니다. 따라서 (점근선) 단단한 경계입니다.

필기 O를 할 때 일반적으로 상단에서 마무리하고 구불 구불 한 그림을 그립니다. 따라서 O (n)은 함수의 상한입니다. 공평하게 말하면, 이것은 대부분의 글꼴에서 작동하지 않지만 이름의 원래 정당화입니다.


5
나는 보통 어떤 질문에 대해서도 3-4 답변 아래로 가지 않습니다. 이것은 가치가 있었다. 트릭을 공유해 주셔서 감사합니다. : D
불가능

56

하나는 큰 "O"입니다

하나는 빅 세타입니다

http://en.wikipedia.org/wiki/Big_O_notation

Big O는 알고리즘이 주어진 표현보다 더 많은 단계에서 실행되지 않음을 의미합니다 (n ^ 2)

Big Omega는 알고리즘이 주어진 식보다 적은 단계로 실행됨을 의미합니다 (n ^ 2)

동일한 식에 대해 두 조건이 모두 참이면 큰 세타 표기법을 사용할 수 있습니다.


20
그러나 잘못되었습니다! n이 매우 커짐에 따라 단계 수는 n ^ 2로 제한됩니다. 그러나 n ^ 2 + c 단계로 실행되는 알고리즘은 n ^ 2 단계보다 많이 걸리지 만 여전히 O (n ^ 2)입니다. Big-O 표기법은 점근 적 행동 만 설명 합니다.
HenryR

1
이것이 모두 정의가되는 것은 아닙니다. n은 무한대에 가까워짐에 따라 점근 적 표기법에 대해 이야기하고 있기 때문에. 상수 C는 비인 수가됩니다.
l_39217_l

1
이 답변의 단순함을 좋아하지만 O (n ^ 2) 알고리즘은 실행하는 데 1,000,000,000 * n ^ 2 단계를 수행하는 데 매우 효과적 일 수 있습니다. 이는 n ^ 2보다 훨씬 큽니다. 알고리즘이 O (n ^ 2)이면 단지 k * n ^ 2 단계 만 실행하면된다. 여기서 k는 양의 실수입니다.
MarredCheese

38

여기에 이미 아름답게 요약 된 이론적 정의를 제공하는 대신 간단한 예를 들겠습니다.

의 런타임 가정 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);
}

"Asymptotic runtime"은 무엇을 의미합니까?
헬기 무승부 사자

1
이 문맥에서 점근선은 "충분히 큰 n"을 의미한다. 점근 적 런타임이 Θ(n)n이 증가함에 따라 선형으로 증가 하는 코드 단편의 런타임 , 예를 들어 런타임 T는 T (n) = a * n + b로 표현 될 수 있습니다. 작은 n 값 (예 : n = 1 또는 2)의 경우 동작을 설명하는 가장 좋은 방법이 아닐 수 있습니다. 아마도 f (i)보다 훨씬 오래 걸리는 초기화 코드가있을 수 있습니다.
kara deniz

11

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 등과 같은 다양한 크기의 함수이기 때문에 대충 유사합니다.


11

차트는 이전 응답 이해하기 쉽게 만들 수 :

Θ- 표기법-같은 순서 | O- 표기-상한

Θ (n)-같은 순서 O (n)-상한

영어로,

왼쪽에는 동일한 크기 차수 (즉, g (n) ) 인 상한과 하한이 있습니다 . 상수를 무시하고 상한과 하한의 크기가 같은 경우 유효하게 f (n) = Θ (g (n)) 라고 말할 수 있습니다. 또는 f (n)이 g (n)의 큰 세타에 .

더 간단한 예인 오른쪽부터 시작하여 상한 g (n) 은 단순히 크기 차이며 상수 c를 무시합니다 (모든 큰 O 표기법과 동일).


단어와 그래프를 엉망으로 만들었습니다.
kushalvm

@kushalvm, 정직합니다. 구체적으로 무엇을 의미하는지 설명해 주시겠습니까? 내 학습과 다른 사람들을 위해이 답변과 혼동 될 수 있습니다. :-)
Ricardo

마지막 단락의 마지막 줄이 f (n)이 아니어야합니까?
kushalvm

@kushalvm, 설명해 주셔서 감사합니다. 영어 실수를 해결 하기 위해 마지막 단락 의 마지막 줄의 텍스트를 변경했습니다 .
Ricardo



3

한계 사용

의 고려하자 f(n) > 0g(n) > 0모든 n. 가장 빠른 실제 알고리즘에는 하나 이상의 작업이 있으며 시작 후에 실행이 완료되므로이를 고려해도됩니다. 이것은 f(n)절대 값 ( |f(n)|) 대신 값 ( )을 사용할 수 있기 때문에 미적분을 단순화합니다 .

  1. 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))                 ∞
    
  2. 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
    

2

결론 : 우리는 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 Ω은 정의와 같은 것이 아니지만 우리의 입과 뇌에서 같은 것입니다.


이 내용은 왜 인용 형식으로되어 있습니까? 인가 는 외부 소스에서 인용? 그렇다면 소스를 연결하거나 다르게 식별해야합니다. 그렇지 않은 경우 따옴표 형식을 제거해야합니다.
Mark Amery
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.