İyi bir özel durum sıralama algoritması nedir?


13

2-B ızgara düzenlenmiş nesneleri bir dizi olan bir veri kümesi var. Her satırda soldan sağa gittikçe artan ve her sütunda yukarıdan aşağıya doğru artan katı bir siparişim olduğunu biliyorum. Örneğin,

  • 1 2 3
  • 4 6 7
  • 5 8 9

Tüm veri kümesini doğrusal olarak sıralamak için naif sıralama geliştirebilir miyim (karşılaştırmalarda ölçüldüğü gibi)?

Da Veri kümeleri ne olacak? Karşılaştırmaların bir alt kümesiyle keyfi sonlu veri kümeleri biliniyor mu?


1
Daha kesin bir soru sorabilir misiniz? İlk paragrafınız, verilerinizin zaten sıralandığını ima etmek için okunabilir! Girdiniz tam olarak nedir ve hangi çıktıyı istiyorsunuz?
Jacques Carette

1
Evet, dil biraz kafa karıştırıcı. Veri kümesinin sıralanacak n numaradan oluştuğunu fark etmem biraz zaman aldı, ancak bu sayılar her satır ve her sütun zaten sıralanacak şekilde bir sqrt (n) x sqrt (n) ızgarasında düzenlenmiştir. Demek istediğin bu muydu?

Evet, demek istediğim buydu. Açıklık için düzenleyeceğim.
Zachary Vance

Yanıtlar:


19

Bu soruna Ω (n 2 log n) alt sınırını kanıtlamak kolaydır (karşılaştırma sıralama modelinde): (i, j) konumundaki eleman her zaman i + j'nin 1/2 mesafesi içinde ise, ızgara köşegenler birbirinden bağımsızdır ve her ızgara köşegenindeki sıralı düzen isteğe bağlıdır. Yani bu kısıtlaması altında mümkün sıralamaların toplam sayısı n üstel köşegenlerinin uzunlukları faktöriyellerinin ürünü (ızgaranın tüm çapraz) bir 2 log n.

Yani, standart karşılaştırma sıralama algoritmaları, tarif ettiğiniz gibi sıralanan ızgaralar için asimptotik olarak en uygun yöntemdir.


Diğer cevap bu karmaşıklık ile açık bir algoritma verir, bu yüzden bu sorunu 2 boyutlu ızgaralar için ve aslında kontrol etmeden, muhtemelen keyfi boyut ızgaraları için çözülmüş olarak düşüneceğim.
Zachary Vance

4

Sorunu doğru anlarsam (ve bilmiyorsam, bilmiyorsam bana söylemekten çekinmeyin), bir 2D ızgarayı sıralanmış bir 1D dizisine dönüştürmek istersiniz, oysa her satır ve sütun zaten 2D ızgarada sıralanır mı?

Bu durumda listedeki ilk eleman, sorunun tanımına göre sol üst köşe ((0,0)) olmalıdır. Bundan sonra, (1,0) veya (0,1) öğesi olmalıdır, çünkü diğerleri tanım gereği daha büyük olacaktır.

Izgaradaki bir sonraki en küçük öğenin her zaman doğrudan kullanılan bir öğenin (veya ızgara kenarının) hemen altında olduğunu ve ayrıca zaten kullanılan bir öğenin (veya ızgara kenarının) sağında olduğunu söyleyerek genelleştirebilirsiniz. ondan daha küçük olarak tanımlanır. Bu nedenle, her yinelemede yalnızca bu gereksinimi karşılayan en küçük değeri göz önünde bulundurmalısınız.

Olası adayları buldukları sırada sıralı bir şekilde tutabilirsiniz (bir yinelemede ikiden fazla kullanılamaz) ve her yinelemede mevcut olan yeni değerleri (varsa) kontrol edin. Önceki adayların en düşüklerinden daha düşükse, bunları listeye hemen ekleyin ve tekrarlayın, aksi takdirde önceki en düşük adayı ekleyin ve bir sonraki en düşük adayla karşılaştırın vb.

Ne yazık ki bunun tam bir karmaşıklığını sağlayabildiğimi iddia etmiyorum, bunun mümkün olan en verimli olduğunu iddia etmiyorum, kesinlikle naif bir yaklaşımdan daha iyi görünüyor ve umarım anlamanız için yeterince iyi açıkladım.

DÜZENLEME: Bunun gibi ızgaralar için aynı temel ilkenin geçerli olduğuna inanıyorum, ancak her yineleme n yeni adayı oluşturuyor ve bu adayların bu noktada n boyutunun her birindeki en küçük kullanılmamış öğeler olması gerekiyor.


Kısacası, mergesort gibi bir sqrt (N) yollu birleştirme yapabilirsiniz? Bu benim çalışan en iyi yöntem, ama O (N log N) olduğu ortaya çıkıyor - Orada kesin bir sabit yok, ama en azından günlük (sqrt (N)) için 0.5 var.
Zachary Vance
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.