실행 방법에 따라 4 가지 큰 O 시간 복잡성 을 나타내는 프로그램 (또는 기능)을 작성하십시오 . 어떤 형태로든 양의 정수 N을 취하는데, 이는 당신이 2 31 미만이라고 가정 할 수 있습니다 .
프로그램이 원래 형식으로 실행될 때 지속적으로 복잡 해야합니다 . 즉, 복잡도는 Θ (1) 또는 동등하게 Θ (1 ^ N) 이어야합니다 .
프로그램을 되돌리고 실행하면 선형 복잡성 이 있어야합니다 . 즉, 복잡도는 Θ (N) 또는 동등하게 Θ (N ^ 1) 이어야합니다 .
( 반전 되므로 이치N^1
에1^N
맞습니다.)프로그램이 두 배가 될 때 , 즉 그 자체로 연결되고 실행될 때, 프로그램은 지수 적으로 복잡 해야하며 , 특히 2 N 입니다. 즉, 복잡도는 Θ (2 ^ N) 이어야합니다 .
(2
in2^N
은 in의 두 배 이므로 의미1
가1^N
있습니다.)프로그램되면 배 와 반전 하고 있어야 실행 다항식 구체적 복잡성 N 2 . 즉, 복잡도는 Θ (N ^ 2) 이어야합니다 .
( 반전 되므로 이치N^2
에2^N
맞습니다.)
이 네 가지 경우 만 처리해야합니다.
프로그램의 런타임이 필요한 복잡성에 따라 위와 아래에 모두 묶여 있어야하기 때문에 정확성을 위해 big O 대신 big theta (Θ) 표기법을 사용 하고 있습니다. 그렇지 않으면 O (1)로 함수를 작성하는 것만으로도 4 가지 점을 모두 충족시킬 수 있습니다. 뉘앙스를 이해하는 것은 너무 중요하지 않습니다. 주로 프로그램이 일부 상수 k에 대해 k * f (N) 연산을 수행하는 경우 Θ (f (N))에있을 수 있습니다.
예
원래 프로그램이
ABCDE
그런 다음 일정한 시간이 걸립니다. 즉, 입력 N이 1 또는 2147483647 (2 31 -1)이거나 그 사이의 값이든, 거의 같은 시간 내에 종료되어야합니다.
프로그램의 역 버전
EDCBA
즉, 종료하는 데 걸리는 시간은 N에 대략 비례해야합니다. 따라서 N = 1은 가장 짧은 시간이 걸리고 N = 2147483647이 가장 많이 걸립니다.
프로그램의 두 배 버전
ABCDEABCDE
N의 관점에서 2 대 N 시간이 필요합니다. 즉, 종료하는 데 걸리는 시간은 대략 2 N에 비례해야합니다 . 따라서 N = 1이 약 1 초 안에 종료되면 N = 60은 우주의 나이보다 오래 걸릴 것입니다. (아니, 테스트 할 필요는 없습니다.)
프로그램의 이중 및 역 버전
EDCBAEDCBA
즉, N의 관점에서 제곱 시간을 가져야합니다. 즉, 종료하는 데 걸리는 시간은 N * N에 대략 비례해야합니다. 따라서 N = 1이 약 1 초 안에 종료되면 N = 60은 종료하는 데 약 1 시간이 걸립니다.
세부
프로그램이 복잡하다고 생각하는 것을 보여 주거나 논쟁해야합니다. 타이밍 데이터를 제공하는 것은 좋은 생각이지만 이론적으로 왜 복잡성이 올바른지 설명하려고 노력하십시오.
실제로 프로그램에 걸리는 시간이 복잡성을 완벽하게 대표하지 않거나 결정 론적이라면 괜찮습니다. 예를 들어, 입력 N + 1은 때때로 N보다 빠르게 실행될 수 있습니다.
프로그램을 실행하는 환경 은 중요합니다. 인기있는 언어가 알고리즘에서 의도적으로 시간을 낭비하지 않는 방법에 대한 기본 가정을 할 수 있지만, 예를 들어 특정 버전의 Java 가 빠른 정렬 알고리즘 대신 버블 정렬을 구현 하는 것을 알고 있다면 정렬을 수행하는 경우이를 고려해야합니다 .
여기서 모든 복잡성에 대해 최선의 경우 나 평균적인 경우가 아니라 최악의 시나리오 에 대해 이야기하고 있다고 가정 합니다.
프로그램의 공간 복잡성은 중요하지 않으며 시간 복잡성 만 중요합니다.
프로그램은 무엇이든 출력 할 수 있습니다. 양의 정수 N을 취하고 정확한 시간 복잡성을 갖는 것만 중요합니다.
의견과 여러 줄 프로그램이 허용됩니다. (당신은 가정 할 수
\r\n
반전이다\r\n
윈도우의 호환성을 위해.)
큰 O 알림
가장 빠른 O(1), O(N), O(N^2), O(2^N)
것부터 가장 느린 것까지 (위의 1, 2, 4, 3 순서).
느린 용어가 항상 지배적입니다 (예 :) O(2^N + N^2 + N) = O(2^N)
.
O(k*f(N)) = O(f(N))
상수 k. 그래서 O(2) = O(30) = O(1)
및 O(2*N) = O(0.1*N) = O(N)
.
기억 O(N^2) != O(N^3)
하고 O(2^N) != O(3^N)
.
채점
이것은 정상적인 코드 골프입니다. 바이트 단위의 가장 짧은 원래 프로그램 (상수 시간 1)이 이깁니다.
n = input(); for i in xrange(n): pass
은 입력 크기가 2 ** k
어디 k = log_2(n)
인지 단계를 거치기 때문에 기하 급수적으로 복잡 합니다. 요구 사항이 급격히 변하기 때문에 이것이 사실인지 명확히해야합니다.