Questo non è il lavoro della mia scuola a casa. Questo è il mio lavoro a casa e sono un algoritmo di autoapprendimento.- Ordina un array con elementi distinti LogLogN
In Algorithm Design Manual, c'è una tale accisa
4-25 Si supponga che l'array A [1..n] ha solo numeri da {1,. . . , n^2} ma che al più log log n di questi numeri appare mai. Definire un algoritmo che ordina A sostanzialmente inferiore a O (n log n).
Ho due approcci:
il primo approccio:
Fondamentalmente voglio fare il conteggio di ordinamento per questo problema. Posso prima eseguire la scansione dell'intero array (O (N)) e inserire tutti i numeri distinti in un array di dimensioni loglogN (int [] K).
Quindi applicare il conteggio del tipo. Tuttavia, quando si imposta la matrice di conteggio (int [] C), non è necessario impostare la sua dimensione come N^2, invece, ho impostato anche la dimensione come loglogN.
Ma in questo modo, quando contando le frequenze di ogni numero diverso, devo scansionare matrice K per ottenere indice dell'elemento (O (NloglogN) e quindi aggiornare matrice C.
Il secondo approccio :
Ancora, devo scandire l'intera matrice per ottenere un numero distinto matrice K con dimensioni loglogN
Poi ho solo fare una sorta di quicksort come, ma la partizione si basa sulla mediana di matrice K (. cioè, ogni volta che il pivot è un elemento della matrice K), si ripetono vamente.
Penso che questo approccio sia il migliore, con O (NlogloglogN).
Ho ragione? o ci sono soluzioni migliori?
accise simili esistono in Manuale Algorithm Design, come ad esempio
4-22 Dimostrare che interi n positive nel campo da 1 a k possono essere ordinati in O (n log k) tempo. Il caso interessante è quando k < < n.
4-23 Cerchiamo di ordinare una sequenza S di n interi con molte duplicazioni, in modo che il numero di interi distinti in S sia O (log n). Dare un algoritmo del tempo peggiore O (n log log n) per ordinare tali sequenze.
Ma fondamentalmente per tutte queste accise, il mio intuito pensava sempre al conteggio dell'ordinamento in quanto possiamo conoscere l'intervallo degli elementi e l'intervallo è abbastanza breve rispetto alla lunghezza dell'intero array. Ma dopo aver riflettuto più a fondo, immagino che le accise sono alla ricerca del secondo approccio, giusto?
Grazie
Potremmo usare la struttura BST di dimensione del registro di log n elementi Perché - vogliamo ordinare su elementi minori a diminuire fase di esecuzione (non sto considerando counting sort perché sta andando a prendere wayyyy troppo molto spazio rispetto al mio array originale) Possiamo gestire il contatore su ogni nodo per gestire i duplicati T (n) = O (numero di elementi * altezza del bst) = O (n * log log log n) Come stai prendendo in considerazione il numero di ordinamento del registro di registro n invece di n^2 – Sandy