Sıralama algoritmalarında kararlılık nedir ve neden önemlidir?


292

Çok merak ediyorum, sıralama algoritmalarında kararlılık neden önemli değil?


2
Paralelleştirme amacıyla? örneğin: birleştirme sıralaması sabittir ve iyi paralelleştirilebilir ve aynı zamanda hızlı sıralamadır.
DarthVader

13
Klasik QuickSort kararsız
Konstantin Spirin

9
istikrarlı sıralama algo -IBM (Insertion, Bubble, Merge)
roottraveller

Benim gibi kavramı yanlış anlayabilenler için bir not: Eşit unsurların sırasının korunması garanti edilir. şu anlama gelir: eğer kararlı türdeki elemanlar eşit kabul edilirse, bir önceki sıralamayı takip ederlerdi. Eskiden düşündüğüm şey bu değildi : eğer önceki sıradaki elemanlar eşit kabul edilirse, o zaman gelen istikrarlı sıralamada, önceki sıralamayı takip ederlerdi. Her ne kadar ikinci anlayışı bulabilirseniz de birçok durumda mantıklıdır.
Rick

Yanıtlar:


371

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ı strawya da sporkyer değiştirebilir, ancak (çünkü kararlı bir biri, aynı göreceli pozisyonda kalmak strawönce görüntülenene sporkgiriş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.


Peki, elma şeftali sporu samanının kelimeleri doğru sıralamada sıralamak için nasıl denir? Istikrarlı sıralama bize elma şeftali saman spork verdi ancak st sp (alfabetik olarak doğru) sonra olmalıdır, bu yüzden nihai doğru sıralama elma şeftali spor saman olmalıdır
user1416486

2
@ user1416486: Yalnızca ilk harfe göre sıralıyoruz. Bu varsayımla, strawve sporkeş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 .
Joey Adams

3
Satırı anlamıyorum ..same sorting key ? Burada anahtarla ne demek istiyorsun? Lütfen açıklamayı açıklayın ..same sorting key
saplingPro

2
@saplingPro: "sıralama anahtarı" ile, öğeleri sıraladığınız şey demek istiyorum. Yani ilk harfe göre sıralama yaparken, her bir öğe için "sıralama anahtarı" ilk harfidir.
Joey Adams

12
Örnek - Her öğenin uçuşun varış noktası ve kalkış saati hakkında bilgi içeren bir listeniz olduğunu varsayalım. Önce listeyi zamana göre sıralarsınız. Ardından hedefe göre sıralarız. İkinci sıralama sabitse , artık tüm uçuşlar aynı hedefe ve kalkış saatinin artan sırasına bağlı. İstikrarlı olmasaydı, artan zaman düzeninde olmazlardı.
roottraveller

55

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ı:

  • Ekleme Sıralaması
  • Sıralamayı Birleştir
  • Kabarcık Sırala
  • Tim Sıralaması
  • Sayma Sıralaması
  • Blok Sıralama
  • Quadsort
  • Kütüphane Sıralaması
  • Kokteyl çalkalayıcı Sırala
  • GNOME Sıralama
  • Tek-çift Sıralama

Kararsız Sıralama Algoritmaları:

  • Öbek sıralaması
  • Seçim sıralaması
  • Kabuk sıralaması
  • Hızlı sıralama
  • Introsort (Quicksort'a tabi)
  • Ağaç sıralaması
  • Döngü sıralaması
  • rahat sıralama
  • Turnuva sıralaması (Hesapsort'a tabi)

resim açıklamasını buraya girin


2
Değerleriniz eşit değil. 9,7 ve 9,8'i karşılaştırıyorsunuz, ancak kararlılık kontrolüne göre hem 9,7 hem de 9,8 gibi aynı değerlere ihtiyacınız var. Ve istikrarlı algoritmalarda aynı değerler aynı şekilde sıralanmalıdır.
erhun

1
Hayır, kararlılığı kontrol etmek için değerleriniz aynı olmalıdır. İki 9,7 kullandığınızı ve A düğümü ve B düğümü olarak adlandırdığınızı varsayalım. Her sıralama işlemi sırası A gibi ise (B yerine eşittir) sıralama algoritmasının kararlı olduğunu (birleştirme sıralaması gibi) anlayın. Sıralama onları birden çok kez (. 1, sonra B, A yine A, B vb B A sıralamak) ne zaman A ise B sırası değişimdir, sıralama algoritması (hızlı sıralama gibi) @snr kararsız olduğunu anlıyoruz
Erhun

@snr [9, 6], Giriş Dizisinde mevcut değil. Sanırım son dizi şeridinde [9, 8] demek istediniz.
Usman

4
@erhun Bence sadece ilk sayıya göre (virgülden önceki) sıralıyor ve ikinci sayıyı sizin için bir referans olarak kullanarak ilk 9'un ikinci 9'dan farklı olduğunu görüyorsunuz.
Tiago

20

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.


1
Merge Sort gibi kararlı algoritmalar Quicksort ile aynı O (NlogN) karmaşıklığına sahiptir; yine de çabanın sürekli çarpanı daha büyük.
Jonathan Leffler

Evet ve Birleştirme Sıralamasında bellek kullanımı O (N), Quicksort'ta ise O (günlük N). Quicksort'tan bahsetmemin nedeni, qsort () 'un bir C standart kütüphane rutini olması, bu yüzden gerçekten mevcut olmasıdır.
Bob Murphy

1
En iyi genel cevap IMHO. diğerlerinde bahsedilen çok-tuşlu teknik ilginçtir ama abartılmıştır; uygulanması kolaydır, ancak bariz alternatiflerden çok daha yavaş olma eğilimindedir (çok tuşlu karşılaştırmayla bir sıralama kullanın; veya ilk anahtara göre sıralayın ve ardından yinelenen alt listeleri tanımlayın ve sıralayın). Kararlı sıralamanın tahmin edilebilir bir sonuç üretmesi bazı uygulamalarda önemli olabilir. Özellikle, B listesi dışında özdeş olan iki A, B giriş listeniz varsa, kararlı bir sıralama için çıkışlar, B'nin aynı ek girişe sahip olması dışında aynı olacaktır. Ve son pgph için +1.
greggo

16

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.


4
Bence "soyad VE verilen ad" demek istiyorsun. Soyadı genellikle soyadıdır.
Bacon Bits

14

İ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.


Kayıt değiştirmenin kararlılıkla ne ilgisi var?
user1683793

4

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


3

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.

Kaynak


1

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.


0

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.


2
İstikrarın anlamı bu değil. Bkz. En.wikipedia.org/wiki/Sorting_algorithm#Stability
Luís Oliveira

Istikrarlı olmayan sıralama aynı uygulama arasında bile farklı çözüm üretebilir daha cümle düzeltmek gerekir, herhangi bir kararlı sıralama aynı çözüm çıktı.
Luka Rahne

1
Neden -1? Birisi burada neyin yanlış olduğunu söyleyebilir mi? Bu kararlı bir sıralama değil, istikrarlı bir sıralamadır.
Luka Rahne

Sıralamanın deterministik olup olmadığı kararlı olup olmadığını belirlemez. Farklı bir bağlantı koparma davranışı tanımlayarak kararlı olmayan bir deterministik sıralama algoritması yazabilirim (örneğin anahtar olmayan parçaları alt gruplara ayırarak). Kararlı sıralama özellikle, bağlar sıralandığında elemanların önceden sıralanan göreceli sırasının korunduğunu gösterir. sabit bir çeşit bir çıkışının örnek: 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.
cowbert

@cowbert Her istikrarlı türün sahip olduğu güzel mülkiyet hakkında daha fazla ifade. Bu, cadı kararlı sıralama algoritması veya uygulaması ne olursa olsun, her seferinde aynı sonuç olacaktır. Farklı istikrarlı olmayan uygulamalar arasında bu özelliği korumak daha zordur.
Luka Rahne

0

İ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.

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.