O (…)는 무엇이며 어떻게 계산합니까? 그것을 위해 Big-O를 만들어야하는

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

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

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

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

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

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

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



답변

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

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

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

관련 자료 :


답변

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

크기 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 / Θ / Ω 등을 볼 수 있습니다.


답변