Bu sıralama algoritması Θ (n³) ve Θ (n²) değil, en kötü durum nasıl?


52

Veri Yapıları ve Algoritmalar hakkında bir kursa yeni başladım ve eğitim asistanım bize bir tamsayı dizisini sıralamak için aşağıdaki sözde kodu verdi:

void F3() {
    for (int i = 1; i < n; i++) {
        if (A[i-1] > A[i]) {
            swap(i-1, i)
            i = 0
        }
    }
}

Açık olmayabilir, ancak burada sıralamaya çalıştığımız ndizinin boyutudur A.

Her durumda, öğretim görevlisi bu algoritma olduğunu sınıfına açıkladı Θ(n3) , öyle görünüyor olursa olsun bir ters-ayrılmış dizisi ile onu geçmesi kaç kez süresi (en kötü durum, inanıyorum) fakat bana göre olmalı Θ(n2)ve olmamalı Θ(n3).

Birisi bana bunun neden ve Θ (n ^ 2) olmadığını açıklayabilir mi?Θ(n3)Θ(n2)


Analiz için yapılandırılmış bir yaklaşımla ilgilenebilirsiniz ; Kendin için bir kanıt bulmaya çalış!
Raphael

Sadece uygulayın ve kendinizi ikna etmek için önlem alın. Tersine çevrilmiş 10.000 öğeli bir dizinin birkaç dakika sürmesi ve tersine çevrilmiş 20.000 öğeli bir dizinin yaklaşık sekiz kat daha uzun sürmesi gerekir.
gnasher729

@ Yanlış değil, ama benim çözüm farklıdır gnasher729: Eğer çalışırsanız kanıtlamak için size daima sen yanlış birşeyler söyleyecektir hangi başarısız olur bağlı. (. Tabii ki, tek hem Plotlama / uydurma kesinlikle daha hızlı hipotezi reddetme içindir yapabilirim, ama daha az güvenilir .. Sürece biçimsel / yapılandırılmış analiz için bir tür olduğu gibi, yapılan hiçbir zarar güvenerek araziler üzerinde problemler başlar nerede.)O(n2)
Raphael

1
i = 0açıklama nedeniyle
njzk2

Yanıtlar:


60

Bu algoritma bu şekilde yeniden yazılabilir.

  1. ABir inversiyon bulana kadar tarayın .
  2. Bir tane bulursanız, takas edin ve baştan başlayın.
  3. Yok ise, sonlandırın.

Şimdi en fazla inversiyonları olabilir ve her birini bulmak için doğrusal zaman taramasına ihtiyacınız vardır - bu nedenle en kötü çalışma süresi . Güzel bir öğretme örneği, kalıplara yakışan yaklaşıma yol açarken, birçoğunun yenmesi gereken!(n2)Θ(n2)Θ(n3)

Not: Kişi biraz dikkatli olmak zorunda: bazı inversiyonlar erken, bazıları gecikmiş görünüyor, bu nedenle maliyetlerin iddia edildiği gibi artması önemsiz değildir (alt sınır için). Ayrıca, takasların asla yeni çevrimler getirmediğini de gözlemlemeniz gerekir . Tersine sıralanan dizili durumun daha ayrıntılı bir analizi daha sonra Gauss'un formülünün ikinci dereceden örneği gibi bir şey verecektir.

@ Gnasher729 uygun bir şekilde yorum yaptığında, girişin sıralamasını yaparken çalışma zamanını analiz ederek en kötü çalışma zamanının olduğunu görmek kolaydır. (bu giriş muhtemelen en kötü durum değil ).Ω(n3)[1,2,,n,2n,2n1,,n+1]

Dikkatli olun: tersine sıralanan bir dizinin tüm sıralama algoritmaları için mutlaka en kötü durum girişi olacağını varsaymayın. Bu algoritmaya bağlı. Tersine sıralanmış bir dizinin en kötü durum olmadığı ve hatta en iyi duruma bile yakın olabileceği bazı sıralama algoritmaları vardır.


14
İlk yarının artan düzende 1 ile n / 2 arasında olduğu bir diziyi alırsanız ve ikinci yarı ters sırada ile n / 2 + 1 arasındaysa, en az n / 2'ye ihtiyacınız olduğu açıktır. Her inversiyon bulmak için adımlar ve yaklaşık (n / 2) ^ 2/2 olacaktır. Ve bu muhtemelen en kötü durum değil.
gnasher729

@AnthonyRossello Bu standart bir sonuçtur (permütasyonların birleşiminde). Kısacası, tersine sıralanan dizideki ters çevirme sayısını sayın (en kötü durumun bu olduğu açık mı?); bu bir Gauss toplamı.
Raphael

Kişi ne olursa olsun, kısmi toplamlarının her zaman olduğunu hatırlamak zorundadır , sadece hızla düşen katsayıdır: (oldukça yüksek katsayılı ). Sorun şu ki, katsayıları önemsemiyor. Θ(nα)Θ(nα+1)k=0nkα1α+1nα+11α+1Θ
yo'

