Java e .NET: perché per impostazione predefinita vengono utilizzati algoritmi di ordinamento diversi?


19

Mi chiedo solo perché Javae .NET Frameworkusi diversi algoritmi di ordinamento per impostazione predefinita.

In Java Array.Sort() utilizza l' algoritmo Merge Sort per impostazione predefinita e come dice Wikipedia.com :

In Java, i metodi Arrays.sort () utilizzano l'ordinamento di tipo merge o un quicksort sintonizzato in base ai tipi di dati e per l'efficienza dell'implementazione passare all'ordinamento di inserzione quando vengono ordinati meno di sette elementi dell'array

In .NET Framework Array.Sort/List.Sort() utilizza l'ordinamento rapido come algoritmo di ordinamento predefinito ( MSDN ):

List.Sort () utilizza Array.Sort, che utilizza l'algoritmo QuickSort. Questa implementazione esegue un ordinamento instabile; cioè, se due elementi sono uguali, il loro ordine potrebbe non essere preservato. Al contrario, un ordinamento stabile preserva l'ordine degli elementi uguali.

Osservando la grande tabella "Confronto di algoritmi" possiamo vedere che entrambi gli algoritmi hanno un comportamento piuttosto diverso dalle prospettive di Peggiore caso e utilizzo della memoria:

inserisci qui la descrizione dell'immagine

Entrambi Javae .NETsono ottimi frame per lo sviluppo di soluzioni aziendali, entrambi hanno piattaforme per lo sviluppo integrato. Quindi perché stanno usando algoritmi di ordinamento diversi per impostazione predefinita, qualche pensiero?


1
Per ulteriori discussioni su un confronto tra questi due tipi, vedere stackoverflow.com/q/680541/866022
yoozer8

Risposte:


10

Determinante come lo sono i computer stessi, l'ingegneria informatica non è una scienza esatta. Due persone, visto lo stesso dominio problematico, eseguiranno un'analisi e svilupperanno due diverse soluzioni che soddisfano tutti i vincoli del problema. Può essere difficile o impossibile determinare empiricamente quale di questi è "migliore" nel caso generale.

La mia ipotesi è che .NET QuickSort sia sovrapposto a qualcosa negli MFC o nell'API di Windows ed è probabilmente ereditato da versioni molto più vecchie di Windows in cui il vantaggio multi-thread di MergeSort non sarebbe stato nemmeno considerato per i computer di il giorno. ( EDIT: non lo è, anche se gli sviluppatori Microsoft sono fan di QuickSort da molto tempo, come evidenziato da questa scelta di implementazione dell'ordinamento da MS-DOS).

Java, che non può utilizzare alcuna implementazione specifica della piattaforma perché Java è stato progettato da zero per essere completamente indipendente dalla piattaforma, ha preso una strada diversa. Chissà perché MergeSort è risultato il migliore; la mia ipotesi selvaggia è che l'implementazione abbia vinto una sorta di competizione sulle prestazioni rispetto ad altri tipi che gli sviluppatori hanno inventato, oppure che un MergeSort nello spazio O (n) fosse semplicemente migliore sulla carta in termini di prestazioni nel caso migliore e nel caso peggiore (MergeSort non ha il tallone d'Achille relativo alla selezione degli elementi come QuickSort, e il suo caso migliore è un elenco quasi ordinato mentre quello è spesso il peggiore di QuickSort). Dubito che inizialmente siano stati considerati i vantaggi del multithreading, ma l'attuale implementazione potrebbe essere multithread.


1
List<T>.Sortin .NET utilizza un metodo nativo implementato nel CLR (se non si utilizza un comparatore personalizzato), ma non ha dipendenze dalle librerie del sistema operativo.
Joey,

1
@Keith - .NET non è sovrapposto a nulla ed è stato progettato per essere indipendente dalla piattaforma. Puoi vedere l'implementazione proprio qui: github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…
Robert MacLean,

@RobertMacLean - ".NET non è sovrapposto a nulla" non è un'affermazione vera, anche se hai dimostrato che la funzione di ordinamento in questione è un codice completamente "gestito". Ampie porzioni di .NET, incluso il supporto di crittografia, librerie GUI desktop di Windows, interoperabilità API di Windows (incluso controllo di processo e threading) sono tutte basate su codice non gestito preesistente, inclusi gli MFC. Devono semplicemente esserlo; Windows stesso ha solo un componente .NET molto piccolo della sua base di codice, il resto non è gestito
KeithS

Resta il fatto che gli sviluppatori Microsoft sono comprovati fan di QuickSort rispetto ad altre implementazioni, poiché QuickSort è stato l'algoritmo preferito da MS-DOS e questo avrebbe influenzato la loro decisione di implementare l'ordinamento .NET con questo algoritmo.
KeithS

Questa risposta è così sbagliata che sono sinceramente scioccato.
user9993,

17

Diversi team di sviluppo in due diverse società sono giunti a conclusioni diverse riguardo al solito caso d'uso per i loro quadri e componenti e hanno deciso di implementare di conseguenza.

In sostanza, ogni azienda ha fatto la propria analisi, ha esaminato la propria base di clienti e ha preso decisioni diverse di conseguenza.

Non puoi aspettarti che l'analisi di diverse aziende e team, utilizzando ipotesi e dati grezzi diversi, giunga alla stessa conclusione.


5
O anche gli stessi presupposti e dati grezzi. . .
Wyatt Barnett,

Sì, probabilmente era solo la forza dell'abitudine - Microsoft era abituata a usare il quicksort (instabile), Java voleva andare con il tipo stabile ... e unire l'ordinamento era il più stabile conosciuto ...
rogerdpack,

12

Questa domanda è un po ' obsoleta , poiché Java ora utilizza Timsort (a partire da Java 7)

Degli algoritmi specifici menzionati:

  • Quicksort ha prestazioni sfavorevoli nel caso peggiore a O (n ^ 2), ma è un po 'più leggero / consuma meno memoria, quindi offre prestazioni migliori in un caso tipico.

  • Mergesort ha garantito prestazioni nel peggiore dei casi a O (n log n), ma comporta un po 'più di sovraccarico e requisiti di memoria. Inoltre è automaticamente stabile (cioè mantiene elementi uguali nello stesso ordine).

I designer Java sembrano in generale un po 'più conservatori / concentrati sulla "cosa giusta", quindi non sorprende che abbiano scelto Mergesort tra i due poiché offre migliori garanzie.

Non sei sicuro del motivo per cui Microsoft abbia scelto Quicksort, ma forse lo farebbero apparire meglio in alcuni micro-benchmark?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.