¿Por qué los números de Fibonacci son importantes en informática?

76

Los números de Fibonacci se han convertido en una introducción popular a la recursividad para los estudiantes de Ciencias de la Computación y hay un fuerte argumento de que persisten en la naturaleza. Por estas razones, muchos de nosotros estamos familiarizados con ellos.

También existen dentro de la informática en otros lugares también; en estructuras de datos y algoritmos sorprendentemente eficientes basados ​​en la secuencia.

Hay dos ejemplos principales que me vienen a la mente:

  • Montones de Fibonacci que tienen mejor amortizado el tiempo de ejecución que los montones binomiales.
  • Búsqueda de Fibonacci que comparte el tiempo de ejecución O (log N) con la búsqueda binaria en una matriz ordenada.

¿Existe alguna propiedad especial de estos números que les dé una ventaja sobre otras secuencias numéricas? ¿Es una cualidad espacial? ¿Qué otras posibles aplicaciones podrían tener?

Me parece extraño porque hay muchas secuencias de números naturales que ocurren en otros problemas recursivos, pero nunca he visto un montón catalán .

Ian Bishop
fuente
¿No sería la familiaridad el factor más importante?
Ciclón
13
Creo que este tipo de pregunta pertenece a la SE de la teoría cstheory o de las matemáticas. Intrigante, pero OT.
Fred Foo
7
@larsmans En desacuerdo. Una de las preguntas más interesantes que he visto últimamente, y su relevancia está respaldada por el hecho de que como programadores, la vemos en todas partes.
Mike
2
Esto parece estar relacionado con las "Aplicaciones de la secuencia de fibonacci" consultadas en math.stackexchange.com . Hay otras preguntas similares allí sobre aplicaciones específicas de la secuencia. Probablemente sea un buen lugar para discutir las "propiedades" de la secuencia en general, y como se aplica a algoritmos más generales. Me parece que esta pregunta se acerca a una discusión de la teoría computacional que podría recibir mejor / más atención allí.
RobertB
1
Estoy con larsmans en esto (obviamente), y estoy de acuerdo en que cstheory sería otro buen lugar para ir con esto.
RobertB

Respuestas:

69

