Belirli bir bubblesort algoritmasının ortalama zaman karmaşıklığının değerlendirilmesi.


11

Bir bubblesort'un bu sahte kodunu göz önünde bulundurarak:

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

Ortalama zaman karmaşıklığını değerlendirmek için aklımda tutmam gereken temel fikirler neler olurdu? Zaten en kötü ve en iyi durumları hesaplamayı başardım, ancak denklemi oluşturmak için iç döngünün ortalama karmaşıklığını nasıl değerlendireceğimi tartıştım.

En kötü durum denklemi:

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

burada iç sigma iç halkayı temsil eder ve dış sigma dış halkayı temsil eder. Ben dış sigma etkileyebilir "if-then-break" -cuse nedeniyle hem de bir döngü sırasında yapılan eylemleri etkileyecek iç döngü if-yan tümce nedeniyle her iki sigma değiştirmek gerektiğini düşünüyorum (Doğru ise 4 eylem + 1 karşılaştırma, yalnızca 1 karşılaştırma).

Ortalama süre terimi hakkında açıklama için: Bu sıralama algoritması, farklı listelerde (aynı uzunlukta) farklı zamana ihtiyaç duyacaktır, çünkü algoritma, liste tamamen sıralanana kadar döngüler içinde / içinde daha fazla veya daha az adım gerektirebilir. İhtiyaç duyulan turların ortalamasını değerlendirmenin matematiksel (istatistiksel olmayan bir yolunu) bulmaya çalışıyorum.

Bunun için herhangi bir emrin aynı olasılıkta olmasını bekliyorum.


6
öncelikle ortalamanın ne anlama geldiğini tanımlamanız gerekir. Algoritma deterministik olduğundan, girdiler üzerinde bir çeşit dağıtım varsaymanız gerekir.
Suresh

@Sim En kötü zaman karmaşıklığını nasıl hesapladığınızı gösterebilir misiniz? Ardından, davanızdaki ortalama karmaşıklık ile ne demek istediğiniz hakkında bir fikir edinebiliriz.
0x0

Demek istediğim, ortalama zamanı en fazla gereken zaman (ya da başka bir deyişle 'saf' matematiksel versiyonu: istatistiksel analiz yaparken gözlemlenen tüm zamanların ortalaması) şeklinde. Örneğin, en kötü durumu n ^ 2 olmasına rağmen quicksort'un ortalama bir nlogn değeri vardır.
Sim

1
@Sim Kabarcık sıralamasında ortalama durum = en kötü durum zaman karmaşıklığı, yani, Ortalama durum Zaman karmaşıklığı dan2
0x0

3
Bir fark var. quicksort'un, verilerle ilgisi olmayan "bir pivot seçerken jeton fırlatma seçimi üzerinden" ortalaması alınır. Bununla birlikte, (örneğin) her giriş sırasının aynı olasılıkla gerçekleşmesini beklediğinizi (örneğin) tüm "girdilerin üzerinde" ortalamak istediğinizi ima edersiniz. bu makul, ancak açıkça belirtilmelidir.
Suresh

Yanıtlar:


9

uzunluklu listelerde , ortalama genellikle tüm eşit dağılımla başlamak zorunda olduğunuz anlamına gelir[ , .., ] ' permütasyonları : dikkate almanız gereken tüm listeler bu olacaktır.n ! 1 nnn!1n

Ortalama karmaşıklığınız tüm listeler için adım sayısının toplamı bölünür.n!

Belirli bir liste için , senin algoritmanın adımları sayısıdır nerede bir unsur arasındaki en büyük mesafedir ve hak ettiği konuma (ama sola taşımak için mevcutsa), yani .(xi)inddxiimaxi(max(1,ixi))

Daha sonra matematiği yapın: her için bu belirli maksimum mesafeye sahip listelerin sayısını , o zaman beklenen değeri:c d ddcdd

1n! d=0n dcd

Ve bu en zor kısmı olmayan temel düşünceler . Belki de daha basit bir çözüm var.cd

EDIT: `` beklenen '' eklendi


Normal bir dağılım düşünürseniz, yaklaşmanın bir yolu var mı? cd
Sim

diyebilirsinizçünkü [ , .., ] ' nin tüm permütasyonlarını herhangi bir yere karıştırabilir ve sonunda ekleyebilirsiniz , ancak ortalama olarak kanıtlamak küçüktür . 2 gün 1cd(n+1d)(d1)!2d1n²
jmad

19

ve ise bir çiftin (sırasıyla ) ters çevrildiğini hatırlayın .( i , j ) i < j A [ i ] > A [ j ](A[i],A[j])(i,j)i<jA[i]>A[j]

Algoritmanızın her ters çevirme için bir takas gerçekleştirdiğini varsayarsak, algoritmanızın çalışma süresi ters çevirme sayısına bağlı olacaktır.

Tekdüze rastgele bir permütasyonda beklenen ters çevirme sayısını hesaplamak kolaydır:

Let bir permütasyon olabilir ve izin ters olarak . Örneğin, ardından .R ( P ) P P = 2 , 1 , 3 , 4 R ( P ) = 4 , 3 , 1 , 2PR(P)PP=2,1,3,4R(P)=4,3,1,2

Her bir indeks çifti veya nin tam birinde bir ters çevirme vardır .p R ( P )(i,j)PR(P)

Toplam çift sayısı olduğundan ve toplam sayı ve her bir çift, tüm permütasyonların eşit derecede muhtemel olduğu varsayılarak, permütasyonların tam yarısında ters çevrildiğinden, beklenen inversiyon sayısı:n(n1)/2

n(n1)4

bu, ters çevirme miktarını değerlendirir. ancak kırılma maddesinin bastığı zamana bağlı karşılaştırmaların miktarına ne dersiniz
Sim

Bir takas ile bir karşılaştırma elde edersiniz ve en önemlisi bir takas, ters çevirme sayısını en fazla bir azaltabilir.
jmad

her karşılaştırma takas ile sonuçlanmaz, if-cümlesi yanlışsa, tersine çevirme yapılmaz.
Sim

@rgrig Bir karşı örnek verirseniz, cevabımı düzeltirim.
Joe

@Joe: Yorumumu kaldırdım. Bu yanlıştı.
rgrig

2

Takas sayısı <Yineleme sayısı (hem optimize edilmiş hem de basit kabarcık durumu senaryosunda)

Ters Çevirme Sayısı = Takas sayısı.

Bu nedenle, Yineleme Sayısı>n(n1)4

Dolayısıyla, Ortalama vaka karmaşıklığı . Ancak, ortalama durum en kötü durumu geçemediğinden, olduğunu anlıyoruz ,O ( n 2 )ω(n2)O(n2)

Bu bize şunu verir: Ortalama Süre = θ(n2)

(Zaman karmaşıklığı = Yineleme sayısı yineleme sayısı> swap sayısı)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.