Sono interessato a ordinare una matrice di valori interi positivi in tempo lineare (nel modello RAM con misura del costo uniforme, ovvero, gli interi possono avere dimensioni logaritmiche fino a quando si presume che le operazioni aritmetiche su di essi prendere il tempo unitario). Naturalmente, questo è impossibile con gli algoritmi di ordinamento basati sul confronto, quindi sono interessato a calcolare un ordinamento "approssimativo", cioè calcolare una permutazione di che non è davvero ordinato, in generale, ma una "buona approssimazione" della versione ordinata di . Presumo che stiamo ordinando gli interi in ordine decrescente perché rende il sequel un po 'più piacevole da affermare, ma ovviamente si potrebbe dire il problema al contrario.
Un possibile criterio per un ordinamento approssimativo è il seguente (*): lasciando che sia , per ogni , è necessario che (ovvero il "quasi-ordinato "l'elenco è limitato dall'alto dalla funzione decrescente ). È facile vedere che l'ordinamento attuale soddisfa questo: deve essere maggiore di quindi è al massimo che è , e in generale deve essere maggiore di che è .
Ad esempio, il requisito (*) può essere raggiunto dall'algoritmo seguente (suggerito da @Louis). La mia domanda è: esiste un lavoro esistente su questo compito di "quasi ordinare" numeri interi in tempo lineare, imponendo alcuni requisiti come (*) che l'ordinamento reale soddisferebbe? L'algoritmo di seguito, o qualche sua variante, ha un nome stabilito?
Modifica: risolto l'algoritmo e aggiunte ulteriori spiegazioni
Algoritmo:
INPUT: V an array of size n containing positive integers
OUTPUT: T
N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+
For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+
Questo algoritmo funziona come previsto per i seguenti motivi:
- Se un elemento è nel bucket allora .
viene inserito nel bucket , quindi
- Se un elemento è nel bucket allora oppure .
viene inserito nel bucket , quindi o . Nel primo caso che significa e quindi .
Per , ci sono al massimo elementi nei bucket da 1 a .
Sia e sia il numero totale di elementi in uno dei bucket 1..j. Per 2. abbiamo che ogni elemento in un bucket (con ) è tale che . Pertanto la somma di tutti gli elementi nei bucket da a è maggiore di . Ma questa somma è anche inferiore a quindi e quindi che ci dà o .
soddisfa (*) cioè l'elemento -esimo di è tale che
Per 3. abbiamo che , l' elemento -esimo di , proviene da un bucket con quindi .
Questo algoritmo richiede tempo lineare.
Il calcolo di richiede tempo lineare. I bucket possono essere implementati con un elenco collegato con inserzione e iterazione . Il ciclo nidificato viene eseguito tante volte quanti sono gli elementi (ovvero volte).