Compte tenu d'un tableau de numéro, existe-t-il un algorithme O (n) pour construire un tas Max-Heap? P>
4 Réponses :
Je ne pense pas. Je pense que le mieux que vous puissiez faire est O (log n) ou un peu mieux avec quelque chose comme un tas de fib. P>
o (journal n) code> est o (n) code> (ie, si f code> est o (journal n) code> f code> si o (n) code>).
Je pense qu'il devait avoir signifié O (n log n)?
Ce n'est pas clair pour moi. Je pense que les insertions dans un tas de fibonacci sont amortis O (1) code> et donc le bâtiment est amorti o (n) code>.
Construire des tas binaires Bottom-up est O (n) code>.
Si vous utilisez un Fibonacci Heap Vous obtenez Amortizetisé O (1) insertion. Vous pouvez donc construire un tas maximum en amortis O (n) d'un tableau. P>
La mise en œuvre de tels, je laisse comme un exercice *. P>
* Cependant, il existe des exemples de mise en œuvre liés sur la page Wikipedia. SUB> P>
Oui, il y a: Construire un tas . P>
+1. Plus pour le ton de la réponse que la réponse elle-même :)
Votre propre lien suggère que ce n'est pas possible. Cela aurait dû dire non il n'y a pas ...
@Peter: Devis du lien: "Par conséquent, le coût du recouvrement de tous les sous-arbres est le suivant: [équations SNIP] O (n)"
Oui, comme dans ce code: ( Pour obtenir pourquoi ceci est O (n) Regardez l'arborescence binaire complet: p> 1/8 éléments (dernier niveau, i> n / 8) sont enfoncés au plus 2 étapes -> N / 8 * 2 Opérations
... p>
push_heap code> est une fonction qui accepte un pointeur sur un tas et la taille du tas et pousse le haut de la taille de la tas jusqu'à ce que les conditions de tas soient respectées ou que le nœud atteigne le fond du tas). P>
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
Homme, vous avez rendu les maths beaucoup plus simples que l'article Wiki! Merci beaucoup!
Quoi pour cette entrée: 1, 2, 3, 4, 5, 6, 7, 8, 9. Je pense que cela devrait être O (nlogn)?
Peut-être que si votre entrée est déjà commandée correctement.
@Frustration ...: Ce n'est pas commandé.