En kötü durumda


35

Yerinde kararlı sıralama algoritması en kötü durumda veren iyi kaynakları bulmakta sorun yaşıyorum . Herhangi bir iyi kaynak bilen var mı?O(nlnn)

Sadece bir hatırlatıcı, yerinde iletilen diziyi kullandığı ve sıralama algoritmasına yalnızca sabit fazladan boşluk kullanabileceği anlamına gelir. Kararlı, aynı tuşa sahip öğelerin, orijinal dizideki sıralı dizide aynı sırada görünmesi anlamına gelir.

Örneğin, saf birleştirme sıralama en kötü durumda ve kararlıdır ancak O ( n ) fazladan boşluk kullanır . Standart hızlı bağlantı sabit yapılabilir, yerindedir ancak en kötü durumda O ( n 2 ) . Heapsort yerde, en kötü durumda olan Ç ( n ln n ) ama istikrarlı değil. Wikipedia'da hangi sıralama algoritmalarının hangi dezavantajları olduğu hoş bir grafik var. Üç stabilite koşulunun hepsine de sahip oldukları listeledikleri bir sıralama algoritması bulunmadığına dikkat edin, en kötü durum O ( n ln nO(nlnn)O(n)O(n2)O(nlnn) ve yerinde olmak.O(nlnn)

Adı verilen bir kağıt bulduk "Pratik yerinde mergesort" en kötü durum için istemler Katajainen, Pasanen ve Teuhola göre, yer sabit mergesort varyantta. Sonuçlarını doğru anlarsam, ilk önce tekrarlayan bir şekilde (aşağıdan yukarıya?) Mergesort kullanırlar 1O(nlnn)Dizinin 4 ve ikincisi114Dizinin 2 ve ikincisini kullanın112 birleştirme yapmak için kazı kazan alanı olarak. Bu konuyu hala okuyorum, bu yüzden sonuçlarını doğru yorumlayıp yorumlamadığımı öğreniyorum.14

Ayrıca yerinde sabit hızlı bağlantı noktasının en kötü durumuyla da çok ilgilenirdim . Anladığım kadarıyla, hızlı bağlantı noktasını en kötü durum O ( n ln n ) olarak değiştirmek , aksi takdirde normalde alacağı dengeyi bozacak uygun bir pivot seçilmesini gerektirir .O(nlnn)O(nlnn)

Bu tamamen teorik ilgi alanıdır ve pratik bir uygulamam yok. Bu özelliklerin üçüne de sahip olan algoritmayı bilmek istiyorum.


SO benzer bir soru var burada söz verilen referans I verir bir cevap. Daha fazla açıklama, daha fazla literatür ve şans ile algoritmanın açıklamasını istediğim için bunun yinelenen bir soru olmadığını düşünüyorum.
user834

1
Bkz bu soruyu math.stackexchange.com üzerinde.
Tsuyoshi Ito

QuickSort'ta bir pivot seçmenin farklı yolu neden dengesini bozuyor?
svick

O(nlnn)

@TsuyoshiIto, bunu bir cevap olarak düşünün. Ayrıca, algoritmanın kısa bir taslağını verebilirseniz, bunun da gerçekten yardımcı olacağını düşünüyorum.
user834

Yanıtlar:


6

Yukarıdakilerin tümü olan birkaç algoritma vardır ve bunların çoğu son 30 yılda icat edilmiştir.

Muhtemelen en iyisi, 2008 yılında Kim ve Kutzner'ın (WikiSort olarak da adlandırılan) versiyonunu da içeren Block sort adlı algoritmaların sınıfıdır. Ayrıca uyarlanabilir ve bu nedenle, daha önce sıralanan listelerde sıralamak için O (n) karşılaştırmalarına yakınsayarak neredeyse sıralanan listeleri sıralamak için daha az adım atar. C, C ++ ve Java'da bir uygulamayı burada bulabilirsiniz: https://github.com/BonzaiThePenguin/WikiSort

Ayrıca ilgi çekici olan, GrailSort algoritması (ayrıca bir Block sort) Huang ve Langston (1989-1992), aslında WikiSort'u birkaç test durumu türünden daha iyi performans gösteriyor. Burada bir C ++ uygulaması mevcuttur: https://github.com/Mrrl/GrailSort


8

Yerinde, sağlam bir birleştirme noktası yazabilirsiniz. Bkz bu detaylar için. Yazarın kendi sözleriyle:

Yerinde güzel bir birleştirme algoritması. Rotasyonların nasıl çalıştığını anlamak için ters dizilerde test edin. Yerinde bilinen en hızlı kararlı sıralama. Bir yığını patlatma riski yoktur. Maliyet: nispeten yüksek sayıda hamle. Yığın hala pahalı olabilir. Bu, alt dizileri 'döndüren' akıllı yerinde birleştirme özelliğine sahip bir birleştirme türüdür. Bu kod litterally C ++ stl kütüphanesinden kopyalanır ve Java'ya çevrilir.

Buradaki kodu kopyalamam, ancak bağlantıda veya C ++ STL'yi kontrol ederek bulabilirsiniz. Lütfen burada neler olup bittiğiyle ilgili daha ayrıntılı bir açıklama yapmamı istersem bana bildirin.


8
O(lnn)O(1)O(lnn)

Knuth bunu TAoCP'de de ele alıyor.
Raphael

O(nln2n)

1

Lütfen bunu bazı pratik düşünceler üzerine uzun bir yorum olarak kabul edin. Bu, sorunuza bir cevap olmasa da, bu Python tartışmasına ilgi duyabileceğinizi düşünüyorum:

lg(N!)N1

[...]

Bitişik uzunluktaki A ve B uzunluklarını yerinde birleştirmek çok zordur . Bunu yapabilen teorik yapılar bilinmektedir, ancak pratik kullanım için çok zor ve yavaştır . Ancak min (A, B) 'ye eşit sıcaklık belleğine sahipsek kolay olur.

Kaynak: bugs.python.org , yazar: Tim Peters

O(nlogn)

Ayrıca Timsort'un önceden sıralanmış dizilerde iyi performans gösterdiğine dikkat edin.

Böylece Python Timsort'tan faydalanır (bazı tweaks'lerle Mergesort'tur) ve birkaç yıl önce Java uygulamasına baktığımda, aynı zamanda Mergesort'du (Sanırım artık Timsort'u kullanıyorlar).

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.