Warum sind Fibonacci-Zahlen in der Informatik von Bedeutung?


76

Fibonacci-Zahlen sind für Informatikstudenten zu einer beliebten Einführung in die Rekursion geworden, und es gibt ein starkes Argument dafür, dass sie in der Natur bestehen bleiben. Aus diesen Gründen sind viele von uns mit ihnen vertraut.

Sie existieren auch anderswo in der Informatik; in überraschend effizienten Datenstrukturen und Algorithmen basierend auf der Sequenz.

Es gibt zwei Hauptbeispiele, die mir in den Sinn kommen:

Gibt es eine spezielle Eigenschaft dieser Zahlen, die ihnen einen Vorteil gegenüber anderen numerischen Sequenzen verschafft? Ist es eine räumliche Qualität? Welche anderen möglichen Anwendungen könnten sie haben?

Es scheint mir seltsam, da es viele natürliche Zahlenfolgen gibt, die bei anderen rekursiven Problemen auftreten, aber ich habe noch nie einen katalanischen Haufen gesehen.


Wäre Vertrautheit nicht der größte Faktor?
Zyklon

13
Ich denke, diese Art von Frage gehört entweder zur Theorie oder zur Mathematik. Faszinierend, aber OT.
Fred Foo

7
@ Larsmans nicht einverstanden. Eine der interessantesten Fragen, die ich in letzter Zeit gesehen habe, und ihre Relevanz wird durch die Tatsache gestützt, dass wir sie als Programmierer überall sehen.
Mike

2
Dies scheint mit den "Anwendungen der Fibonacci-Sequenz" zu tun zu haben, die auf math.stackexchange.com abgefragt wurden . Dort gibt es andere ähnliche Fragen zu bestimmten Anwendungen der Sequenz. Dies ist wahrscheinlich ein guter Ort, um die "Eigenschaften" der Sequenz im Allgemeinen und für allgemeinere Algorithmen zu diskutieren. Es scheint mir, dass sich diese Frage einer Diskussion der Computertheorie nähert, die dort besser / mehr Beachtung finden könnte.
RobertB

1
Ich bin mit Larsmans in diesem Fall (offensichtlich) und ich stimme zu, dass die Theorie ein weiterer guter Ort wäre, um dies zu tun.
RobertB

Antworten:


69