Los números de Fibonacci tienen todo tipo de propiedades matemáticas realmente agradables que los hacen excelentes en informática. Aquí hay algunos:

  1. Crecen exponencialmente rápido. Una estructura de datos interesante en la que aparece la serie de Fibonacci es el árbol AVL, una forma de árbol binario autoequilibrado. La intuición detrás de este árbol es que cada nodo mantiene un factor de equilibrio para que las alturas del subárbol izquierdo y derecho difieran como máximo en uno. Debido a esto, puede pensar en el número mínimo de nodos necesarios para obtener un árbol AVL de altura h se define por una recurrencia que parece N (h + 2) ~ = N (h) + N (h + 1), que se parece mucho a la serie Fibonacci. Si calcula las matemáticas, puede demostrar que el número de nodos necesarios para obtener un árbol AVL de altura h es F (h + 2) - 1. Debido a que la serie de Fibonacci crece exponencialmente rápido, esto significa que la altura de un AVL tree es como máximo logarítmico en el número de nodos, lo que le da el tiempo de búsqueda O (lg n) que conocemos y amamos sobre los árboles binarios equilibrados. De hecho, si puede unir el tamaño de alguna estructura con un número de Fibonacci, es probable que obtenga un tiempo de ejecución O (lg n) en alguna operación. Esta es la verdadera razón por la que los montones de Fibonacci se denominan montones de Fibonacci: la prueba de que el número de montones después de un mínimo de desconexión implica delimitar el número de nodos que puede tener en una cierta profundidad con un número de Fibonacci.
  2. Cualquier número puede escribirse como la suma de números únicos de Fibonacci. Esta propiedad de los números de Fibonacci es fundamental para que la búsqueda de Fibonacci funcione; si no pudiera sumar números de Fibonacci únicos en cualquier número posible, esta búsqueda no funcionaría. Contraste esto con muchas otras series, como 3 n o los números catalanes. Esta es también, en parte, la razón por la que muchos algoritmos como potencias de dos, creo.
  3. Los números de Fibonacci se pueden calcular de manera eficiente. El hecho de que la serie se pueda generar de manera extremadamente eficiente (puede obtener los primeros n términos en O (n) o cualquier término arbitrario en O (lg n)), muchos de los algoritmos que los usan no serían prácticos. Generar números en catalán es bastante complicado computacionalmente, IIRC. Además de esto, los números de Fibonacci tienen una propiedad agradable donde, dados dos números de Fibonacci consecutivos, digamos F (k) y F (k + 1), podemos calcular fácilmente el número de Fibonacci siguiente o anterior sumando los dos valores. (F (k) + F (k + 1) = F (k + 2)) o restarlos (F (k + 1) - F (k) = F (k - 1)). Esta propiedad se explota en varios algoritmos, junto con la propiedad (2), para dividir los números en la suma de los números de Fibonacci. Por ejemplo, la búsqueda de Fibonacci usa esto para ubicar valores en la memoria,
  4. Son útiles desde el punto de vista pedagógico. Enseñar la recursividad es complicado y la serie de Fibonacci es una excelente manera de presentarla. Puede hablar de recursividad directa, de memorización o de programación dinámica al presentar la serie. Además, la sorprendente forma cerrada de los números de Fibonacci a menudo se enseña como un ejercicio de inducción o en el análisis de series infinitas, y la ecuación matricial relacionada para los números de Fibonacci se introduce comúnmente en el álgebra lineal como una motivación detrás de los autovectores y autovalores. Creo que esta es una de las razones por las que tienen un perfil tan alto en las clases de introducción.

Estoy seguro de que hay más razones además de esta, pero estoy seguro de que algunas de estas razones son los factores principales. ¡Espero que esto ayude!

templatetypedef
fuente
30
Todo esto también se aplica a las potencias de 2 ;-)
Generando números catalanes en orden en "O (n)":perl -Mbignum -le'$n=0;$c=1;while(1){$n++;$c*=(4*$n-2);$c/=($n+1);print"$n\t$c"}' | head -n 100
A. Rex
3
En el n. ° 2, es importante que los números de fibonacci no sean consecutivos para que la suma pueda ser única.
kunigami
1
Lo que hace útil la búsqueda de Fibonacci es que su polinomio generador es x ^ 2-x-1. La búsqueda de Fibonacci comparte propiedades con la búsqueda de proporción áurea para el mínimo de una función continua.
Alexandre C.
@Alexandre C.- ¿Puedes dar más detalles sobre esto? No estoy familiarizado con por qué ese polinomio generador en particular es útil.
templatetypedef
4

El mayor divisor común es otra magia; vea esto para demasiadas magias. Pero los números de Fibonacci son fáciles de calcular; también tiene un nombre específico. Por ejemplo, los números naturales 1, 2, 3, 4, 5 tienen demasiada lógica; todos los números primos están dentro de ellos; suma de 1..n es computable, cada uno puede producir con otros, ... pero nadie se ocupa de ellos :)

Una cosa importante que olvidé es Golden Ratio , que tiene un impacto muy importante en la vida real (por ejemplo, te gustan los monitores anchos :)

Saeed Amiri
fuente
1

Si tiene un algoritmo que se puede explicar con éxito de una manera simple y concisa, o con ejemplos comprensibles de la informática y la naturaleza, ¿qué mejor herramienta de enseñanza se le podría ocurrir a alguien?

savalia
fuente
1

Las secuencias de Fibonacci se encuentran en todas partes en la naturaleza / vida. Son útiles para modelar el crecimiento de poblaciones animales, crecimiento de células vegetales, forma de copo de nieve, forma de planta, criptografía y, por supuesto, informática. Escuché que se lo conoce como el patrón de ADN de la naturaleza.

