`java int sum=0; for(int i=1;<n;i++){ for(int j=1;j<i*i;j++){ if(j%i==0){ for(int k=0;k<j;k++){ sum++; } } } } ``
I don't 는 방법을 이해할 때 j=i,2i,3i...마지막으로위해
반복 실행 n 다. 나는 그냥 don't 을 이해 우리가 어떻게 왔는 결론을 기반으로는만약에
문입니다.
수집하는 방법을 알고 계산하고 복잡도에 대한 모든 루프를 제외하고는 이유에 대한 지속 반복 실행되 나는 시간에 기반한 모 운영자...I just don't 는 방법을 참조's i. 기본적으로 할 수 있습니다 이유't j%가을 나는 내가 아닌가?
Let's 라벨 루프 A,B and C:
`java int sum=0; //루프 for(int i=1;<n;i++){ //반복 B for(int j=1;j<i*i;j++){ if(j%i==0){ //반복 C for(int k=0;k<j;k++){ sum++; } } } } ``
-루프 반복 O(n)다.
-B 루프 반복 O(i2)번당의 반복. 이러한 각 반복:
-j%i==0
으로 평가하는 O(1)다.
-1/i의 이러한 반복이,반복 C 반복j시간,일 O(1)당 일의 반복이다. 이후jO(i2)에 평균,그리고 이것은 단지 완료를 위해 1/i반복의 반복 B,평균 비용은 O(i2/i)=O(나).
곱하여 모든이 함께,우리는 O(n×i2×(1+i))=O(n×i3). 이후 나는 평균 O(n),이 O(n4).
까다로운 부분이라고 말하는만약에
상태로만 진실 1/i시간:
기본적으로 할 수 있습니다 이유't j%가을 나는 내가 아닌가?
사실,j
이 이동하는j<i*i
,까지 그냥j<i
. 그러나 조건은j%i==0
진실 경우에만j
은 여러 개의i
.
배수의i
범위 내에서는나
,2*나
,3*i
,...,(i-1)*i
. Therei-1
이다,그래서 루 C 에 도달i-1
시대에도 불구하고 루프 반복 Bi*i-1
다.
첫 번째 루프 소비n
반복 합니다.
두 번째는 루프 소비n*n
반복 합니다. 상상하는 경우i=n
다음j=n*n
.
*세 번째는 루프 소비n
반복하기 때문에 그것이's 만 실행된i
시대,어디로내가 제한된다
n`에서 최악의 경우입니다.
따라서,코드의 복잡도 O(n×n×n×n).
내가 당신을 도움이되기를 바랍니다.
다른 모든 답변은 정확하고,수정하는 다음과 같습니다.
보고 싶은 경우,감소의 실행의 내부 k-반복되었을 감소시키기에 충분한 실제적인 복잡성을 아래O(n⁴).
그래서 나는 다음과 같이 썼다:
`java for(int n=1;n<363;n++){ int sum=0; for(int i=1;<n;++i){ for(int j=1;j<i*i;++j){ if(j%i==0){ for(int k=0;k<j++k){ sum++; } } } }
긴 입방=(긴)수학이다.pow(n,3); 긴 hypCubic=(긴)수학이다.pow(n,4); 두 상대=(double)(합/(double)hypCubic); 시스템입니다.니다.system.out.println("n="+n+":반복="+sum+ "n³="+큐빅+",n⁴="+hypCubic+",rel="+상대적); } ``
실행 한 후 이것을 분명하게,복잡한 사실n⁴
. 마지막 줄을 출력은 다음과 같다:
n=356:반복=1989000035,n³=45118016,n⁴=16062013696,rel=0.12383254507467704 n=357:반복=2011495675,n³=45499293,n⁴=16243247601,rel=0.12383580700180696 n=358:반복=2034181597,n³=45882712,n⁴=16426010896,rel=0.12383905075183874 n=359:반복=2057058871,n³=46268279,n⁴=16610312161,rel=0.12384227647628734 n=360:반복=2080128570,n³=46656000,n⁴=16796160000,rel=0.12384548432498857 n=361:반복=2103391770,n³=47045881,n⁴=16983563041,rel=0.12384867444612208 n=362:반복=2126849550,n³=47437928,n⁴=17172529936,rel=0.1238518469862343
이 무엇을 보여줍은,실제 상대적인 차이를 실제n⁴
와의 복잡성 이 코드는 세그먼트는 요인 점근으로 주위에 가치는0.124...
(실제로 0.125). 는 동안 그것을 우리에게 제공하지 않습니다 정확한 값을,우리가 할 수 있습을 추론,다음과 같다:
시간 복잡도는n⁴/8~f(n)
wheref
는 귀하의 함수/방법입니다.
*Wikipedia 페이지에 O 표기 상태의 테이블'의 가족 Bachmann–란다우 표기'는~
정의 제한을 두 가지 연산자 양측은 동일합니다. 또:
f 같 g 점근
(나는 선택 363 으로 포함 상기 때문에n=362
는 마지막 값을 얻을 수있는 합리적인 결과입니다. 그 후에,우리는 초과 긴 공간을 상대적 가치합니다.)
사용자 kaya3 냈 다음과 같다:
asymptotic 일정이 정확하게 1/8=0.125 방법에 의해;여기's 의 정확한 공식을 통해 Wolfram Alpha.
Let's 에 처음 두 개의 루프가 있습니다.
첫 번째는 간단하고,그's looping1n. 두 번째는 좀 더 재미있다. 그것은 1 에서 내가 제곱. Let's 보는 몇 가지 예:
e.g. n = 4
i = 1
j loops from 1 to 1^2
i = 2
j loops from 1 to 2^2
i = 3
j loops from 1 to 3^2
총에서i j 루프
결합이1^2 + 2^2 + 3^2
.
거기에 수식에 대한 합의 첫 번째 사각형 n,n(n+1)(2n+1)/6거
O(n^3)`.
당신이 하나의 마지막은k 루프는 루프에서 0 하는
j는 경우에만
j%i==0. 이후
j1 에서
나는^2,
j%i==0이라는 사실에 대한
나다. 이후
내가 루프 반복을 통해n
,당신은 하나가O(n)
.
그래서 당신은O(n^3)
에서i j 루프는
다른O(n)
에서k 루프의 총계에
O(n^4)`
if
와 모듈을 변경하지 않고 복잡성여기's 래 방법:
public static long f(int n) {
int sum = 0;
for (int i = 1; i < n; i++) {
for (int j = 1; j < i * i; j++) {
if (j % i == 0) {
for (int k = 0; k < j; k++) {
sum++;
}
}
}
}
return sum;
}
당신이'다시 혼동해서는만약에
그리고 모듈,할 수 있습니다 그냥 리팩터에서는j
에 직접 점프에서나
를 위한2*나
를 위한3*i
...:
public static long f2(int n) {
int sum = 0;
for (int i = 1; i < n; i++) {
for (int j = i; j < i * i; j = j + i) {
for (int k = 0; k < j; k++) {
sum++;
}
}
}
return sum;
}
을 더욱 쉽게 계산하는 복잡할 수 있습을 소개하는 중개j2
변수,그래서 그는 모든 루프는 변수는 1 씩 증가합에서 각각의 iteration:
public static long f3(int n) {
int sum = 0;
for (int i = 1; i < n; i++) {
for (int j2 = 1; j2 < i; j2++) {
int j = j2 * i;
for (int k = 0; k < j; k++) {
sum++;
}
}
}
return sum;
}
당신이 사용할 수 있는 디버깅 또는 오래된 학교시스템이다.니다.system.out.println
을 확인하기 위해서는i,j,k
삼중은 항상 동일에서 각각의 방법입니다.
언급했듯이,다른 사람에 의해 사용할 수 있다는 사실에 합의 첫 번째n
정수와 같n*(n+1)/2
(참조삼각형의 숫자). 당신이 사용하는 경우 이러한 단순화에 대한 모든 루프,당신이 얻을:
public static long f4(int n) {
return (n - 1) * n * (n - 2) * (3 * n - 1) / 24;
}
그것은 분명하지*동일한 복잡성으로 원래 코드 그러나 그것은 반환한 값입니다.
당신의 첫 번째 조건다는 것을 알 수 있습니다0 0 0 2 11 35 85 175 322 546 870 1320 1925 2717 3731
에 나타납"스털링 숫자의 첫 번째 종류:s(n+2,n).",두 개의0 의 추가됩니다. 그것이 의미하는
합는[스털링의 수 첫 번째 종류][3]
s(n,n-2)`.