O (…)는 무엇이며 어떻게 계산합니까?


31

도움! 알고리즘 또는 일부 코드의 Big-O를 분석해야하는 위치에 대한 질문이 있습니다.

  • Big-O가 무엇인지, Big-O가 Big-Theta 또는 알고리즘의 복잡성을 분석하는 다른 수단과 어떤 관련이 있는지 확실하지 않습니다.

  • Big-O가 코드를 실행하는 시간 또는 소요되는 메모리 양 (공간 / 시간 균형)을 나타내는 지 확실하지 않습니다.

  • 나는 루프, 아마도 재귀 알고리즘을 가져 와서 그것을 위해 Big-O를 만들어야하는 컴퓨터 과학 숙제를 가지고 있습니다.

  • 알려진 Big-O가있는 두 데이터 구조 또는 알고리즘 중에서 선택할 수있는 프로그램을 개발 중이며 어떤 것을 선택할지 확실하지 않습니다.

내 프로그램, 숙제 또는 컴퓨터 과학에 대한 일반적인 지식에 Big-O를 계산하고 적용하는 방법을 어떻게 알 수 있습니까?

참고 :이 질문은 커뮤니티에서 결정한 다른 Big-O 질문에 대한 정식 목표입니다 . 많은 Big-O 질문에 대한 유용한 정보를 많이 포함 할 수 있도록 의도적으로 광범위합니다. 비슷한 질문이 허용된다는 표시로 광범위하다는 사실을 사용하지 마십시오.


1
참고로이 질문은 여기 메타에서 논의되고 있습니다 .
enderland

2
시작하기에 좋은 자료는 칸 아카데미 코스입니다 (CLRS의 토마스 코멘 (Thomas Cormen)은 작가 중 한 명입니다). 이것은 CS 졸업생으로서 저에게도 훌륭한 자료였습니다. khanacademy.org/computing/computer-science/algorithms
Sudip Bhandari

3
이 질문을 신고하는 사람들에게 : 질문 하단의 하위 텍스트를 읽고 신고하거나 투표하기 전에 해당 링크를 따라 가십시오.

답변:


22

O (...)는 Big-O 표기법을 나타내며, 알고리즘이 어떤 작업을 수행하는 데 필요한 작업 수를 설명하는 간단한 방법입니다. 이것을 시간 복잡성이라고 합니다.

Big-O 표기법에서 알고리즘 비용은 가장 많은 비용이 드는 작업으로 표시됩니다. 알고리즘이 단계를 수행하면 O (n 3 )으로 표시됩니다. 목록의 각 항목을 계산 한 알고리즘은 선형 시간이라고하는 O (n) 시간에 작동합니다.n3 + n2 + n

Wikipedia의 이름과 고전적인 예 목록 : 공통 기능의 순서

관련 자료 :


6
참고 : big O는 본질적으로 시간이나 공간 또는 특정 사항을 측정하지 않습니다. 단순히 함수의 점근 적 성장 (상수까지)을 상한으로합니다. 이 함수는 입력 길이의 함수로서 알고리즘의 시간, 공간 등이 될 수 있으며, CS 문맥에서 가장 일반적으로 시간은 시간이지만 반드시 그런 것은 아닙니다.
Monica Monica 복원

23

점근 기능은 무엇입니까? 어쨌든 점근선이란 무엇입니까?

크기 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 )-지수 (임의 mn으로 올림 ). 많은 재귀 및 그래프 알고리즘이이 범주에 속합니다.

  • Θ (n!)-계승. 특정 그래프 및 조합 알고리즘은 요인 복잡성입니다.

최선 / 평균 / 최악의 사례와 관련이 있습니까?

아니요. Big-O 및 해당 표기법은 특정 수학 함수에 대해 설명 합니다 . 그것들은 알고리즘의 효율을 특징 짓는 데 도움이되는 수학적 도구이지만, 최고의 / 평균 / 최악의 경우의 개념은 여기에 설명 된 성장률 이론과 관련이 없습니다.

