Dado un conjunto de números, ¿existe un algoritmo O (n) para construir un montón máximo?¿Hay un algoritmo O (n) para construir un montón máximo?
Respuesta
No lo creo. Creo que lo mejor que puedes hacer es O (log n) o un poco mejor con algo así como un montón de fib.
'O (log n)' es 'O (n)' (es decir, si 'f' es' O (log n) 'luego' f' si 'O (n)'). – jason
Creo que debe haber significado O (n log n)? – PeterAllenWebb
Eso no está claro para mí. Creo que las inserciones en un montón de Fibonacci se amortizan 'O (1)' y la construcción se amortiza 'O (n)'. – jason
Sugerencia: supongamos que en lugar de una matriz se le haya asignado un árbol binario arbitrario. ¿Puedes pensar en una forma eficiente de arreglar los nodos que no satisfacen la propiedad de montón?
Si usa Fibonacci Heap obtiene amortized O (1) inserción. En consecuencia, puede construir un montón máximo en O (n) amortizado desde una matriz.
La implementación de tal, lo dejo como un ejercicio *.
* Sin embargo, hay implementaciones de ejemplos vinculados en la página de Wikipedia.
Sí, hay Building a heap.
+1. Más por el tono de la respuesta que la respuesta en sí :) – Anna
Su propio enlace sugiere que no es posible. Debería haber dicho que no, no hay ... – PeterAllenWebb
@Peter: Cita del enlace: "Por lo tanto, el costo de heapificar todos los subárboles es: [recortar ecuaciones] O (n)" –
Sí, como en este código:
for (int i = N/2; i >= 0; --i)
push_heap(heap + i, N - i);
(push_heap
es una función que acepta un puntero a un montón y el tamaño del montón y empuja la parte superior de la pila hasta que se respetan o de las condiciones del montón el nodo alcanza el fondo del montón).
Para llegar por qué esto es O (N) mira el árbol binario completo:
- 1/2 elementos (último nivel, i> N/2) se empujan hacia abajo en la mayoría de los pasos 0 -> N/2 * 0 operaciones
- 1/4 elementos (último-1 nivel, i> N/4) se empujan hacia abajo a lo sumo 1 paso -> N/4 * 1 operaciones
1/8 elementos (última- 2 niveles, i> N/8) se presionan hacia abajo como máximo 2 pasos -> N/8 * 2 operaciones ...
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
Espero que las matemáticas no sean realmente muy complicadas. Si miras en el árbol y agregas cuánto se puede empujar cada nodo, verás el límite superior O (N).
+1 por ser menos perezoso que yo :) –
¡Hombre, hizo las matemáticas mucho más simples que el artículo de WIKI! ¡Gracias una tonelada! – khelll
¿Para qué esta entrada: 1, 2, 3, 4, 5, 6, 7, 8, 9. Creo que debería ser O (nlogn)? –
- 1. ¿Hay un algoritmo de ordenamiento de enteros O (n)?
- 2. Algún algoritmo de ordenación de O (n)
- 3. sobrecarga para un montón de montón vacío
- 4. Algoritmo C++ para N! pedidos
- 5. ¿Existe un término abreviado para O (n log n)?
- 6. ¿Cómo hago para construir un algoritmo de coincidencia?
- 7. ¿Hay un nombre para este algoritmo?
- 8. ¿Hay un algoritmo para determinar cuánta luz del día hay?
- 9. a init o para construir
- 10. Algoritmo para encontrar el punto especial k en el tiempo O (n log n)
- 11. ¿Cómo construir un gráfico ponderado con Ruby's RGL o GRATR para realizar el algoritmo de Dijkstra?
- 12. ¿Hay un estándar para criptosistemas de umbral (m de n)?
- 13. Arquitectura MySQL para n * (n - 1)/2 algoritmo
- 14. ¿Es así como paginas, o hay un algoritmo mejor?
- 15. ¿Hay un algoritmo para "simplificar" un gráfico de dependencia?
- 16. Algoritmo de conjunto independiente máximo
- 17. Un algoritmo para convertir un número de base 10 en un número de base-N
- 18. Cualquier idea de cómo transformar este O (n^2) algo en un O (n)
- 19. 2^n algoritmo de complejidad
- 20. ¿Hay un tamaño máximo para el contenido del parámetro POST?
- 21. ¿Hay un límite máximo para el valor max_allowed_packet?
- 22. Eliminar un nodo del centro de un montón
- 23. ¿Qué compila para un código más rápido: "n * 3" o "n + (n * 2)"?
- 24. cómo construir un bot para un juego flash en línea?
- 25. ¿Hay un "\ n" equivalente en VBscript?
- 26. ¿El montón es realmente un montón?
- 27. incompatibles tamaños inicial y máximo especificados montón
- 28. Necesito un algoritmo óptimo para encontrar el mayor divisor de un número N de preferencia en C++ o C#
- 29. Algoritmo de intersección de rango mejor que O (n)?
- 30. Levenshtein Algoritmo de distancia mejor que O (n * m)?
Quizás si su entrada ya está ordenada correctamente. – FrustratedWithFormsDesigner
@Frustrated ...: No está ordenado. – MainID