Die Fibonacci-Zahlen haben alle möglichen wirklich schönen mathematischen Eigenschaften, die sie in der Informatik ausgezeichnet machen. Hier sind einige:

  1. Sie wachsen exponentiell schnell. Eine interessante Datenstruktur, in der die Fibonacci-Reihe auftaucht, ist der AVL-Baum, eine Form des selbstausgleichenden Binärbaums. Die Intuition hinter diesem Baum ist, dass jeder Knoten einen Ausgleichsfaktor beibehält, so dass sich die Höhen des linken und rechten Teilbaums um höchstens eins unterscheiden. Aus diesem Grund können Sie sich vorstellen, dass die minimale Anzahl von Knoten, die erforderlich sind, um einen AVL-Baum der Höhe h zu erhalten, durch eine Wiederholung definiert wird, die wie folgt aussieht: N (h + 2) ~ = N (h) + N (h + 1), Das sieht der Fibonacci-Serie sehr ähnlich. Wenn Sie die Mathematik ausarbeiten, können Sie zeigen, dass die Anzahl der Knoten, die erforderlich sind, um einen AVL-Baum der Höhe h zu erhalten, F (h + 2) - 1 ist. Da die Fibonacci-Reihe exponentiell schnell wächst, bedeutet dies, dass die Höhe einer AVL beträgt Baum ist höchstens logarithmisch in der Anzahl der Knoten, was Ihnen die O (lg n) Suchzeit gibt, die wir über ausgeglichene Binärbäume kennen und lieben. Eigentlich, Wenn Sie die Größe einer Struktur mit einer Fibonacci-Zahl verknüpfen können, erhalten Sie bei einer Operation wahrscheinlich eine O (lg n) -Laufzeit. Dies ist der wahre Grund, warum Fibonacci-Heaps als Fibonacci-Heaps bezeichnet werden - der Beweis, dass die Anzahl der Heaps nach einer Warteschlange min die Begrenzung der Anzahl der Knoten, die Sie in einer bestimmten Tiefe haben können, mit einer Fibonacci-Zahl beinhaltet.
  2. Jede Zahl kann als Summe eindeutiger Fibonacci-Zahlen geschrieben werden. Diese Eigenschaft der Fibonacci-Zahlen ist entscheidend, damit die Fibonacci-Suche überhaupt funktioniert. Wenn Sie keine eindeutigen Fibonacci-Zahlen zu einer möglichen Zahl addieren könnten, würde diese Suche nicht funktionieren. Vergleichen Sie dies mit vielen anderen Serien wie 3 n oder den katalanischen Zahlen. Dies ist auch teilweise der Grund, warum viele Algorithmen wie Zweierpotenzen, denke ich.
  3. Die Fibonacci-Zahlen sind effizient berechenbar. Die Tatsache, dass die Reihe äußerst effizient generiert werden kann (Sie können die ersten n Terme in O (n) oder einen beliebigen Term in O (lg n) erhalten), dann wären viele der Algorithmen, die sie verwenden, nicht praktikabel. Das Generieren katalanischer Zahlen ist ziemlich rechenintensiv, IIRC. Darüber hinaus haben die Fibonacci-Zahlen eine schöne Eigenschaft, bei der wir bei zwei aufeinanderfolgenden Fibonacci-Zahlen, beispielsweise F (k) und F (k + 1), die nächste oder vorherige Fibonacci-Zahl leicht berechnen können, indem wir die beiden Werte addieren (F (k) + F (k + 1) = F (k + 2)) oder Subtrahieren (F (k + 1) - F (k) = F (k - 1)). Diese Eigenschaft wird in mehreren Algorithmen in Verbindung mit Eigenschaft (2) ausgenutzt, um Zahlen in die Summe der Fibonacci-Zahlen zu zerlegen. Beispielsweise verwendet die Fibonacci-Suche dies, um Werte im Speicher zu finden.
  4. Sie sind pädagogisch nützlich. Das Unterrichten von Rekursion ist schwierig, und die Fibonacci-Reihe ist eine großartige Möglichkeit, sie einzuführen. Sie können bei der Einführung der Serie über direkte Rekursion, Memoisierung oder dynamische Programmierung sprechen. Darüber hinaus wird die erstaunliche geschlossene Form für die Fibonacci-Zahlen häufig als Übung zur Induktion oder zur Analyse unendlicher Reihen gelehrt, und die zugehörige Matrixgleichung für Fibonacci-Zahlen wird üblicherweise in der linearen Algebra als Motivation für Eigenvektoren und Eigenwerte eingeführt. Ich denke, dass dies einer der Gründe ist, warum sie in Einführungskursen so bekannt sind.

Ich bin sicher, dass es mehr Gründe als nur das gibt, aber ich bin sicher, dass einige dieser Gründe die Hauptfaktoren sind. Hoffe das hilft!


30
All dies gilt auch für Potenzen von 2 ;-)

Generierung katalanischer Zahlen in der Reihenfolge in "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
In # 2 ist es wichtig, dass die Fibonacci-Zahlen nicht aufeinander folgen, damit die Summe eindeutig sein kann.
Kunigami

1
Was die Fibonacci-Suche nützlich macht, ist, dass ihr generierendes Polynom x ^ 2-x-1 ist. Die Fibonacci-Suche teilt Eigenschaften mit der Goldenen Schnitt-Suche für das Minimum einer kontinuierlichen Funktion.
Alexandre C.

@Alexandre C.- Können Sie das näher erläutern? Ich weiß nicht, warum dieses bestimmte generierende Polynom nützlich ist.
Templatetypedef

4

Der größte gemeinsame Teiler ist eine andere Magie; sehen Sie dies für zu viele Magie. Fibonacci-Zahlen sind jedoch leicht zu berechnen. es hat auch einen bestimmten Namen. Zum Beispiel haben natürliche Zahlen 1,2,3,4,5 zu viele Logik; alle Primzahlen sind in ihnen; Die Summe von 1..n ist berechenbar, jeder kann mit anderen produzieren, ... aber niemand kümmert sich um sie :)

Eine wichtige Sache, die ich vergessen habe, ist der Goldene Schnitt , der im wirklichen Leben sehr wichtige Auswirkungen hat (zum Beispiel mögen Sie breite Monitore :)


1

Wenn Sie einen Algorithmus haben, der auf einfache und prägnante Weise mit verständlichen Beispielen in CS und Natur erfolgreich erklärt werden kann, welches bessere Lehrmittel könnte sich jemand einfallen lassen?


