Dato un array di numero, c'è un algoritmo O (n) per costruire un max-heap?Esiste un algoritmo O (n) per costruire un max-heap?
risposta
Non credo. Penso che il meglio che puoi fare sia O (log n) o un po 'meglio con qualcosa come un ammasso di fibrosi.
'O (log n)' è 'O (n)' (cioè, se 'f' è' O (log n) 'poi' f' se 'O (n)'). – jason
Penso che abbia voluto dire O (n log n)? – PeterAllenWebb
Non è chiaro per me. Penso che gli inserti in un heap di Fibonacci vengano ammortizzati 'O (1)' e quindi la costruzione viene ammortizzata 'O (n)'. – jason
Suggerimento: supponiamo che al posto di un array sia stato assegnato un albero binario arbitrario. Riesci a pensare a un modo efficace per correggere tutti i nodi che non soddisfano la proprietà heap?
Se si utilizza uno Fibonacci Heap si ottiene amortized O (1) inserimento. Di conseguenza, è possibile creare un heap massimo in O (n) ammortizzato da un array.
L'attuazione di tale, lascio come esercizio *.
* Tuttavia, ci sono implementazioni di esempio collegate sulla pagina di Wikipedia.
Sì, c'è: Building a heap.
+1. Altro per il tono della risposta rispetto alla risposta stessa :) – Anna
Il tuo link suggerisce che non è possibile. Avrebbe dovuto dire di no non c'è ... – PeterAllenWebb
@Peter: citazione dal link: "Pertanto, il costo di heapificare tutti i sottoalberi è: [snip equations] O (n)" –
Sì, come in questo codice:
for (int i = N/2; i >= 0; --i)
push_heap(heap + i, N - i);
(push_heap
è una funzione che accetta un puntatore ad un cumulo e la dimensione heap e spinge la parte superiore del mucchio finché le condizioni mucchio siano rispettate o il nodo raggiunge il fondo del mucchio).
Per ottenere il motivo per cui questo è O (N) guardare l'albero binario completo:
- 1/2 elementi (ultimo livello, i> N/2) sono spinti verso il basso al massimo 0 punti -> N/2 * 0 operazioni
- 1/4 elementi (ultimo livello 1, i> N/4) vengono premuti al massimo 1 passo -> N/4 * 1 operazioni
1/8 elementi (ultimo- 2 livelli, i> N/8) sono premuti al massimo 2 passi -> N/8 * 2 operazioni ...
N/4 * 1 + N/8 * 2 + N/16 * 3 + ... = N/4 * 1 + N/8 * 1 + N/16 * 1 + ... + N/8 * 1 + N/16 * 2 + ... = N/4 * 1 + N/8 * 1 + N/16 * 1 + ... + // < N/2 N/8 * 1 + N/16 * 1 + ... + // < N/4 N/16 * 1 + ... + // < N/8 ... = // N/2 + N/4 + N/8 + ... < N
Spero che la matematica non sia davvero troppo complicata. Se guardi sull'albero e aggiungi quanto può essere spinto verso il basso ciascun nodo, vedrai il limite superiore O (N).
+1 per essere meno pigro di me :) –
Uomo, hai reso la matematica molto più semplice dell'articolo WIKI! Grazie mille! – khelll
Cosa per questo input: 1, 2, 3, 4, 5, 6, 7, 8, 9. Penso che dovrebbe essere O (nlogn)? –
- 1. Esiste un algoritmo O (n) per generare un array senza prefisso per un array intero positivo?
- 2. Un algoritmo di ordinamento O (n)
- 3. Costruire un algoritmo HTML Diff/Patch
- 4. Esiste un nome per questo algoritmo?
- 5. Algoritmo C++ per N! ordini
- 6. Durata (grande O)) di un algoritmo
- 7. Algoritmo per costruire una piramide con quadrati
- 8. Esiste una struttura ad albero o un algoritmo per mescolare i livelli di un albero?
- 9. Esiste un codice o un algoritmo per il riconoscimento della firma?
- 10. Esiste un algoritmo di "ordinamento binario"?
- 11. Architettura MySQL per algoritmo n * (n - 1)/2
- 12. O (n) algoritmo per scoprire l'elemento che appare più di n/2 volte
- 13. Esiste un algoritmo per convertire video 2D in video 3D?
- 14. Esiste un "modo più rapido" per costruire stringhe in Java?
- 15. Esiste un algoritmo per il voto anonimo, modificabile e sicuro?
- 16. Un algoritmo per convertire un numero di base 10 in un numero N di base
- 17. Esiste un algoritmo per lo spostamento di intervalli?
- 18. Algoritmo di distanza di Levenshtein meglio di O (n * m)?
- 19. Questo algoritmo dovrebbe essere eseguito in O (n)?
- 20. Esiste un modo per annullare un'espressione regolare?
- 21. Trova i duplicati in un array in tempo O (N)
- 22. Questo algoritmo di O (n^4) è evitabile?
- 23. Come costruire un $ o query in MgO
- 24. Convertire un heap in un BST in tempo O (n)?
- 25. Costruire un Regex Compositore
- 26. Esiste un modo più elegante per calcolare x = (y/n) + (y% n? 1: 0)?
- 27. Algoritmo ottimale per generare un numero casuale R non in un insieme di numeri N
- 28. Esiste un algoritmo per ordinare l'array di stringhe per la GPU?
- 29. Algoritmo O (log n) per trovare l'elemento avente rank i in unione di liste pre-ordinate
- 30. O (n) Algoritmo per scoprire se 2 array hanno 2 elementi che si sommano a un numero
Forse se l'input è già stato ordinato correttamente. – FrustratedWithFormsDesigner
@Frustrato ...: non è ordinato. – MainID