Ordina una matrice di


8

Sto cercando di capire come posso ordinare un array di elementi quando solo non sono presenti.nlogn

Ho sentito che l'ordinamento di un array al massimo con inversioni ha complessità . Poiché ci sono elementi non ordinati, nel mio caso ci sono al massimo inversione.ioO(nlog(io/n))lognnlogn

La risposta alla domanda è che è coerente con la formula, ma non riesco a capire l '"idea alla base, o quale algoritmo di ordinamento la raggiunge.O(nloglogn)

Risposte:


9

Supponendo che "K elementi fuori posto "significa che esistono K elementi la cui eliminazione lascia il resto dell'array ordinato, c'è un O(n+KlogK)-time algoritmo per ordinare l'intero array.

In poche parole, calcolare almeno una sottosequenza crescente di lunghezza n-2K, ordina gli altri e unisci. Il primo può essere realizzato in tempoO(n)da un semplice algoritmo di stack che spinge gli elementi uno alla volta e fa apparire i primi due ogni volta che sono fuori servizio. La strategia di eliminazione ottimale deve eliminare almeno uno di questi elementi, quindi il danno totale è limitato da2K eliminazioni.


+1 per l'idea chiara. Solo una cosa (e probabilmente sto dividendo i capelli qui), puoi davvero fare inserimenti in luoghi arbitrari evitando ilO(n)"tutti spostano a destra per favore" costo? Credo che dovremmo tenere traccia degli inserimenti in una struttura separata, facendo un passaggio finale alla fine per produrre l'array ordinato.
quicksort

@quicksort è meglio ordinare i frammenti e unire i methink
David Eisenstat,

1
È la stessa cosa, ma la fusione è più pulita, sono d'accordo.
quicksort

1
Degno di menzione è che questo è asintoticamente ottimale (usando i confronti) in dipendenza sia da n che da k.
aelguindy,

Bene, l'algoritmo che hai descritto sembra essere un ordinamento drop-merge .
Morwenn,

5

Diciamo che ci sono K elementi non sul posto.

Dividi l'array in subarrays non decrescenti. Questo può essere fatto inΘ(n) tempo e risulterà al massimo 2Ksottoarray. Ora li uniamo semplicemente in modo accoppiatoΘ(nlogK) tempo, producendo un array ordinato.

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.