Чому цифри Фібоначчі значущі в інформатиці?


76

Числа Фібоначчі стали популярним вступом до рекурсії для студентів комп'ютерних наук, і існує вагомий аргумент, що вони зберігаються в природі. З цих причин багато хто з нас знайомі з ними.

Вони також існують в межах Інформатики в іншому місці; у дивно ефективних структурах даних та алгоритмах, заснованих на послідовності.

Є два основні приклади, які спадають на думку:

  • Купи Фібоначчі, які мають амортизований час роботи краще, ніж біноміальні купи.
  • Пошук Фібоначчі, який розділяє час роботи O (log N) із двійковим пошуком в упорядкованому масиві.

Чи існує якась особлива властивість цих чисел, яка дає їм перевагу над іншими числовими послідовностями? Це просторова якість? Які ще можливі програми вони могли мати?

Мені здається дивним, оскільки існує багато природних послідовностей чисел, які трапляються в інших рекурсивних задачах, але я ніколи не бачив каталонської купи.


Хіба знайомство не було б найбільшим фактором?
Циклон

13
Я думаю, що такий тип запитань належить або до теорії теорії, або до математичного досліджень. Інтригує, але ВІД.
Fred Foo

7
@larsmans Не погоджуюсь. Одне з найцікавіших питань, яке я бачив останнім часом, і його актуальність підтверджується тим фактом, що як програмісти ми бачимо його скрізь.
Mike

2
Здається, це пов’язано з «Застосуваннями послідовності Фібоначчі», заданими на math.stackexchange.com . Є й інші подібні запитання щодо конкретних застосувань послідовності. Це, мабуть, гарне місце для обговорення "властивостей" послідовності загалом, і як це стосується більш загальних алгоритмів. Мені здається, що це питання наближається до обговорення обчислювальної теорії, яка може отримати там більше / більше уваги.
RobertB

1
Я з ларсманами щодо цього (очевидно), і я згоден, що кстеорія була б ще одним хорошим місцем для цього.
RobertB

Відповіді:


69

Числа Фібоначчі мають всілякі справді приємні математичні властивості, що роблять їх чудовими в галузі інформатики. Ось декілька:

  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) під час якоїсь операції. Це справжня причина того, що купи Фібоначчі називаються купами Фібоначчі - доказ того, що кількість купив після хв, що змінюються, включає обмеження кількості вузлів, які ви можете мати на певній глибині, числом Фібоначчі.
  2. Будь-яке число можна записати як суму унікальних чисел Фібоначчі. Ця властивість чисел Фібоначчі є критично важливою для того, щоб пошук Фібоначчі взагалі працював; якби ви не змогли скласти унікальні числа Фібоначчі в будь-яке можливе число, цей пошук не спрацював би. Порівняйте це з багатьма іншими серіями, наприклад 3 n або каталонськими номерами. Це також частково, чому, на мою думку, багато алгоритмів люблять степені двох.
  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. Вони педагогічно корисні. Викладання рекурсії складно, і серія Фібоначчі - чудовий спосіб її ввести. Ви можете говорити про пряму рекурсію, про мемоізацію або про динамічне програмування під час введення серії. Крім того, дивовижна замкнута форма для чисел Фібоначчі часто викладається як вправа на індукцію або при аналізі нескінченних рядів, а відповідне матричне рівняння для чисел Фібоначчі зазвичай вводиться в лінійну алгебру як мотивація власних векторів і власних значень. Я думаю, що це одна з причин того, що вони такі гучні на вступних заняттях.

Я впевнений, що причин більше, ніж просто ця, але я впевнений, що деякі з цих причин є головними факторами. Сподіваюся, це допомагає!


30
Все це також стосується повноважень 2 ;-)

Формування каталонських номерів у порядку "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
А. Рекс

3
У №2 важливо, щоб числа Фібоначчі не були послідовними, тому сума може бути унікальною.
кунігами

1
Що робить пошук Фібоначчі корисним, так це те, що їх породжуючий поліном дорівнює x ^ 2-x-1. Пошук Фібоначчі ділиться властивостями із функцією пошуку золотого перетину для мінімуму безперервної функції.
Alexandre C.

@Alexandre C. - Чи можете ви детальніше сказати це? Я не знайомий з тим, чому саме цей породжуючий поліном є корисним.
templatetypedef

4

Найбільший спільний дільник - ще одна магія; бачити це надто багато магії. Але числа Фібоначчі легко розрахувати; також вона має конкретну назву. Наприклад, натуральні числа 1,2,3,4,5 мають занадто багато логіки; всі прості числа знаходяться в них; сума 1..n є обчислюваною, кожен може виробляти з іншими, ... але про них ніхто не дбає :)

Одна важлива річ, про яку я забув, - це Золотий перетин , який має дуже важливий вплив у реальному житті (наприклад, ви любите широкі монітори :)


1

Якщо у вас є алгоритм, який можна успішно пояснити простою та стислою манорою на зрозумілих прикладах у CS та природі, який кращий навчальний засіб хтось може придумати?


1

Послідовності Фібоначчі справді зустрічаються всюди в природі / житті. Вони корисні для моделювання росту популяцій тварин, росту клітин рослин, форми сніжинки, форми рослин, криптографії та, звичайно, інформатики. Я чув, що це називають ДНК-моделлю природи.

Про купу Фібоначчі вже згадувалося; кількість дочірніх елементів кожного вузла в купі не перевищує 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_20090723185630687


0

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


0

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

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

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


0

Просто щоб додати дрібниці щодо цього, цифри Фібоначчі описують панірування кроликів. Ви починаєте з (1, 1), двох кроликів, а потім їх популяція зростає в геометричній прогресії.


0

Їх обчислення як степеня матриці [[0,1], [1,1]] можна розглядати як найпримітивнішу проблему оперативних досліджень (подібно до дилеми в'язня - це найпримітивніша проблема теорії ігор).


0

Символи з частотами, що є послідовними числами Фібоначчі, створюють дерева глибини Хафмана з максимальною глибиною, які відповідають вихідним символам, кодованим двійковими кодами максимальної довжини. Частоти символів джерела, що не відрізняються від Фібоначчі, створюють більш збалансовані дерева з коротшими кодами. Довжина коду безпосередньо впливає на складність опису кінцевого автомата, який відповідає за декодування даного коду Хаффмана.


Припущення: 1-е (фіб) зображення буде стиснуто до 38 біт, тоді як друге (рівномірне) 50 біт. Здається, чим ближче ваші вихідні символьні частоти до цифр Фібоначчі, тим коротша кінцева двійкова послідовність, тим краща компресія, можливо оптимальна в моделі Хаффмана.

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

введіть тут опис зображення

Подальше читання:

Буро, М. (1993). Про максимальну довжину кодів Хаффмана. Листи з обробки інформації, 45 (5), 219-223. doi: 10.1016 / 0020-0190 (93) 90207-с

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.