Ya se han mencionado los montones de Fibonacci; el número de hijos de cada nodo en el montón es como máximo log (n). Además, el subárbol que comienza un nodo con m hijos es al menos (m + 2) el número de fibonacci.

Los protocolos tipo Torrent que utilizan un sistema de nodos y supernodos utilizan un fibonacci para decidir cuándo se necesita un nuevo supernodo y cuántos subnodos gestionará. Realizan gestión de nodos basada en la espiral de fibonacci (proporción áurea). Vea la foto a continuación cómo se dividen / fusionan los nodos (divididos de un cuadrado grande a otros más pequeños y viceversa). Ver foto: http://smartpei.typepad.com/.a/6a00d83451db7969e20115704556bd970b-pi

Algunas ocurrencias en la naturaleza

http://www.mcs.surrey.ac.uk/Personal/R.Knott/Fibonacci/sneezewort.GIF

http://img.blogster.com/view/anacoana/post-uploads/finger.gif

http://jwilson.coe.uga.edu/EMAT6680/Simmons/6690Pictures/pinecone3yellow.gif

http://2.bp.blogspot.com/-X5II-IhjXuU/TVbHrpmRnLI/AAAAAAAAABU/nv73Y9Ylkkw/s320/amazing_fun_featured_2561778790105101600S600x600Q85_2009072318563068

Adrian
fuente
0

No creo que haya una respuesta definitiva, pero una posibilidad es que la operación de dividir un conjunto S en dos particiones S1 y S2, una de las cuales se divide luego en subparticiones S11 y S12, una de las cuales tiene el mismo tamaño que S2: es un enfoque probable para muchos algoritmos y, a veces, puede describirse numéricamente como una secuencia de Fibonacci.

DVK
fuente
0

Permítanme agregar otra estructura de datos a la suya: árboles de Fibonacci. Son interesantes porque el cálculo de la siguiente posición en el árbol se puede hacer mediante la mera adición de los nodos anteriores:

http://xw2k.nist.gov/dads/html/fibonacciTree.html

Se relaciona bien con la discusión de templatetypedef sobre árboles AVL (un árbol AVL puede, en el peor de los casos, tener estructura de fibonacci). También he visto búferes extendidos en pasos de fibonacci en lugar de potencias de dos en algunos casos.

DOY RESPUESTAS MALGAS
fuente
0

Solo para agregar una trivia sobre esto, los números de Fibonacci describen la cría de conejos. Empiezas con (1, 1), dos conejos, y luego su población crece exponencialmente.

Mihaela
fuente
0

Su cálculo como una potencia de la matriz [[0,1], [1,1]] puede considerarse como el problema más primitivo de la Investigación Operativa (algo así como el Dilema del Prisionero es el problema más primitivo de la Teoría de Juegos).

Dmitry Rubanovich
fuente
0

Los símbolos con frecuencias que son números de fibonacci sucesivos crean árboles huffman de profundidad máxima, cuyos árboles corresponden a los símbolos fuente que se codifican con códigos binarios de longitud máxima. Las frecuencias de los símbolos de origen que no son de Fibonacci crean árboles más equilibrados, con códigos más cortos. La longitud del código tiene implicaciones directas en la complejidad de la descripción de la máquina de estados finitos que es responsable de decodificar un código huffman dado.


Conjetura: La primera imagen (fib) se comprimirá a 38 bits, mientras que la segunda (uniforme) a 50 bits. Parece que cuanto más cerca estén las frecuencias de los símbolos de origen de los números de fibonacci, más corta será la secuencia binaria final, mejor será la compresión, quizás óptima en el modelo de huffman.

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

ingrese la descripción de la imagen aquí

Otras lecturas:

Buro, M. (1993). Sobre la longitud máxima de los códigos Huffman. Cartas de procesamiento de información, 45 (5), 219-223. doi: 10.1016 / 0020-0190 (93) 90207-p

Franco
fuente