Bir sıralama algoritması için geçirgenlik gerekli mi


14

Geçişli olmayan bir karşılaştırma ile bir sıralama algoritması kullanmak mümkün mü ve eğer evetse, geçişlilik neden karşılaştırıcıları sıralamak için bir gereklilik olarak listeleniyor?

Arka fon:

  • Bir sıralama algoritması genellikle bir listenin elemanlarını bir karşılaştırma fonksiyonuna (C (x, y)) göre,

    C(x,y)={1if xy0if xy+1if xy

    Bu karşılaştırıcı için gereksinimleri, anladığım kadarıyla:

    • dönüşlü: x:C(x,x)=0
    • antisimetrik: x,y:C(x,y)=C(y,x)
    • geçişli: x,y,z,a:C(x,y)=aC(y,z)=aC(x,z)=a
    • C (x, y) tüm x ve y için tanımlanır ve sonuçlar sadece x ve y'ye bağlıdır

    (Bu gereksinimler her zaman farklı uygulamalar arasında farklı şekilde listelenir, bu yüzden bunları doğru yaptığımdan emin değilim)

|xy|1

C(x,y)={1if x<y10if |xy|1+1if x>y+1

[ 1, 2, 3, 4, 5][1, 4, 3, 2, 5]C(x,y)0
[1, 4, 2, 3, 5]

Bu toleranslı karşılaştırıcı refleksif ve antisimetriktir, ancak geçişli değildir.

yani C (1,2) = 0, c (2,3) = 0, ancak C (1,3) = -1, geçişliliği ihlal ediyor

Yine de, bu karşılaştırıcı ve rastgele bir liste verildiğinde bir "doğru sıralanmış" çıktı üretmek başarısız olur herhangi bir sıralama algoritması düşünemiyorum.

Bu nedenle, bu durumda geçiş gerekli değildir mi? Ve geçişlilik daha az sıkı bir sürümü var olan çalışmalara sıralama için gerekli?

İlgili sorular:


Ben pivot bu karşılaştırıcı kullanarak [3, 2, 1] için "her zaman orta seçin" ile quicksort başarısız olacağını düşünüyorum.
G. Bach

2
Bazı sıralama algoritmasında kullanılan bazı geçişsiz karşılaştırıcıların sonsuz döngüye neden olabileceğinden şüpheleniyorum.
Karolis Juodelė

1
aiai+1aiajij

Eğer diziniz n kere 3, bir kez 2, n kez 1 ve orta 2 ilk pivot olarak kullanılırsa, quicksort aslında tamamen başarısız olacağını düşünüyorum, daha sonra ne olursa olsun.
gnasher729

Yanıtlar:


12

Siz istediniz: Geçişsiz bir karşılaştırıcıyı besleyerek bir sıralama algoritması çalıştırabilir miyiz?

Cevap: Tabii ki. Herhangi bir algoritmayı herhangi bir girişle çalıştırabilirsiniz.

Ancak, kuralı biliyorsunuz: Garbage In, Garbage Out. Geçişli olmayan bir karşılaştırıcıyla bir sıralama algoritması çalıştırırsanız, saçma çıktı alabilirsiniz. Özellikle, çıktının karşılaştırıcınıza göre "sıralanacağı" garantisi yoktur. Bu nedenle, geçişsiz bir karşılaştırıcıyla bir sıralama algoritması çalıştırmanın muhtemelen umduğunuz şekilde yararlı olması muhtemel değildir.

[3,2,1]


1
ilk düşüncem listesi [3,2,1] olmasıydı olduğu kadar tabii ki çeşit gibi bırakılmasını gerektiğini, benim karşılaştırıcıya göre sıralanmış sırayla; ama ben sıralamanın yanlış tanımını kullanıyor olabilirdim. Her bir elemanı doğrudan komşularıyla karşılaştırıyorum, ancak sıralı bir listeyi düşünmek için çok zayıf bir kısıtlama olabilir
HugoRune

4
@HugoRune Bu ilginç bir nokta. Ne yapmak sen demek sıralanmış ? Eğer bir sıralama algoritması olmayan bir geçişli karşılaştırıcı verilen ve sonlandırır gösterirsen o algoritma sonlandığı bazı koşul doğru olduğunda, ve bu koşul sonra algoritma olacağı tabii ... olmaya sıralama almakta ne zaman sıralamak listenizi her zaman, o tanımı için sortedness . Karşılaştırıcı geçişli değilse , sıralı listedeki tüm öğelerin çift karşılaştırılmasını gerektiren sıralı bir tanım almak anlamlı olmayabilir .
Patrick87

3
@HugoRune, "sadece komşular karşılaştırılır" ile muhtemelen özel bir türe ihtiyacınız olacak. Standart algoritmalar, gereksiz karşılaştırmaları önlemek için geçişliliği varsayar. Veya geçişsiz siparişinizi geçişli bir siparişe gömebilirsiniz. Ya da belki topolojik tasnif çizgileri boyunca bir şey mi arıyorsunuz?
vonbrand

Bu bir süre önce koştum ve kabarcık türünün gerçekten iyi çalıştığını gördüm, çünkü sadece bitişik unsurları karşılaştırıyor.
Mooing Duck

4

Bir dizi eleman ve bir ikili sıralama ilişkisi göz önüne alındığında, elemanları tamamen sipariş etmek için geçiş gerekir. Aslında, elemanlar üzerinde kısmi bir düzen tanımlamak için geçişlilik bile gereklidir. http://en.m.wikipedia.org/wiki/Total_order

Geçiş olmadan öğeleri sıralamak için "sıralanan" ne anlama geldiğinin çok daha geniş bir tanımına ihtiyacınız olacaktır. Kendi kendine tutarlı olmak zor. Başka bir cevap "Özellikle, çıktının karşılaştırıcıya göre 'sıralanacağına dair bir garanti yoktur." Ama aslında çok daha güçlü bir şey söyleyebiliriz. Sen edilir garantili çıkış olduğunu sıralanır senin karşılaştırıcıya göre.

a<bb<cc<a


1
Soruyu, kısmi sıralamalar kullanarak sıralama hakkında sormak üzere yorumladım (öyle ki, şeylerin eşit olmadığını söyleyen karşılaştırmalar geçişlidir, ancak öğeleri ayırt edilemeyenleri ayırt edemez). Kısmi sıralamaya göre sıralama bazen yararlıdır, ancak en kötü durumda N (N-1) / 2 karşılaştırmaları gerektirir. En kötü durumda N (N-1) / 2 karşılaştırmasından daha az olan herhangi bir sıralama algoritması, cevabımda açıklanan nedenlerden dolayı kısmen sıralı öğeleri doğru bir şekilde sıralayamayacaktır.
supercat

2

İstediğiniz şey, tüm ayırt edilebilir sıralamaların doğru olacağı şekilde öğeleri düzenlemek gibi görünüyor, ancak yakın olan öğeler "ayırt edilemez" olarak kabul edilebilir. Bu tür karşılaştırmalar ile çalışacak sıralama algoritmaları tasarlamak mümkündür, ancak işlerin ayırt edilemez olduğunu bildiren kaç karşılaştırmanın sınırları olmadığı sürece, N (N-1) / 2 karşılaştırmaları gerektirmekten kaçınmanın bir yolu yoktur. Nedenini anlamak için bir miktar N ve N (N-1) / 2'den daha az karşılaştırma yapan herhangi bir sıralama algoritması seçin. Daha sonra L [0..N-1] listesini doldurun, her bir elemanı L [I] I / N olarak ayarlayın ve karşılaştırıcıyı kullanarak "sıralayın" (minimum değer 0 ve maksimum (N-1) / N olacaktır) , bu nedenle fark (N-1) / N olacaktır, bu da 1'den küçüktür).

Karşılaştırılabilecek N (N-1) / 2 çift öğe olduğu ve sıralama bu kadar fazla karşılaştırma yapmadığı için, doğrudan birbirleriyle karşılaştırılmayan bazı öğeler olmalıdır. Bunlardan birinin hangisi önce 1, diğeri -1 / N ile sıralanmışsa değiştirin, tüm öğeleri başlangıç ​​konumlarına döndürün ve sıralama işlemini tekrarlayın. Her bir karşılaştırma işlemi, ilk kez olduğu gibi sıfır verir, böylece aynı karşılaştırmalar yapılır ve öğeler aynı sırayla sonuçlanır. Listenin doğru bir şekilde sıralanması için, "1", "-1 / N" den sonra sıralanmalıdır (birden fazla farklılık gösterdiğinden), ancak sıralama algoritması bu iki öğeyi hiçbir zaman doğrudan birbiriyle karşılaştırmayacağından, bunu bilmenin hiçbir yolu olmazdı.


0

Bir n eleman dizisini n, n-1, n-2, ..., 2, 1 değerleriyle doldurun. Ardından "düz ekleme" algoritmasını kullanarak sıralamayı deneyin. Her öğenin, öğenin hemen önündeki öğeye eşit kabul edildiğini ve dolayısıyla taşınmadığını göreceksiniz. "Sıralama" sonucu aynı dizidir.

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.