Arka plan: Chao Xu, aşağıdaki soruyu bir süre önce yayınladı: " Her bir öğenin kez karşılaştırılacağı şekilde, sıralama ağlarına indirgenmeyen bilinen bir karşılaştırma sıralama algoritması var mı? " Görünüşe göre sorunla biraz sıkıştık; 2009'da Valentin Polishchuk ile aynı sorunu tartıştım ve hiçbir yere ulaşmadık.
Bazı yeni fikirler almak için, benzer bir tada sahip ve tamamen önemsiz olmayan mümkün olan en basit soruyu bulmaya çalıştım. Dolayısıyla aşağıdaki soru.
Soru: Her biri öğeli iki sıralı liste verilir . Eğer Can birleştirme her element sadece karşılaştırılır, böylece listeleri defa?
Doğal olarak, çıktı tüm öğelerini içeren sıralı bir liste olmalıdır .
[Bu önemsiz olduğu ortaya çıktı, cevap “hayır”.]
Soru 2: Her biri öğeli iki sıralı liste verilir . Eğer Can birleştirme her element sadece karşılaştırılır, böylece listeleri zamanlarda, izin verilmesi halinde elemanlarının küçük bir bölümünü atmak ?
Daha kesin bir ifadeyle, çıkış içeren bir sıralanmış listesi olmalıdır elemanları ve bir "çöp kutusu" içeren elemanları. değerini ne kadar küçük yapabilirsiniz ? Alma basittir. gibi bir şey açık bir şekilde yapılabilir olmalıdır. Ama misin?
Notlar:
Burada karşılaştırma modelini kullanıyoruz. Sadece deterministik algoritmalar, en kötü durum garantileriyle ilgileniyoruz.
Not o ikisi listeleri tam olması unsurlar. Eğer elemanlı bir liste ve elemanlı başka bir listemiz olsaydı , cevap açıkça "hayır" dır; iki liste de uzun ancak, bunun bir gibi görünüyor olabilir bazı "yük dengeleme" yapabilecektir.
Bu sefer her türlü algoritma geçerlidir. Algoritmanız sıralama ağlarını yapı taşı olarak kullanıyorsa, gayet iyi olur.
Bir başlangıç noktası için, her öğeyi en fazla 200 kez karşılaştıran basit bir algoritma: Standart birleştirme algoritmasını kullanın, ancak listelerin başlıkları için sayaçları koruyun. 200'e ulaştığınızda, öğeyi atın. Şimdi attığınız her öğe için çıktı dizinize başarıyla 200 öğe yerleştirdiniz. Böylece elde ettiniz .