Java ve .NET: Varsayılan olarak neden farklı sıralama algoritmaları kullanılır?


19

Sadece nedenini merak ediyor Javave .NET Frameworkvarsayılan olarak farklı sıralama algoritması kullanıyor.

Java'da varsayılan olarak Birleştirme Sıralaması algoritmasını Array.Sort()kullanır ve Wikipedia.com'un dediği gibi:

Java'da, Arrays.sort () yöntemleri, veri türlerine bağlı olarak birleştirme sıralaması veya ayarlanmış bir hızlı sıralama kullanır ve uygulama etkinliği için, yediden az dizi öğesi sıralandığında ekleme sıralamasına geçer

.NET Framework'te Hızlı Sıralama'yı varsayılan sıralama algoritması ( MSDN ) olarak Array.Sort/List.Sort()kullanır :

List.Sort (), QuickSort algoritmasını kullanan Array.Sort kullanır. Bu uygulama kararsız bir sıralama gerçekleştirir; yani, iki öğe eşitse, sıraları korunmayabilir. Buna karşılık, kararlı bir sıralama eşit elemanların sırasını korur.

Harika "Algoritmaların karşılaştırılması" tablosuna bakarak her iki algoritmanın da En Kötü Durum ve Bellek Kullanımı perspektiflerinden oldukça farklı bir davranışa sahip olduğunu görebiliriz:

resim açıklamasını buraya girin

Hem Javave .NEThem de Kurumsal Çözümler geliştirme için harika Çerçeveler, her ikisi de gömülü geliştirme için platformlara sahiptir. Öyleyse neden varsayılan olarak farklı sıralama algoritmaları kullanıyorlar, herhangi bir düşünce?


1
Bu iki tür arasındaki karşılaştırma hakkında daha fazla tartışma için bkz. Stackoverflow.com/q/680541/866022
yoozer8 20

Yanıtlar:


10

Bilgisayarlar kadar belirleyici olduğu gibi, bilgisayar mühendisliği de tam bir bilim değildir. Aynı sorun alanı göz önüne alındığında iki kişi, bir analiz gerçekleştirecek ve sorunun tüm kısıtlamalarını karşılayan iki farklı çözüm geliştirecektir. Genel durumda bunların hangisinin "daha iyi" olduğunu ampirik olarak belirlemek zor veya imkansız olabilir.

Benim tahminim, .NET QuickSort'un MFC'lerde veya Windows API'sında bir şey üzerine katmanlanmış olması ve muhtemelen MergeSort'un çok iş parçacıklı avantajının bilgisayarlar için bile dikkate alınmayacağı daha eski Windows sürümlerinden miras alınmış olmasıdır. gün. ( DÜZENLEME: Microsoft geliştiricileri, MS-DOS'tan bu yana bu sıralama uygulaması seçimiyle kanıtlandığı gibi, uzun süredir QuickSort fanboyları olmuşlardır).

Java tamamen platformdan bağımsız olacak şekilde tasarlandığından platforma özgü herhangi bir uygulamayı kullanamayan Java farklı bir yol izledi. MergeSort'un neden zirveye çıktığını kim bilebilir; benim tahminim, uygulamanın geliştiricilerin ortaya çıkardığı diğer türlere göre bir tür performans yarışması kazanması ya da bir O (n) uzay MergeSort'un kağıt üzerinde en iyi durum ve en kötü durum performansı açısından en iyi görünmesi (MergeSort'un QuickSort gibi öğe seçimiyle ilgili Aşil topuğu yoktur ve en iyi durumu, genellikle QuickSort'un en kötüsüdür, ancak sıralanan bir listedir). Başlangıçta çok iş parçacıklı faydaların dikkate alındığından şüpheliyim, ancak mevcut uygulama çok iş parçacıklı olabilir.


1
List<T>.Sort.NET'te CLR'de uygulanan özel bir yöntem kullanılır (özel bir karşılaştırıcı kullanmazsanız), ancak işletim sistemi kitaplıklarına bağımlılığı yoktur.
Joey

1
@Keith - .NET hiçbir şeyin üstünde katman oluşturmaz ve platformdan bağımsız olacak şekilde tasarlanmıştır. Uygulamayı burada görebilirsiniz: github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Robert MacLean

@RobertMacLean - ".NET hiçbir şeyin üstünde katmanlı değil" gerçek bir ifade değildir, ancak söz konusu Sıralama işlevinin tamamen "yönetilen" kod olduğunu göstermişsinizdir. Şifreleme desteği, Windows masaüstü GUI kitaplıkları, Windows API birlikte çalışma (işlem ve iş parçacığı denetimi dahil) dahil olmak üzere büyük .NET bölümlerinin tümü, MFC'ler de dahil olmak üzere önceden var olan yönetilmeyen koda dayanmaktadır. Sadece olmalılar; Windows'un kendisi kod tabanının çok küçük bir .NET bileşenine sahip, gerisi yönetilmiyor
KeithS

QuickSort, MS-DOS'tan beri tercih edilen algoritma olduğu için Microsoft geliştiricilerinin QuickSort'un kanıtlanmış fanboyları olduğu ve bu algoritmanın .NET'in sıralamasını uygulama kararlarını etkilediği düşünülmektedir.
KeithS

Bu cevap çok yanlış dürüstçe şok oldum.
user9993

17

İki farklı şirketteki farklı geliştirme ekipleri, çerçeveleri ve bileşenleri için olağan kullanım durumuna ilişkin farklı sonuçlara varmış ve buna göre uygulamaya karar vermiştir.

Esasen, her şirket analizlerini yaptı, müşteri tabanlarına baktı ve buna göre farklı kararlar aldı.

Farklı şirketler ve ekipler tarafından, farklı varsayımlar ve ham veriler kullanarak analizlerin aynı sonuca varmasını bekleyemezsiniz.


5
Ya da aynı varsayımlar ve ham veriler. . .
Wyatt Barnett

Evet, muhtemelen sadece alışkanlık gücüydü - microsoft (kararsız) quicksort'u kullanmaya alışkındı, java istikrarlı
türle

12

Java artık Timsort kullandığından (Java 7'den itibaren) bu soru biraz güncel değil

Bahsedilen belirli algoritmalardan:

  • Quicksort, O (n ^ 2) 'de olumsuz en kötü durum performansına sahiptir, ancak biraz daha hafif / daha az bellek tüketir, bu nedenle tipik bir durumda daha iyi performans sunar.

  • Mergesort, O (n log n) değerinde en kötü durum performansını garanti etti, ancak biraz daha fazla ek yük ve bellek gereksinimi taşıyor. Aynı zamanda otomatik olarak kararlıdır (yani eşit elemanları aynı sırada tutar).

Java tasarımcıları genel olarak biraz daha muhafazakar / "doğru olana" odaklanmış gibi görünüyorlar, bu yüzden daha iyi garantiler sunduğu için Mergesort'u ikisinden seçmeleri şaşırtıcı değil.

Microsoft'un neden Quicksort'u seçtiğinden emin değilim, belki de bazı mikro ölçütlerde daha iyi görünmelerini sağlayabilirler mi?

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.