주어진 bubblesort 알고리즘의 평균 시간 복잡성을 평가합니다.


11

bubblesort의이 의사 코드를 고려하면 :

FOR i := 0 TO arraylength(list) STEP 1  
    switched := false
    FOR j := 0 TO arraylength(list)-(i+1) STEP 1
        IF list[j] > list[j + 1] THEN
            switch(list,j,j+1)
            switched := true
        ENDIF
    NEXT
    IF switched = false THEN
        break
    ENDIF
NEXT

평균 시간 복잡성을 평가하기 위해 명심해야 할 기본 아이디어는 무엇입니까? 나는 최악의 경우와 최상의 경우를 이미 계산했지만 내부 루프의 평균 복잡성을 평가하여 방정식을 만드는 방법을 고심하고 있습니다.

최악의 방정식은 다음과 같습니다.

i=0n(j=0n(i+1)O(1)+O(1))=O(n22+n2)=O(n2)

여기서 내부 시그마는 내부 루프를 나타내고 외부 시그마는 외부 루프를 나타낸다. 외부 시그마에 영향을 줄 수있는 "if-then-break"절로 인해 두 시그마를 모두 변경해야한다고 생각합니다. 또한 내부 루프의 if- 구문으로 인해 루프 중에 수행되는 동작에 영향을 미칩니다. (만약 4 개의 행동 + 1이면 비교, 그렇지 않으면 1 개의 비교).

평균 시간이라는 용어를 명확히하기 위해 :이 정렬 알고리즘은 목록이 완전히 정렬 될 때까지 루프 내에서 루프 내에서 더 많거나 적은 단계를 거쳐야 할 수도 있으므로이 목록 알고리즘은 동일한 목록의 다른 목록에서 다른 시간이 필요합니다. 필요한 라운드의 평균을 평가하는 수학적 (비 통계적 방법)을 찾으려고합니다.

이를 위해 모든 주문은 동일한 가능성을 기대합니다.


6
먼저 평균이 의미하는 바를 정의해야합니다. 알고리즘은 결정론 적이므로 입력에 대한 일종의 분포를 가정해야합니다.
Suresh

@Sim 최악의 시간 복잡도를 어떻게 계산했는지 보여줄 수 있습니까? 그런 다음 사례의 평균 복잡성에 대한 의미를 알 수 있습니다.
0x0

필자는 가장 필요한 시간 (또는 '순수한'수학적 버전 : 통계 분석을 통해 관찰 된 모든 시간의 평균) 방식으로 평균 시간을 의미합니다. 예를 들어 quicksort는 최악의 경우 n ^ 2이지만 평균 nlogn을 갖습니다.
Sim

1
@Sim 기포 정렬 평균 경우 = 최악의 경우 시간 복잡도, 즉 평균 경우 시간 복잡도는n2
0x0

3
차이가 있습니다. quicksort는 데이터와 아무 관련이없는 "피벗을 선택할 때 동전 던지기를 선택하는"평균입니다. (예를 들어) 입력의 각 순서가 동일한 확률로 발생할 것으로 가정하는 "모든 입력에 대해"평균을 의미한다는 것을 암시합니다. 합리적이지만 명시 적으로 명시해야합니다.
Suresh

답변:


9

길이 목록에 평균은 일반적으로 모든 에서 균일 분포로 시작해야 함을 의미합니다[ , .., ]의 순열 : 고려해야 할 모든 목록이됩니다.nn!1n

그러면 평균 복잡도는 모든 목록의 단계 수를 으로 나눈 값의 합입니다.n!

주어진 목록 , 알고리즘의 단계 수는 이며 여기서 는 요소 와 그의 올바른 위치 사이의 가장 큰 거리입니다 (그러나 왼쪽으로 이동 경우에만), 즉 .(xi)inddxiimaxi(max(1,ixi))

그런 다음 수학을 수행하십시오. 각 에 대해이 특정 최대 거리를 가진 목록의 수를 의 예상 값은 다음과 같습니다.dcdd

1n! d=0n dcd

찾는 가장 어려운 부분이없는 기본 생각 입니다. 아마도 더 간단한 해결책이있을 수 있습니다.cd

편집 : '예상'추가


정규 분포를 고려하면 를 근사하는 방법이 있습니까? cd
Sim

라고 말할 수 있습니다왜냐하면 [ , .., ] 의 모든 순열을 어디에서나 다룰 수 있고 끝에 을 수 있지만 평균적으로 을 증명하기에는 작습니다 . cd(n+1d)(d1)!2d1n²
jmad

19

및 경우 쌍 (각각 )이 반전 됨을 기억하십시오 .(A[i],A[j])(i,j)i<jA[i]>A[j]

알고리즘이 각 반전에 대해 하나의 스왑을 수행한다고 가정하면 알고리즘의 실행 시간은 반전 수에 따라 다릅니다.

균일 한 랜덤 순열에서 예상되는 반전 수를 계산하는 것은 쉽습니다.

하자 순열, 그리고 수 있도록 의 반대가 될 . 예를 들어, 이면 입니다.PR(P)PP=2,1,3,4R(P)=4,3,1,2

각 인덱스 쌍 에 대해 정확히 또는 중 하나에 반전이 있습니다 .(i,j)PR(P)

전체 쌍의 개수가 이고 총 순열과 각 쌍이 순열의 정확히 절반으로 반전되므로 모든 순열이 동일하게 가정 될 때 예상되는 반전 수는 다음과 같습니다.n(n1)/2

n(n1)4

이것은 반전의 양을 평가합니다. 그러나 브레이크 절이 진행되는 시간에 따른 비교 량은 어떻
Sim

스왑별로 하나의 비교가 이루어지며 가장 중요한 것은 하나의 스왑이 최대 하나의 반전 수를 줄일 수 있다는 것입니다.
jmad

if-clause가 false이면, 모든 비교가 스왑을 생성하는 것은 아니며 반전이 수행되지 않습니다.
Sim

@rgrig 당신이 반례를 제시한다면, 나는 나의 대답을 바로 잡을 것이다.
Joe

@ 조 : 나는 내 의견을 제거했습니다. 이건 잘못 됐어.
rgrig

2

스왑 수 <반복 횟수 (최적 버블 시나리오 및 단순 버블 사례 시나리오 모두)

전환 수 = 스왑 수입니다.

따라서 반복 횟수>n(n1)4

따라서 평균 대소 문자 복잡성은 입니다. 그러나 평균 사례는 최악의 경우를 초과 할 수 없으므로 이며ω(n2)O(n2)

평균 시간 = θ(n2)

(시간 복잡도 = 반복 횟수> 반복 횟수)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.