알고리즘의 Big-O에 대해 이야기하려면 정확히 하나의 매개 변수를 사용하여 알고리즘 의 특정 수학적 모델을 커밋해야합니다 n. 이는 어떤 의미에서든 입력의 "크기"를 설명해야합니다. 그러나 실제 세계에서 입력은 길이보다 훨씬 더 많은 구조를 가지고 있습니다. 이것은 정렬 알고리즘이라면, 나는 문자열에 공급 수 "abcdef", "fedcba"또는 "dbafce". 그들 모두는 길이가 6이지만, 그중 하나는 이미 정렬되어 있고, 하나는 반대로되어 있으며, 마지막은 임의의 혼란입니다. 입력이 이미 정렬 된 경우 Timsort와 같은 일부 정렬 알고리즘이 더 잘 작동합니다. 그러나이 비균질성을 어떻게 수학적 모델에 통합 시키는가?

일반적인 접근 방식은 입력이 임의의 확률 론적 분포에서 나온 것으로 가정하는 것입니다. 그런 다음 length가있는 모든 입력에 대한 알고리즘의 복잡성을 평균합니다 n. 이것은 알고리즘 의 평균 사례 복잡성 모델을 제공합니다. 여기에서 평소와 같이 Big-O / Θ / Ω 표기법을 사용하여 평균 사례 동작을 설명 할 수 있습니다.

그러나 서비스 거부 공격이 우려되는 경우보다 비관적 일 수 있습니다. 이 경우 유일한 입력은 알고리즘에 가장 많은 슬픔을 유발하는 입력 이라고 가정하는 것이 더 안전 합니다. 이것은 최악의 복잡한 알고리즘 모델을 제공합니다. 나중에 최악의 모델의 Big-O / Θ / Ω 등에 대해 이야기 할 수 있습니다 .

마찬가지로, 알고리즘이 최상의 모델 에 도달하는 데 가장 적은 문제가 있다는 입력에만 관심을 집중 한 다음 Big-O / Θ / Ω 등을 볼 수 있습니다.


이것은 좋은 대답이지만 Big-O 및 Big-Ω은 최악의 경우와 가장 관련이 없습니다. 그것들은 상한과 하한이지만 두 경우 모두에 적용 할 수 있습니다. 예를 들어 삽입 정렬은 가장 좋은 경우 ϴ(n)최악의 경우를 가지고있는 동안 (Big-O 및 Big-Ω) 의 시간 복잡성 을 가지고, ϴ(n²)(Big-O 및 Big-Ω 모두) 의 시간 복잡성 .
Paul

또한 빈 알고리즘을 제외한 모든 알고리즘 Ω(1)은 최상의 경우, 최악의 경우 및 평균 경우이지만 하한이므로 실제 알고리즘의 경우와 관련이 없기 때문입니다.
Paul

최선의 경우 나 최악의 경우와 관련없는 것은 일반적인 오해입니다. 결정적 기능이 다른 기능과 비교하여 더 빠르거나 느리거나 같은 속도로 성장하는지 여부를 나타내는 방법 일뿐입니다. 최선 / 최악의 경우 개념은 실제 알고리즘의 시간 / 공간 복잡성에 대해 이야기하기 시작한 후에 만 ​​존재하며,이 경우 비 결정적 요인이 발생하고 입력의 확률 분포를 고려해야합니다. 그럼에도 불구하고, 가장 좋은 / 가장 나쁜 경우는 big-O / Omega와 직교 하는 축에 있습니다 .
Rufflewind

@Rufflewind를 더 잘 설명 할 수 있다고 생각되면 계속 진행하십시오. 이것이 커뮤니티 위키 답변이라는 것을 알고 있습니까?

"먼저 비공식 문헌에서"Big-O "는 종종 Big-Θ의 동의어로 취급됩니다."-> 비공식 문학뿐만 아니라. 대학으로 돌아가서 Complexity에 관한 첫 학기는 Big-O가 Big-Θ 인 것처럼 Big-O의 정의를 가르쳐주었습니다. (우리의 교과서는 그 정의를 사용했습니다!) 그것은 Complexity II에 갔을 때 지옥을 혼란스럽게 만들었고 두 사람이 같지 않다는 것을 알았습니다.
T. Sar-복원 모니카
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.