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,
Bu karşılaştırıcı için gereksinimleri, anladığım kadarıyla:
- dönüşlü:
- antisimetrik:
- geçişli:
- 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)
[ 1, 2, 3, 4, 5]
[1, 4, 3, 2, 5]
[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:
- Karşılaştırma sıralaması için neden antisimetri gereklidir? (antisimetri hakkında)
- Rastgele bir karşılaştırıcı kabul eden sıralama algoritmaları (yaklaşık olarak rastgele bir C (x, y))
- Geçişsiz bir IComparer ile OrderBy (c # sort algoritması hakkında, bana göre)