2012-02-02 1 views
-3

거품 정렬 인이 정렬 코드는 있지만이 코드는 정확히 O (N^2)가 아닌 것 같습니다. 아래의 코드에서 Big O의 관점에서 시간 계산상의 복잡성이 무엇인지 궁금합니다. 내 추측으로 그것은 O (N.logN)입니다.시간 계산 복잡성?

코드는 그대로 예제로 제공되며 그대로 컴파일 할 수 있다고 주장하지 않습니다. 그것을 추측 내

for(i = 0; i < n-1; i++) 
{ 
    for(j = 0; j < n-i-1; j++) 
    { 
     if (a[j+1] < a[j]) 
     { 
      temp = a[j]; 
      a[j] = a[j+1]; 
      a[j+1] = temp; 
     } 
    } 
} 
+3

"아래의 코드"는 무엇입니까? –

+0

@PaulR Blooper corrected - 지금 코드를 게시하십시오. – goldenmean

답변

3

는 O (N.logN)입니다.

왜 그런가? 실제로 일어나는 일을보세요 ...

외부 루프를 처음 사용하면 i == 0입니다. 즉, j의 범위는 0에서 n-1입니다.

두 번째로, i == 1이므로 j의 범위는 0에서 n-2입니다.

세 번째로 i == 2이므로 j는 0에서 n-3까지입니다.

는 ...

통해 지난번 내가 == N-1, 그래서 j는 0 내지 따라서 0

범위

, 동작의 총 개수는 N-1 + N-2 + n-3 + ... + 0

Σi, i = 0..n-1은 무엇인가? 이제 큰 O 바인딩으로 변환하십시오.

+0

케일럽 말이 맞아. 내부 루프가 외부 루프를 사용할 때마다 더 짧아지기 때문에 O (n^2)보다 "느낄"수 있습니다. 내부 루프가 매번 "n"이 될 때보 다 빠릅니다. 그러나, 그것은 n에 따라 작업량이 기하 급수적으로 증가한다는 전반적인 사실을 변화시키지 않습니다. –

+0

@Caleb 수학에 감사드립니다. 예, 총 반복 횟수는 N (N-1)/2 인 것처럼 보이므로 여전히 O (N^2)입니다. N.logN (반복적 인 것이 아니라 반복적 인) 알고리즘은 어떻게 생겼을까요? 우리가 실제로 N -> N/2 -> N/4 등으로 갈 때 왜 우리가 정렬 된 배열에서 이진 검색을 수행 할 때 logN이라고 말합니까? 검색 할 배열의 절반을 나눕니 까? 사람들은 항상 바이너리 검색 ==> logN이라고 말하지만, 그 뒤에있는 수학을 발견하지 못합니다. – goldenmean

+0

@ goldenmean 이진 검색에서 각 단계에서 검색 할 항목 수를 2로 나눕니다. 즉, 요소를 찾으려면 log2 (n) 단계가 필요합니다. 시도해보십시오 : n = 8이면 3 단계가 필요합니다. n = 32 인 경우 5 단계. – Caleb