2
@ 'Bu ve cevap (ya da soru) ile nasıl ilgilidir?
Raphael

7

Bunun hakkında düşünmenin alternatif bir yolu, maksimum değerin isıfırlanmadan önceki haline gelmesidir. Bu, ortaya çıktığı gibi, önceki sıralama düzeninin Aalgoritmanın çalışma zamanını nasıl etkilediğinin nedenini açıkça ortaya koymaktadır.

Özellikle, iyeni maksimal değerini ayarladığında, N diyelim, dizinin [A[0], ..., A[N-1]]artan düzende sıralandığını gözlemleyin .

Peki elementi A[N]karışıma eklediğimizde ne olur ?

Matematik:

Diyelim ki, pozisyonunda . Sonra ihtiyacımız (ı göstermek edeceğiz döngü yineleme ) yerleştirmek için taşımak için , yerleştirmek taşımak için yinelemeleri ve genel olarak:pNNstepsN1N+(N1)N2

stepsN(pN)=N+(N1)+(N2)++(pN+1)=12(N(N+1)pN(pN+1))

Rastgele sıralanan bir dizi için , her için üniform dağılımını alır :pN{0,1,,N}N

E(stepsN(pN))=a=1NP(pN=a)stepsN(a)=a=1N1N12(N(N+1)a(a+1))=12(N(N+1)13(N+1)(N+2))=13(N21)=Θ(N2)

toplam Faulhaber formülü veya altındaki Wolfram Alpha bağlantısı kullanılarak gösterilebilir.

Bir ters kriteri dizisi için, tüm ve elde ederiz:pN=0N

stepsN(pN)=12N(N+1)

tam olarak, diğer değerlerinden kesinlikle daha uzun .pN

Önceden sıralanmış bir dizi için, ve ; alt sıradaki terimler alakalı olur.pN=NstepsN(pN)=0

Toplam zaman:

Toplam süreyi almak için, tüm üzerindeki adımları özetliyoruz . (Süper dikkatli olsaydık, takasların yanı sıra döngü yinelemelerini de toplar ve başlangıç ​​ve bitiş koşullarına dikkat ederdik, ancak çoğu durumda karmaşıklığa katkıda bulunmadıklarını görmek oldukça kolaydır) .N

Ve yine, beklenti doğrusallığını ve Faulhaber Formülünü kullanarak:

Expected Total Steps=E(N=1nstepsN(pN))=N=1nE(stepsN(pN))=Θ(n3)

Elbette, bir nedenden dolayı değilse (örneğin, baktığımız dizilerin dağılımı zaten sıralanmaya çok yakın), o zaman bu her zaman gerekmez durum böyle olsun. Ancak bunu başarmak için üzerinde çok özel dağılımlar !stepsN(pN)Θ(N2)pN

İlgili okuma:


@Raphael - önerilen iyileştirmeler için teşekkürler, biraz daha ayrıntı ekledim. Rastgele değişkenler ( , emir kümesinden ), bu yüzden beklentiler teknik olarakpiΩAΩ
David E

Farklı ; Landau'yu kastettim. Ω
Raphael

3

Yasal Uyarı:

Bu bir kanıt değil (bazı insanlar sanki göndermiş olduğumu düşünüyor gibi görünüyor). Bu, OP'nin görevlendirme konusundaki şüphelerini çözmek için yapabileceği küçük bir deneydir:

tersine dizilmiş bir dizi ile kaç kere geçersem geçeyim seems olmalı ve olmamalı .Θ(n2)Θ(n3)

Bu kadar basit bir kodla, ve arasındaki farkın görülmesi zor olmamalıdır ve birçok pratik durumda bu, kamburluğu kontrol etmek veya beklentileri ayarlamak için yararlı bir yaklaşımdır.Θ(n2)Θ(n3)


@Raphael uydurma, zaten sorunuza yanıt, ama sadece eğlence için bu programın çıktı kullanarak bu gnuplot komut üs değerlerini rapor ve aşağıdaki araziler ve üretilen ( İlki normal ölçek, ikincisi log-log ölçeğidir):f(x)=axb+cx2.997961668332222.99223727692339

normal loglog

Umarım bu yardımcı olur¨


2
Herhangi bir işlevi bu değerlere sığdırabilirsiniz. Ayrıca buraya bakınız .
Raphael

3
@Raphael Bu şekilde nitpick yapmak istemezseniz, hayır, herhangi bir işleve sığamazsınız (örneğin, herhangi bir makul doğrulukta sabit bir işleve sığamayacaksınız). Bu bir kanıt değil, ancak eskiz sağlayan bir cevap zaten var. Yararlılık ile ilgili olarak, kendi bağladığınızı söyleyebiliyorum: "Bunun, bazen kullanılmakta olan çok yararlı bir yaklaşım olduğuna katılıyorum". Üstelik, OP o gerektiğini düşündüğünü söyledi ziyade , neden deneme ve onun önsezi doğru olup olmadığını görmek için değil? Devam. Θ(n2)Θ(n3)
dtldarek

