Почему числа Фибоначчи значимы в информатике?
числа Фибоначчи стали популярным введение в рекурсию для студентов компьютерных наук и есть сильный аргумент, что они сохраняются в природе. По этим причинам, многие из нас знакомы с ними.
Они также существуют в компьютерной науке и в других местах; в удивительно эффективных структурах данных и алгоритмах, основанных на последовательности.
есть два основных примера, которые приходят на ум:
- кучи Фибоначчи что есть лучше амортизированное время выполнения чем binomial отвалы.
- поиск Фибоначчи акции O (log N) время работы с двоичным кодом поиск по упорядоченному массиву.
есть ли какое-то специальное свойство этих чисел, которое дает им преимущество над другими числовыми последовательностями? Это пространственное качество? Какие еще возможные приложения они могут иметь?
кажется странно для меня, так как есть много натуральных последовательностей чисел, которые происходят в других рекурсивных задачах, но я никогда не видел каталанский кучи.
8 ответов
числа Фибоначчи имеют всевозможные действительно хорошие математические свойства, которые делают их отличными в информатике. Вот несколько:
- они растут экспоненциально быстро. одна интересная структура данных, в которой появляется ряд Фибоначчи, - это дерево AVL, форма самобалансирующегося двоичного дерева. Интуиция за этим деревом заключается в том, что каждый узел поддерживает коэффициент баланса, так что высоты левого и правого поддерева различаются не более чем на один. Из-за этого вы можете подумать о минимальном количестве узлов, необходимых для получения дерева AVL высоты h, определяется повторением, которое выглядит как N(h + 2) ~= N(h) + N(h + 1), что очень похоже на ряд Фибоначчи. Если вы разработаете математику, вы можете показать, что количество узлов, необходимых для получения дерева AVL высоты h, равно F(h + 2) - 1. Поскольку ряд Фибоначчи растет экспоненциально быстро, это означает, что высота дерева AVL не более логарифмична по количеству узлов, что дает вам время поиска O(lg n) мы знаем и любим сбалансированные бинарные деревья. На самом деле, если вы можете связать размер некоторой структуры с числом Фибоначчи, вы, вероятно, получите o(lg n) runtime для некоторой операции. Это реальная причина того, что кучи Фибоначчи называются кучами Фибоначчи-доказательство того, что количество куч после dequeue min включает в себя ограничение количества узлов, которые вы можете иметь на определенной глубине с числом Фибоначчи.
- любое число может быть записано как сумма уникальные числа Фибоначчи. это свойство чисел Фибоначчи имеет решающее значение для работы поиска Фибоначчи вообще; если вы не можете сложить уникальные числа Фибоначчи в любое возможное число, этот поиск не будет работать. Сравните это с множеством других серий, таких как 3n или каталонские номера. Это также частично объясняет, почему многие алгоритмы, такие как полномочия двух, я думаю.
- числа Фибоначчи эффективно вычислимы. в тот факт, что ряд может быть сгенерирован чрезвычайно эффективно (вы можете получить первые N членов в O(n) или любой произвольный член в O(lg n)), тогда многие алгоритмы, которые их используют, не будут практичными. Генерирование каталонских чисел довольно сложно вычислить, IIRC. Кроме того, числа Фибоначчи имеют хорошее свойство, где, учитывая любые два последовательных числа Фибоначчи, скажем, F (k) и F(k + 1), мы можем легко вычислить следующее или предыдущее число Фибоначчи, добавив два значения (F(k) + F(k + 1) = F (k + 2)) или вычитание их(F(k + 1) - F(k) = F (k - 1)). Это свойство используется в нескольких алгоритмах вместе со свойством (2) для разбиения чисел на сумму чисел Фибоначчи. Например, поиск Фибоначчи используется для поиска значений в памяти, в то время как аналогичный алгоритм может быть использован для быстрого и эффективного расчета логарифмов.
- они педагогически полезно. обучение рекурсии сложно, и серия Фибоначчи отличный способ представить его. Вы можете говорить о прямой рекурсии, о запоминании или о динамическом программировании при введении серии. Кроме того, удивительный закрытая форма для чисел Фибоначчи часто преподается как упражнение в индукции или в анализе бесконечных рядов и связанных с ними матричное уравнение для чисел Фибоначчи обычно вводится в линейную алгебру как мотивация собственных векторов и собственных значений. Я думаю, что это это одна из причин, по которой они так популярны на вводных занятиях.
Я уверен, что есть больше причин, чем просто это, но я уверен, что некоторые из этих причин являются основными факторами. Надеюсь, это поможет!
Наибольший Общий Делитель другое магия; см. этой слишком много магии. Но Числа Фибоначчи легко вычислить; также он имеет определенное название. Например, натуральные числа 1,2,3,4,5 имеют слишком много логики; все простые числа находятся внутри них; сумма 1..N вычислим, каждый из них может производить с другими,... но никто о них не заботится:)
одна важная вещь, о которой я забыл, это Золотой Пропорции, который имеет очень важную влияние в реальной жизни (например, вам нравятся широкие мониторы :)
Если у вас есть алгоритм, который можно успешно объяснить простым и кратким маннором с понятными примерами в CS и nature, какой лучший инструмент обучения может кто-то придумать?
последовательности Фибоначчи действительно встречаются повсюду в природе и жизни. Они полезны при моделировании роста популяций животных, роста растительных клеток, формы снежинок, формы растений, криптографии и, конечно, информатики. Я слышал, что это называют ДНК-паттерном природы.
куча Фибоначчи уже упоминалась; число дочерних элементов каждого узла в куче не более log (n). Также поддерево, запускающее узел с m дочерними элементами, по крайней мере (m+2) - го Фибоначчи число.
Torrent как протоколы, которые используют систему узлов и супернодов, используют Фибоначчи, чтобы решить, когда нужен новый суперузел и сколько подузлов он будет управлять. Они делают управление узлами на основе спирали Фибоначчи (золотое сечение). См. фото ниже, как узлы разбиваются / объединяются (разбиваются с одного большого квадрата на меньшие и наоборот). Смотрите фото: http://smartpei.typepad.com/.a/6a00d83451db7969e20115704556bd970b-pi
некоторые явления в природе
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
Я не думаю, что есть окончательный ответ, но одна из возможностей заключается в том, что операция деления множества S на два раздела S1 и S2, один из которых затем делится на подразделы S11 и S12, один из которых имеет тот же размер, что и S2,-это вероятный подход ко многим алгоритмам и который иногда можно численно описать как последовательность Фибоначчи.
позвольте мне добавить еще одну структуру данных к вашей: деревья Фибоначчи. Они интересны тем, что вычисление следующей позиции в дереве может быть выполнено простым добавлением предыдущих узлов:
http://xw2k.nist.gov/dads/html/fibonacciTree.html
Это хорошо связано с обсуждением templatetypedef на AVL-деревьях (дерево AVL может в худшем случае иметь структуру Фибоначчи). Я также видел буферы, расширенные в шагах Фибоначчи, а не в степенях двух в некоторых случаях.
просто чтобы добавить мелочи об этом, числа Фибоначчи описывают панировку кроликов. Вы начинаете с (1, 1), двух кроликов, а затем их популяция растет экспоненциально .
их вычисление как мощность [[0,1], [1,1]] матрицы можно рассматривать как самую примитивную проблему оперативных исследований (вроде как дилемма заключенного-самая примитивная проблема теории игр).