Çok merak ediyorum, sıralama algoritmalarında kararlılık neden önemli değil?
IBM (Insertion, Bubble, Merge)
Çok merak ediyorum, sıralama algoritmalarında kararlılık neden önemli değil?
IBM (Insertion, Bubble, Merge)
Yanıtlar:
Eşit anahtarlı iki nesne, sıralanacak çıktıda sıralanacak giriş dizisinde göründükleri sırayla görünüyorsa, bir sıralama algoritmasının kararlı olduğu söylenir . Bazı sıralama algoritmaları Ekleme sıralaması, Birleştirme Sıralaması, Kabarcık Sıralaması vb.Gibi doğaya göre kararlıdır.
Arka plan : "kararlı" bir sıralama algoritması, aynı sıralama anahtarına sahip öğeleri sırayla tutar. 5 harfli kelimelerin bir listemiz olduğunu varsayalım:
peach
straw
apple
spork
Listeyi her kelimenin sadece ilk harfine göre sıralarsak, kararlı bir sıralama üretilir:
apple
peach
straw
spork
Bir in kararsız sıralama algoritması straw
ya da spork
yer değiştirebilir, ancak (çünkü kararlı bir biri, aynı göreceli pozisyonda kalmak straw
önce görüntülenene spork
girişi, aynı zamanda daha önce görüntülenen spork
çıkış).
Bu algoritmayı kullanarak sözcük listesini sıralayabiliriz: sütun 5'e göre kararlı sıralama, sonra 4, sonra 3, sonra 2, sonra 1. Sonunda, doğru bir şekilde sıralanacaktır. Kendinizi buna ikna edin. (bu arada, bu algoritmaya radix sıralama denir)
Şimdi sorunuzu cevaplamak için, ad ve soyadların bir listesine sahip olduğumuzu varsayalım. "Soyadına göre, sonra adıyla" sıralamamız istenir. Önce ilk ada göre (kararlı veya kararsız), ardından soyadına göre kararlı sıralama yapabiliriz. Bu türden sonra, liste öncelikle soyadına göre sıralanır. Ancak, soyadlarının aynı olduğu yerlerde, ilk adlar sıralanır.
Kararsız türleri aynı şekilde istifleyemezsiniz.
straw
ve spork
eşit karşılaştırın. Kararlı sıralama giriş sırasını korurken, kararsız sıralama bu garantiyi vermez. "Doğru", uygulamaya bağlıdır. Çoğu programlama dilinde sıralama işlevi, kullanıcının özel bir sipariş işlevi sağlamasına olanak tanır. Kullanıcının işlevi farklı öğeleri eşit olarak ele alırsa (örneğin, aynı ad, farklı soyadı), orijinal siparişin korunup korunmayacağını bilmenize yardımcı olur. Gerçek dünya örneği için OCaml'ın dizi sıralama işlevlerine bakın .
Kararlı bir sıralama algoritması , özdeş elemanları girişte göründükleri sırayla sıralayan algoritmadır , ancak kararsız sıralama durumu tatmin etmeyebilir . - Algoritma öğretim üyem Didem Gözupek'e algoritmalarla ilgili bilgi verdikleri için teşekkür ederim .
Kararlı Sıralama Algoritmaları:
Kararsız Sıralama Algoritmaları:
Sıralama kararlılığı, aynı tuşa sahip kayıtların sıralamadan önce ve sonra göreli sıralarını koruyacağı anlamına gelir.
Dolayısıyla, yalnızca ve çözdüğünüz sorunun bu göreceli düzenin korunmasını gerektirmesi durumunda istikrar önemlidir.
İstikrara ihtiyacınız yoksa, yığın veya hızlı sıralama gibi bir kitaplıktan hızlı, bellek yudumlama algoritması kullanabilir ve unutabilirsiniz.
İstikrara ihtiyacınız varsa, daha karmaşıktır. Kararlı algoritmalar, kararsız algoritmalardan daha yüksek big-O CPU ve / veya bellek kullanımına sahiptir. Bu nedenle, büyük bir veri kümeniz olduğunda, CPU'yu veya belleği yenmek arasında seçim yapmanız gerekir. Hem CPU hem de bellekle kısıtlıysanız, bir sorununuz var demektir. İyi bir uzlaşma kararlı algoritması ikili bir ağaç türüdür; Wikipedia makalesi STL dayalı acınacak kolay C ++ uygulaması vardır.
Her kayıt için son yer anahtarı olarak orijinal kayıt numarasını ekleyerek sabit bir algoritmaya istikrarsız bir algoritma yapabilirsiniz.
Ne yaptığınıza bağlı.
Bazılarının adınız ve soyadınız alanı olan kayıtlarınız olduğunu düşünün. Önce listeyi ada göre sıralarsınız. Daha sonra listeyi soyadına göre kararlı bir algoritma ile sıralarsanız, ad ve soyadına göre sıralanmış bir listeniz olur.
İstikrarın önemli olmasının birkaç nedeni vardır. Birincisi, iki kaydın değiştirilerek değiştirilmesi gerekmiyorsa, bellek güncellemesine neden olabilirsiniz, bir sayfa kirli olarak işaretlenir ve diske (veya başka bir yavaş ortama) yeniden yazılması gerekir.
Eşit anahtarlı iki nesne, sıralanmamış çıktıda sıralanmamış girişte göründükleri sırayla görünüyorsa, bir sıralama algoritmasının kararlı olduğu söylenir. Bazı sıralama algoritmaları Ekleme sıralaması, Birleştirme Sıralaması, Kabarcık Sıralaması vb.Gibi doğaya göre kararlıdır.
Bununla birlikte, kararlı olmayan herhangi bir ayırma algo, kararlı olacak şekilde değiştirilebilir. İstikrarlı hale getirmek için algo'ya özgü yollar sıralanabilir, ancak genel olarak, doğası gereği stabil olmayan herhangi bir karşılaştırma tabanlı sıralama algoritması, anahtar karşılaştırma işlemini değiştirerek kararlı olacak şekilde değiştirilebilir, böylece iki anahtarın karşılaştırması konumu eşit anahtarlı nesneler için faktör.
Kaynaklar: http://www.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf http://en.wikipedia.org/wiki/Sorting_algorithm#Stability
Bunun için birçok cevaplar var biliyorum, ama bana göre, bu cevabı ile Robert Harvey , çok daha net bir şekilde özetlenmiştir:
Sabit bir sıralama, [kararsız] algoritmanın iki veya daha fazla öğe arasında ayrım yapmadığı giriş kümesinin orijinal sırasını koruyan sıralamadır.
Sıraladığınız şeyin sadece sayılar olduğunu varsayarsanız ve yalnızca değerleri onları tanımlar / ayırt eder (örneğin, aynı değere sahip öğeler özdeştir), o zaman sıralama kararlılığı sorunu anlamsızdır.
Bununla birlikte, sıralamada aynı önceliğe sahip nesneler farklı olabilir ve bazen göreceli sıralamaları anlamlı bilgilerdir. Bu durumda, kararsız sıralama problem yaratır.
Örneğin, bir oyundaki Seviye [L] ile bir labirenti temizlemek için tüm oyuncuların zaman maliyetini [T] içeren bir veri listeniz vardır. Labirentleri ne kadar hızlı temizlediklerine göre oyuncuları sıralamamız gerektiğini varsayalım. Bununla birlikte, ek bir kural geçerlidir: labirenti daha yüksek seviyeyle temizleyen oyuncular, zaman maliyeti ne olursa olsun, her zaman daha yüksek bir seviyeye sahiptir.
Elbette kurallara uyan bir algoritma ile eşleştirilmiş değeri [T, L] gerçek bir sayıya [R] eşlemeye çalışabilir ve ardından tüm oyuncuları [R] değeriyle sıralayabilirsiniz.
Bununla birlikte, kararlı sıralama mümkün ise, tüm listeyi [T] (önce daha hızlı oyuncular) ve ardından [L] ile sıralayabilirsiniz. Bu durumda, oyuncuların göreceli sırası (zaman maliyetine göre), temizledikleri labirent seviyesine göre gruplandırıldıktan sonra değişmeyecektir.
Not: Tabii ki iki kez sıralama yaklaşımı belirli bir soruna en iyi çözüm değildir, ancak poster sorununu açıklamak yeterli olacaktır.
Kararlı sıralama her zaman aynı girdiyi (permütasyon) aynı girdiye döndürür.
Örneğin, [2,1,2], permütasyon [2,1,3] olarak kararlı sıralama kullanılarak sıralanacaktır (önce dizin 2, sonra dizin 1 sonra sıralı çıktıdaki dizin 3) Bu, çıktının her zaman aynı şekilde karıştırıldığı anlamına gelir. Diğer kararlı olmayan, ancak yine de doğru permütasyon [2,3,1] 'dir.
Hızlı sıralama kararlı değildir ve aynı elemanlar arasındaki permütasyon farklılıkları, pivot toplama algoritmasına bağlıdır. Bazı uygulamalar rastgele alınır ve aynı algoritmayı kullanarak aynı girdi üzerinde farklı permütasyonlar elde ederek hızlı sıralama yapabilir.
Kararlı sıralama algoritması deterministiktir.
sort([(5,3),(1,5),(3,3),(1,3)], x) => [(1,5),(1,3),(3,3),(5,3)]
. Her zaman (determinist olarak) çıktı veren deterministik bir sıralama yapabilirim: [(1,3),(1,5),(3,3),(5,3)]
ama bu istikrarlı bir sıralama değil.
İstikrarlı türler isteme nedeninin bazı örnekleri. Veritabanları yaygın bir örnektir. Soyad | ad, tarih | satın alma zamanı, ürün numarası ve fiyatı içeren bir işlem veri tabanını ele alalım. Veri tabanının normalde tarihe | saate göre sıralandığını varsayalım. Daha sonra, sorgu karşılaştırması yalnızca soyadı | ilk adı içermesine rağmen, kararlı bir sıralama orijinal siparişi koruduğundan, veri tabanının soyadına göre sıralanmış bir kopyasını yapmak için bir sorgu yapılır. verinin zamanında olması.
Benzer bir örnek, bir kerede 3 sütunla sınırlanan klasik Excel'dir. 6 sütunu sıralamak için, en az anlamlı 3 sütuna sahip bir sıralama ve ardından en önemli 3 sütuna sahip bir sıralama yapılır.
Kararlı sayı tabanı sıralamasının klasik bir örneği, temel 10 sayısal sütun alanına göre sıralamak için kullanılan bir kart sıralayıcısıdır. Kartlar en az anlamlı basamaktan en anlamlı basamağa doğru sıralanır. Her geçişte bir kart destesi okunur ve o sütundaki rakama göre 10 farklı kutuya ayrılır. Ardından 10 kutu kart sırayla giriş hunisine geri konur (önce "0" kart, en son "9" kart). Ardından, tüm sütunlar sıralanana kadar bir sonraki sütun tarafından başka bir geçiş yapılır. Bir kartta 12 bölge olduğundan, bir sütun boş olabileceğinden ve yanlış okunan bir bölme olduğundan, gerçek kart sıralayıcılarının 10'dan fazla bölmesi vardır. Harfleri sıralamak için sütun başına 2 geçiş, basamak için 1. geçiş, 12 11 bölgesi için 2. geçiş gereklidir.
Daha sonra (1937) alanları karşılaştırarak iki deste kartı birleştirebilen kart harmanlama (birleştirme) makineleri vardı. Giriş, iki sıralı kart destesiydi, bir ana deste ve bir güncelleme destesi. Koordinatör, iki desteyi yeni bir materyal kutusu ve bir arşiv kutusu olarak birleştirdi, bu da master kopyalar için isteğe bağlı olarak kullanıldı, böylece yeni master bin sadece kopyalar halinde güncelleme kartlarına sahip olacaktı. Bu muhtemelen orijinal (aşağıdan yukarıya) birleştirme sıralamasının arkasındaki fikrin temeliydi.