1

Fibonacci-Sequenzen sind in der Tat überall in der Natur / im Leben zu finden. Sie sind nützlich bei der Modellierung des Wachstums von Tierpopulationen, des Pflanzenzellwachstums, der Schneeflockenform, der Pflanzenform, der Kryptographie und natürlich der Informatik. Ich habe gehört, dass es als DNA-Muster der Natur bezeichnet wird.

Fibonacci-Haufen wurden bereits erwähnt; Die Anzahl der untergeordneten Knoten jedes Knotens im Heap beträgt höchstens log (n). Auch der Teilbaum, der einen Knoten mit m Kindern startet, ist mindestens (m + 2) die Fibonacci-Zahl.

Torrent-ähnliche Protokolle, die ein System von Knoten und Superknoten verwenden, verwenden Fibonacci, um zu entscheiden, wann ein neuer Superknoten benötigt wird und wie viele Unterknoten er verwalten wird. Sie führen ein Knotenmanagement basierend auf der Fibonacci-Spirale (Goldener Schnitt) durch. Auf dem Foto unten sehen Sie, wie Knoten aufgeteilt / zusammengeführt werden (von einem großen Quadrat in kleinere aufgeteilt und umgekehrt). Siehe Foto: http://smartpei.typepad.com/.a/6a00d83451db7969e20115704556bd970b-pi

Einige Vorkommen in der Natur

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_20090723185630687jj


0

Ich glaube nicht, dass es eine endgültige Antwort gibt, aber eine Möglichkeit besteht darin, dass die Operation zum Teilen einer Menge S in zwei Partitionen S1 und S2, von denen eine in Unterpartitionen S11 und S12 unterteilt wird, von denen eine die gleiche Größe hat wie S2 - ist ein wahrscheinlicher Ansatz für viele Algorithmen und kann manchmal numerisch als Fibonacci-Sequenz beschrieben werden.


0

Lassen Sie mich Ihrer Daten eine weitere Datenstruktur hinzufügen: Fibonacci-Bäume. Sie sind interessant, weil die Berechnung der nächsten Position im Baum durch einfaches Hinzufügen der vorherigen Knoten erfolgen kann:

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

Es passt gut zur Diskussion von templatetypedef über AVL-Bäume (ein AVL-Baum kann im schlimmsten Fall eine Fibonacci-Struktur haben). Ich habe auch Puffer gesehen, die in einigen Fällen eher in Fibonacci-Schritten als in Zweierpotenzen erweitert wurden.


0

Um nur eine Kleinigkeit hinzuzufügen, beschreiben Fibonacci-Zahlen die Panade von Kaninchen. Sie beginnen mit (1, 1), zwei Kaninchen, und dann wächst ihre Population exponentiell.


0

Ihre Berechnung als Potenz der [[0,1], [1,1]] - Matrix kann als das primitivste Problem der operativen Forschung angesehen werden (ähnlich wie das Gefangenendilemma ist das primitivste Problem der Spieltheorie).


0

Symbole mit Frequenzen, die aufeinanderfolgende Fibonacci-Zahlen sind, erzeugen Huffman-Bäume mit maximaler Tiefe. Diese Bäume entsprechen Quellensymbolen, die mit Binärcodes maximaler Länge codiert werden. Nicht-Fibonacci-Quellensymbolfrequenzen erzeugen ausgeglichenere Bäume mit kürzeren Codes. Die Codelänge hat direkte Auswirkungen auf die Beschreibungskomplexität der Finite-State-Maschine, die für die Decodierung eines bestimmten Huffman-Codes verantwortlich ist.


Vermutung: Das 1. (Fib) Bild wird auf 38 Bit komprimiert, während das 2. (Uniform) mit 50 Bit komprimiert wird. Es scheint, dass je näher Ihre Quellensymbolfrequenzen an Fibonacci-Zahlen liegen, desto kürzer die endgültige Binärsequenz ist, desto besser ist die Komprimierung, möglicherweise optimal im Huffman-Modell.

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

Geben Sie hier die Bildbeschreibung ein

Weiterführende Literatur:

Buro, M. (1993). Über die maximale Länge von Huffman-Codes. Information Processing Letters, 45 (5), 219-223. doi: 10.1016 / 0020-0190 (93) 90207-p

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.