Почему числа Фибоначчи важны в информатике?


числа Фибоначчи стали популярным введение в рекурсию для студентов компьютерных наук и есть сильный аргумент, что они сохраняются в природе. По этим причинам, многие из нас знакомы с ними.

Они также существуют в компьютерной науке и в других местах; в удивительно эффективных структурах данных и алгоритмах, основанных на последовательности.

есть два основных примера, которые приходят на ум:

  • кучи Фибоначчи что есть лучше амортизированное время работы, чем биномиальное отвалы.
  • поиск Фибоначчи акции O (log N) время работы с двоичным кодом поиск по упорядоченному массиву.

есть ли какое-то особое свойство этих чисел, которое дает им преимущество над другими числовыми последовательностями? Это пространственное качество? Какие еще возможные приложения они могут иметь?

кажется странно для меня, как есть много натуральных последовательностей чисел, которые происходят в других рекурсивных задач, но я никогда не видел каталанский кучи.

8 74

8 ответов:

числа Фибоначчи имеют все виды действительно хороших математических свойств, которые делают их превосходными в информатике. Вот несколько:

  1. они растут экспоненциально быстро. одна интересная структура данных, в которой появляется ряд Фибоначчи,-это дерево AVL, форма самобалансирующегося двоичного дерева. Интуиция за этим деревом заключается в том, что каждый узел поддерживает коэффициент баланса, так что высоты левого и правого поддерева отличаются не более чем на один. Из-за этого вы можете думать о минимальном количестве узлов, необходимых для получения дерева AVL высоты h, определяется повторением, которое выглядит как N(h + 2) ~= N(h) + N(h + 1), что очень похоже на ряд Фибоначчи. Если вы разработаете математику, вы можете показать, что количество узлов, необходимых для получения дерева AVL высотой h, равно F(h + 2) - 1. Поскольку ряд Фибоначчи растет экспоненциально быстро, это означает, что высота дерева AVL является не более логарифмической по числу узлов, что дает вам время поиска O(lg n) мы знаем и любим о сбалансированных бинарных деревьях. На самом деле, если вы можете связать размер некоторой структуры с числом Фибоначчи, вы, вероятно, получите время выполнения O(lg n) на некоторой операции. Это реальная причина того, что кучи Фибоначчи называются кучами Фибоначчи - доказательство того, что количество куч после удаления min включает в себя ограничение количества узлов, которые вы можете иметь на определенной глубине с числом Фибоначчи.
  2. любое число может быть записано как сумма уникальные числа Фибоначчи. это свойство чисел Фибоначчи имеет решающее значение для того, чтобы поиск Фибоначчи работал вообще; если вы не можете сложить уникальные числа Фибоначчи в любое возможное число, этот поиск не будет работать. Сравните это с большим количеством других серий, как 3n или каталонские числа. Это также частично объясняет, почему многие алгоритмы, такие как степени двух, я думаю.
  3. числа Фибоначчи эффективно вычислимы. в тот факт, что ряд может быть сгенерирован чрезвычайно эффективно (вы можете получить первые 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), чтобы разбить числа на сумму чисел Фибоначчи. Например, поиск Фибоначчи используется для поиска значений в памяти, в то время как аналогичный алгоритм может быть использован для быстрого и эффективного расчета логарифмов.
  4. они педагогически полезно. обучение рекурсии сложно, и ряд Фибоначчи отличный способ представить его. Можно говорить о прямой рекурсии, о мемоизации, или о динамическом программировании при внедрении серии. Кроме того, удивительный закрытая форма для чисел Фибоначчи часто преподается как упражнение в индукции или в анализе бесконечных рядов и связанных с ними матричное уравнение для чисел Фибоначчи обычно вводится в линейной алгебре в качестве мотивации за собственные векторы и собственные значения. Я думаю, что это это одна из причин того, что они так громко выступают на вводных занятиях.

Я уверен, что есть больше причин, чем просто это, но я уверен, что некоторые из этих причин являются основными факторами. Надеюсь, это поможет!

Наибольший Общий Делитель это еще одна магия; см. этой слишком много магии. Но Числа Фибоначчи легко вычислить; также он имеет определенное имя. Например, натуральные числа 1,2,3,4,5 имеют слишком много логики; все простые числа находятся внутри них; сумма 1..n вычислимо, каждый из них может производить с другими,... но никто о них не заботится:)

одна важная вещь, о которой я забыл, это Золотой Пропорции, что имеет очень важное значение влияние в реальной жизни (например, вам нравятся широкие мониторы:)

Если у вас есть алгоритм, который может быть успешно объяснены в простой и лаконичной mannor с понятными примерами в CS и природа, что может быть лучше учебного пособия мог кто-то придумать?

последовательности Фибоначчи действительно встречаются везде в природе / жизни. Они полезны при моделировании роста популяций животных, роста растительных клеток, формы снежинок, формы растений, криптографии и, конечно же, компьютерных наук. Я слышал, что это называется образцом ДНК природы.

куча Фибоначчи уже упоминалась; число потомков каждого узла в куче не превышает log (n). Также поддерево, начинающее узел с m дочерними элементами, является по крайней мере (m+2) - м Фибоначчи число.

торрент, таких как протоколы, которые используют систему узлов и суперузлов использовать Фибоначчи, чтобы определить, когда нужен новый супер узел и подузлы сколько это обойдется. Они делают управление узлами на основе спирали Фибоначчи (золотое сечение). См. фото ниже, как узлы разделены / объединены (разделены с одного большого квадрата на меньшие и наоборот). Смотрите фото: 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

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

Я не думаю, что есть окончательный ответ, но одна возможность заключается в том, что операция деления множества S на два раздела S1 и S2, один из которых затем делится на подразделы S11 и S12, один из которых имеет тот же размер, что и S2,-это вероятный подход ко многим алгоритмам, и иногда его можно численно описать как последовательность Фибоначчи.

позвольте мне добавить еще одну структуру данных к вашей: деревья Фибоначчи. Они интересны тем, что вычисление следующей позиции в дереве может быть сделано простым добавлением предыдущих узлов:

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

Это хорошо связано с обсуждением templatetypedef на AVL-деревьях (дерево AVL может в худшем случае иметь структуру Фибоначчи). Я также видел буферы, расширенные в шагах Фибоначчи, а не в степенях двух в некоторых случаях.

просто чтобы добавить мелочи об этом, Числа Фибоначчи описывают панировку кроликов. Вы начинаете с (1, 1), двух кроликов, а затем их популяция растет экспоненциально .

их вычисление как степень [[0,1], [1,1]] матрицы можно рассматривать как самую примитивную задачу оперативного исследования (вроде как дилемма заключенного-самая примитивная задача теории игр).