Java neden ilkellerde bir sayı tabanı türü kullanmıyor?


12

java.util.Arrays.sort(/* int[], char[], short[], byte[], boolean[] */) sayı tabanı sıralamasından ziyade 'ayarlanmış bir hızlı sıralama' olarak uygulanır.

Bir süre önce bir hız karşılaştırması yaptım ve n> 10000 gibi bir şeyle, sayı tabanı sıralaması her zaman daha hızlıydı. neden?

Yanıtlar:


17

Ben tahmin ediyorum:

  • Array.sort, quicksort olarak uygulanır, çünkü quicksort bir karşılaştırıcı verildiğinde uygun olan her şeyi sıralayabilir.
  • 10000 girişlik bir listenin sıralanması çok yaygın değildir. 10000 veya daha fazla elemandan oluşan bir veri yapısına erişim oldukça yaygındır. Düzeni korumanız gerekiyorsa, dengeli bir arama ağacı genellikle en küçük öğeye her ihtiyacınız olduğunda tüm dizinizi sıralamaktan daha iyi bir yoldur.
  • İlkokulları sıralamak üniversitenin ne öğretebileceğine rağmen çok yaygın değildir.

Mesele şu ki, yaygın bir kullanım durumu değil, optimizasyonunun standart kütüphanede olması gerekiyor. Eğer sen 10.000+ ints dizisi sıralama darboğaz aslında olduğunu profilleme yoluyla belirlemek performans sorunları, olan bir uygulamayı, yazdım, o zaman sen de elle sıralama yazmak veya ilk veri yapısının seçiminizi yeniden gözden geçirebileceğini yer.


% 100 emin değilim, ama sanırım TimSort şimdi bazı durumlarda kullanılıyor.
Martijn Verburg

1
Ama Array.sort diye bir şey yok, birden fazla Array.sorts var ve soru bunun sayısal türler için uzmanlaşmış olmasıydı.
Danubian Sailor

6

Back2dos her şeyi söyledi, sadece en önemli olduğunu düşündüğüm noktayı daha da netleştirmeye çalışacağım:

Radix sıralaması, yalnızca ikili basamak örüntülerine bağlı olarak, dizinin içerdiği gerçek ilkel değerleri sıralayabilir. Gerçek dünyadaki yazılım mühendisliği senaryolarında, bu duruma neredeyse hiç rastlanmaz . Çok daha sık yapmaya meyilli olduğumuz şey, daha karmaşık (ilkel olmayan) veri yapılarının sıralama dizileridir ve bazen dizinlerin dizilerini diğer varlıklara göre sıralarız.

Şimdi, diğer varlıklara yönelik bir dizin dizisi aslında bir ilkel dizisidir, ancak sıralama düzeni, dizinleri değil dizinler tarafından dizinlenen karşılaştırıcı arabirimi (ve / veya C # delegesi) tarafından sağlanır. Bu nedenle, sıralama düzeni ilkellerin değerlerinin sırası ile kesinlikle bir ilişki içinde değildir ve bu nedenle radyant sıralaması bu senaryo için kesinlikle işe yaramaz.

Bir örnek:

Bir dizi dizemiz var: [0] = "Mike", [1] = "Albert", [2] = "Zoro". Sonra bu dizelere bir dizi dizin bildiririz: [0] = 0, [1] = 1, [2] = 2. Daha sonra, dizin dizisini sıralayarak dizinleri kendileri değil, bu dizinler tarafından belirtilen gerçek dizeleri karşılaştıran bir karşılaştırıcı geçiririz. Sıralamadan sonra, sonuçtaki dizin dizisi şöyle görünecektir: [0] = 1, [1] = 0, [2] = 2. Gördüğünüz gibi, bu sıralama düzeninin dizinin içerdiği değerlerin ikili kalıplarıyla hiçbir ilgisi yoktur ve yine de bu dizin dizisini geçerek ve karşılık gelen her dizeyi getirerek dizeleri sıralı olarak ziyaret ederiz.

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.