2
Bu, algoritmanın olduğuna dair kanıt sağlar, ancak soru nedenini sorar . Fenomen hakkında bir açıklama istiyor, bunun bir onayı değil. Θ(n3)
David Richerby

2
@DavidRicherby Bu, bu cevabın faydalı olmadığı anlamına mı geliyor?
dtldarek

3
@Magicsowon Bu bir soru ve cevap sitesi, forum değil. Sorunun cevabını arıyoruz, tartışmayı değil.
David Richerby

3

Bir dizinin olduğunu varsayalım.

array a[10] = {10,8,9,6,7,4,5,2,3,0,1}

Algoritmanız aşağıdakileri yapar

Scan(1) - Swap (10,8) => {8,10,9,6,7,4,5,2,3,0,1}  //keep looking at "10"
Scan(2) - Swap (10,9) => {8,9,10,6,7,4,5,2,3,0,1}
...
Scan(10) - Swap(10,1) => {8,9,6,7,4,5,2,3,0,1,10}

Temelde en yüksek eleman dizinin sonuna doğru hareket eder ve bunu yaparken her taramada etkin bir şekilde O(n^2)hareket ederek baştan başlar . Sadece bir eleman için. Ancak, n elementleri vardır, bu yüzden bu nkez tekrarlamamız gerekecek . Bu resmi bir kanıt değil, ancak çalışma süresinin neden "biçimsiz" bir şekilde anlaşılmasına yardımcı oluyor O(n^3).


4
Bu, diğer cevaplara ne ekler? Algoritma ne yaptığını bir açıklama zaten verildi ve çalışma zamanı için gerekçeniz en iyi şekilde kabataslak. (Kötü durum yok değil doğrusal olarak davranırlar!)
Raphael

2
Bazen, özellikle soruyu soran kişi alan için yeni olduğunda, aynı fikri çeşitli şekillerde (formalizmle; "sezgiyi pompalamaya basit bir örnekle") açıklamada değer vardır. Bana öyle geliyor ki, sezgiye yardımcı olabilecek bir şekilde sunuluyor.
DW

Yorumumu bir bayrak olarak cevapladığımdan beri (bunu yapmayın!): "En kötü durum lineer davranmaz!" - En kötü durum operatörünün cebirsel özelliklerini kastediyorum. Kabaca konuşursak, WorstCase (1 + ... + n) "=" WorstCase (1) + ... + WorstCase (n) kullanıyorsunuz, ancak bu kimlik geçerli değil.
Raphael

1
Bu alanda yeniyim ve somut, açıklanmış bir örnekle bir açıklama yaparak kesinlikle sorun hakkında sezgiler edinmeme yardımcı oldu. Şimdi kabul edilen çözüm bana daha mantıklı geliyor.
vaer-k

0

Mantık, dizideki öğeleri artan bir düzende sıralamak gibi görünüyor.

En küçük sayının dizinin sonunda olduğunu varsayalım (a [n]). Doğru yere gelmesi için - (n + (n-1) + (n-2) + ... 3 + 2 + 1) işlemleri gereklidir. = 0 (n2).

Dizideki tek bir eleman için O (n2) ops gerekir. Öyleyse, öğleden sonraları O (n3).


5
Bu, diğer cevaplara ne ekler? Algoritma ne yaptığını bir açıklama zaten verildi ve çalışma zamanı için gerekçeniz en iyi şekilde kabataslak. (Kötü durum yok değil doğrusal olarak davranırlar!)
Raphael

Harika bir açıklama. Bu, diğer cevaplarda açıklanmayan, sorun hakkında farklı, daha sezgisel bir bakış açısı sağlar. (Çok kısa ve anlaşılması kolay değil.)
2501

1
@ 2501 Hayır, yanlış. Dijkstra'nın algoritmasında bu "sezgiyi" kullanmayı denediğinizde, yanlış olan ikinci dereceden çalışma zamanı (düğüm sayısında) elde edersiniz.
Raphael

@Raphael Hayır, cevapta açıklandığı gibi doğru. Bu açıklama, bu algoritma için işe yarar, diğerleri için değil. Onlar için yanlış olsa da, bu iddia bunun yanlış olduğunu kanıtlamaz.
2501

@Raphael Kabul edilen cevabın açıklamasını anlamadım. Bu yüzden, bunu çözdüm ve teknik terimler olmadan basit terimlerle açıklamaya çalıştım .. bu yüzden, benim gibi kabul edilen cevabı anlamayan üyeler içindir .. Birisinin bunu faydalı bulduğu için memnunum.
mk ..
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.