나는이 다음 코드 :컴퓨팅 알고리즘의 복잡성 - 혼란
sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
sum++;
복잡성이 O(n^2)
것,하지만 내부 루프의 복잡성에 대한 좀 더 파고하려면 다음이 (n (n-1))/2
또는 (n-1)!
것입니까?
나는이 다음 코드 :컴퓨팅 알고리즘의 복잡성 - 혼란
sum = 0;
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
sum++;
복잡성이 O(n^2)
것,하지만 내부 루프의 복잡성에 대한 좀 더 파고하려면 다음이 (n (n-1))/2
또는 (n-1)!
것입니까?
예, O (n^2)하지만 실제로 0 + 1 + ... + n-1 = n (n-1)/2 = O (n^2) !
big-O 표기법에 관한 한 상수는 부적절합니다.
계산 한 내용 (n(n-1)/2)
은 코드에 대한 정확한 반복 횟수입니다. 시간 복잡성에 대해 큰 O가 요구되면, 시간을 표현하기에 충분한 크기의 추정치를 제공합니다. 즉
, 당신은 THE SMALLEST
power
n
의를 찾을 필요가 일부 k (k>0)
를 들어, k * n^power
는 반복의 정확한 숫자보다 클 것 같은. 귀하의 경우 k
은 1
이고 power
은 2
입니다. 다음 O(n^power)
귀하의 시간 복잡합니다. 큰 O 표기법 이후
n의 힘이 될 필요는 없습니다. log n, 2^n, n!과 같은 함수가 수행합니다. – Juan
@Juan : 'n'의 힘이 될 필요가있을뿐만 아니라 어떤 경우에는 불가능합니다. 예를 들어'n! '은 다항식보다 빠르게 증가합니다. – jason
이것은 실제로 올바르지 않습니다. n^2 시간에 실행되는 함수는 O (n^3)입니다. (O (n^3))은 O (0이 아닌 모든 것)가 무한한 수의 함수가있는 단순한 집합이기 때문에 내가 말합니다.). 모든 빅 - 오 (Big-O)는 그것이 상한선이라는 것을 요구합니다. (즉, 어떤 k^3 + c가 어떤 상수 k와 c의 상한값이라는 것을 공식적으로 의미합니다. 빅 시타는 상한선과 하한선 둘 다 필요합니다. – DivineWolfwood
time = n*(n-1)/2
= (n*n - n)/2
은에 상한선을 나타내는 중요하지 않기 때문에 (모두 제거됩니다 상한, 적은 차 기간 (-n)와 상수 계수 (1/2)입니다 시간)을 사용하여 큰 -0 표기법을 생성합니다. O(n*n)
은 O(n^2)
으로 잘 알려져 있습니다.
우선, (n-1)!
은 (n-1)(n-2)...(2)(1)
을 의미합니다. 이것은 분명히 당신이 원하는 것이 아닙니다.
실제 반복 횟수를 계산하면 0 + 1 + 2 + ... + (n-2) + (n-1)
이됩니다. 합계에 n
개의 용어가 있으며 각 쌍의 평균값이 (n-1)/2
인 방식으로 이들을 페어링 할 수 있습니다. (가장 높은 값과 가장 낮은 값, 두 번째 값과 두 번째 값이 낮은 값과 쌍을 이루는 값) n
이 홀수 인 경우 남은 값은 쌍을 이룰 수 없지만 편리하게 값은 (n-1)/2
입니다. 따라서 n
개의 용어가 있으며 모든 용어의 평균은 (n-1)/2
이므로 총계는 n(n-1)/2
입니다.
큰 O 표기법의 경우 정확히 얼마나 많은 반복이 필요한지 알 수 없습니다. n
이 매우 큰 경우 한도를 알고 싶을뿐입니다. 반복 횟수는 (1/2)n^2 - (1/2)n
으로 작성할 수 있습니다. n
매우 큰 경우 n^2
용어는 n
용어보다 길기 때문에 n
용어는 삭제됩니다. 그것은 우리에게 (1/2)n^2
으로 남겨 둡니다. 그러나 큰 O 표기법의 또 다른 규칙은 우리가 상수 요소에 관심이 없기 때문에 그냥 O (n^2)라고 씁니다. (n은^2)
당신은 시간
22222222222222 + 4444444444444*n + 9999999999999999999999999*n^2 steps
에서 실행되는 알고리즘을 가질 수 그리고 그것은 여전히 O를 될 것입니다.
알고리즘 실행 시간이 O보다 나은 이유는 공개 된 문제입니다.
실행 시간에 대한 설명을 "더 나은"것으로 한정하는 것은 무엇입니까? 이 알고리즘이'f (n)'단계에서 발생하거나,이 알고리즘이 그러한 하드웨어에서 'n'당 평균 'X'밀리 초 단위로 실행되는 것처럼 더 구체적 일 수 있습니다. 반드시 그 묘사를 "더 나은"것으로 만들지는 않습니다. –
@Tim : 음 ... 16 코어 Mac에서 실행되는 정확히 16 스레드 정렬을 사용하여 누구나 오늘 구입할 수 있고 기본 Java 모노 스레드 정렬보다 성능이 우수한 것을 확인한 후에는 " O (n log n)/nb cpus "표기법 또는 무엇인가. n이 무한대에 접근 할 때 "상한"을 위해 아무 것도 변경하지 않지만, 가장 실질적인 목적을 위해 우리는 점점 더 병렬화 된 세계에 들어가기 위해 더 나은 것을 필요로 할 수도 있습니다. 모노 스레드 알 고와 16 코어 이상으로 잘 확장되는 것을 구별 할 수 있습니다. – SyntaxT3rr0r
이 숙제가 있습니까? 나는 그걸로 태그를 붙였다. –
nops - 우리는 프로젝트에서 일하고 있었고 솔루션을위한 알 고를 계산하는 동안이 논쟁이있었습니다. 그래서 그것을 확인하고 싶었습니다 –