2010-09-22 27 views
26

¿Cuáles son las aplicaciones del mundo real de montones de Fibonacci y montones binarios? Sería genial si pudieras compartir alguna instancia cuando la usaste para resolver un problema.Aplicaciones del mundo real de montones binarios y montones de Fibonacci

Edit: Añadido binary heaps también. Curioso saber

+0

Guau, vives y aprendes. Ni siquiera sabía que Fib ... existían montones. Cosas interesantes. – PurplePilot

+1

"Uso del mundo real" parece estar haciendo una pregunta incorrecta, similar a "¿Cuáles son los usos reales de las matrices?" –

+3

¡Todos conocen el uso real de las matrices! – devnull

Respuesta

15

Rara vez usaría uno en la vida real. Creo que el objetivo del montón de Fibonacci era mejorar el tiempo de ejecución asintótica del algoritmo de Dijkstra. Puede brindarle una mejora para entradas muy, muy grandes, pero la mayoría de las veces, todo lo que necesita es un simple montón binario.

De wiki:

Aunque el tiempo total de ejecución de una secuencia de de las operaciones a partir de una estructura de vacío está delimitada por las límites dados anteriormente, algunos (muy pocos) operaciones en la secuencia puede tomar muy largo para completar (en particular eliminar y eliminar mínimo tener lineal tiempo de ejecución en el peor de los casos). Para esta razón Fibonacci heaps y otras estructuras de datos amortizadas pueden no ser apropiadas para sistemas en tiempo real.

El montón binario es una estructura de datos que se puede utilizar para encontrar rápidamente el valor máximo (o mínimo) en un conjunto de valores. Se usa en el algoritmo de Dijkstra (ruta más corta), el algoritmo de Prim (árbol de expansión mínimo) y la codificación de Huffman (compresión de datos).

+1

Nota: Fibonacci mejora el tiempo amortizado, no el peor de los casos. Y el montón binario también tiene un promedio de O (1). –

11

No se puede decir acerca de los montones de fibonacci, pero los montones binarios se utilizan en las colas de prioridad. Las colas de prioridad se usan ampliamente en los sistemas reales. Un ejemplo conocido es la programación de procesos en el kernel. El proceso de mayor prioridad se toma primero. He utilizado las colas de prioridad en la partición de los conjuntos. El conjunto que tiene el número máximo de miembros se debe tomar primero para la partición.

0

En la mayoría de los casos, usted tiene que elegir en base a la complejidad de:

  • inserción
  • elementos hallazgo

Y los sospechosos habituales son:

  • BST: log(n) inserta y encuentra
  • lista enlazada: O(1) inserción y O(n) encuentran
  • montón:
    • O(1) inserción
    • O(1) encuentran para el primer elemento solamente, O(n) en general
      • peor de los casos para el montón binario
      • amortizado de Fibonacci

Hay también el Brodal queue y otros montones que alcanzan el peor caso de O(1), pero requiere even larger queues que Fibonacci para valer la pena.

Si su algoritmo solo necesita "encontrar" el primer elemento y hacer muchas inserciones, los montones son una buena opción.

Como han mencionado otros, este es el caso de Dijkstra.

Cuestiones relacionadas