j
은 j
이 이기 때문에 공식에 포함되지 않아야합니다.
외부 루프 변수에 의존하는 루프가있을 때마다 나는 합계 공식을보고 복잡성을 찾는 것이 가장 쉽다는 것을 알게되었습니다.
그래서 바깥 쪽 루프는 확실히 n
번 실행되며 가장 안쪽 루프는 확실히 n/2
번 실행되지만 일반적으로 n/2 ∈ O(n)
입니다.
중간 루프를 살펴 보겠습니다.
중간 루프는 첫 번째 반복시에 (n-1)
번 실행되고 두 번째 반복시에는 (n-2)
번, 두 번째 반복에서는 (n-n)
까지 0 번과 동일하게 실행됩니다. 이 용어를 단순히 0에서 n의 합계로 재 배열 할 수 있습니다. 이 합계는 n(n+1)/2
과 같습니다.
이 수식은 바깥 쪽 루프와 중간 루프의 조합을 나타내므로 가장 안쪽 루프를 곱하면 최종 수식은 n(n+1)n/(2*2) == n^2(n+1)/4
이됩니다.
실현해야 할 개념적 사실 중 하나는 c
은 단순히 카운터이며 매 반복마다 증가하므로 c
은이 알고리즘의 런타임 복잡성을 직접 나타내는 것으로 생각할 수 있습니다.
c
을 계산하여이 결과를 확인할 수 있습니다. 여기
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int c = 0;
int n = 10;
if (argc > 1) {
n = atoi(argv[1]);
}
for (int i = 1; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
/* Note that I've changed k to run from 0 to n/2 instead of n
down to n/2, but this doesn't change the result. */
for (int k = 0; k < n/2; ++k) {
++c;
}
}
}
printf("c == %d; n^2(n+1)/4 == %d\n", c, n*n*(n+1)/4);
}
상기 입력 2, 4, 8, 32에 대한 상기 프로그램의 출력 및 64있어 :
c == 3; n^2(n+1)/4 == 3
c == 20; n^2(n+1)/4 == 20
c == 144; n^2(n+1)/4 == 144
c == 8448; n^2(n+1)/4 == 8448
c == 66560; n^2(n+1)/4 == 66560
바깥 쪽 루프'(n^2/2 + (n-1) * n/2 + ...)에 대한 연산의 합계로 이것을 써보십시오. – RishiG