Tại sao số Fibonacci lại quan trọng trong khoa học máy tính?


76

Số Fibonacci đã trở thành một giới thiệu phổ biến về đệ quy cho sinh viên Khoa học Máy tính và có một lập luận mạnh mẽ rằng chúng tồn tại trong tự nhiên. Vì những lý do này, nhiều người trong chúng ta đã quen thuộc với chúng.

Chúng cũng tồn tại trong Khoa học Máy tính ở những nơi khác; trong cấu trúc dữ liệu và thuật toán hiệu quả đáng ngạc nhiên dựa trên trình tự.

Có hai ví dụ chính xuất hiện trong tâm trí:

  • Các đống Fibonacci có thời gian chạy phân bổ tốt hơn các đống nhị thức.
  • Tìm kiếm Fibonacci chia sẻ thời gian chạy O (log N) với tìm kiếm nhị phân trên một mảng có thứ tự.

Có tính chất đặc biệt nào của những con số này giúp chúng có lợi thế hơn các dãy số khác không? Nó có phải là một chất lượng không gian? Họ có thể có những ứng dụng khả thi nào khác?

Nó có vẻ lạ đối với tôi vì có rất nhiều dãy số tự nhiên xảy ra trong các bài toán đệ quy khác, nhưng tôi chưa bao giờ thấy một đống Catalan .


Sự quen thuộc sẽ không phải là yếu tố lớn nhất?
Cơn bão

13
Tôi nghĩ loại câu hỏi này thuộc về SE cstheory hoặc toán học. Hấp dẫn, nhưng OT.
Fred Foo,

7
@larsmans Không đồng ý. Một trong những câu hỏi thú vị nhất mà tôi thấy gần đây, và sự liên quan của nó được hỗ trợ bởi thực tế là với tư cách là các lập trình viên, chúng ta thấy nó ở khắp mọi nơi.
Mike,

2
Điều này dường như liên quan đến "Ứng dụng của dãy fibonacci" được hỏi trên math.stackexchange.com . Có những câu hỏi tương tự khác ở đó về các ứng dụng cụ thể của trình tự. Đó có lẽ là một nơi tốt để thảo luận về "thuộc tính" của chuỗi nói chung và vì nó áp dụng cho các thuật toán tổng quát hơn. Đối với tôi, có vẻ như câu hỏi này đang tiến tới một cuộc thảo luận về lý thuyết tính toán có thể được chú ý nhiều hơn / tốt hơn ở đó.
RobertB,

1
Tôi đồng ý với larsmans về điều này (rõ ràng), và tôi đồng ý rằng cstheory sẽ là một nơi tốt khác để đi với điều này.
RobertB,

Câu trả lời:


69

Các số Fibonacci có tất cả các loại tính chất toán học thực sự tốt đẹp khiến chúng trở nên xuất sắc trong khoa học máy tính. Đây là một số:

  1. Chúng phát triển nhanh theo cấp số nhân. Một cấu trúc dữ liệu thú vị mà chuỗi Fibonacci xuất hiện là cây AVL, một dạng cây nhị phân tự cân bằng. Trực giác đằng sau cây này là mỗi nút duy trì một hệ số cân bằng sao cho chiều cao của cây con bên trái và bên phải chỉ khác nhau nhiều nhất là một. Do đó, bạn có thể nghĩ về số lượng nút tối thiểu cần thiết để có được một cây AVL có chiều cao h được xác định bởi một sự lặp lại giống như N (h + 2) ~ = N (h) + N (h + 1), trông rất giống với chuỗi Fibonacci. Nếu bạn tính toán, bạn có thể chỉ ra rằng số nút cần thiết để có được cây AVL có chiều cao h là F (h + 2) - 1. Bởi vì chuỗi Fibonacci phát triển nhanh theo cấp số nhân, điều này có nghĩa là chiều cao của AVL cây có số lượng nút nhiều nhất là logarit, mang lại cho bạn thời gian tra cứu O (lg n) mà chúng tôi biết và yêu thích về cây nhị phân cân bằng. Trong thực tế, nếu bạn có thể ràng buộc kích thước của một số cấu trúc bằng số Fibonacci, bạn có thể nhận được thời gian chạy O (lg n) trên một số hoạt động. Đây là lý do thực sự mà các đống Fibonacci được gọi là Fibonacci heap - bằng chứng cho thấy số lượng đống sau một dequeue min liên quan đến việc giới hạn số lượng nút bạn có thể có ở một độ sâu nhất định với một số Fibonacci.
  2. Bất kỳ số nào cũng có thể được viết dưới dạng tổng các số Fibonacci duy nhất. Thuộc tính này của các số Fibonacci rất quan trọng để tìm kiếm Fibonacci hoạt động; nếu bạn không thể cộng các số Fibonacci duy nhất với nhau thành bất kỳ số nào có thể, thì tìm kiếm này sẽ không hoạt động. Đối chiếu điều này với rất nhiều chuỗi khác, như 3 n hoặc các số Catalan. Đây cũng là một phần lý do tại sao rất nhiều thuật toán giống như lũy thừa của hai, tôi nghĩ.
  3. Các số Fibonacci có thể tính toán một cách hiệu quả. Thực tế là chuỗi có thể được tạo cực kỳ hiệu quả (bạn có thể lấy n số hạng đầu tiên trong O (n) hoặc bất kỳ số hạng tùy ý nào trong O (lg n)), thì rất nhiều thuật toán sử dụng chúng sẽ không thực tế. Việc tạo ra các số Catalan khá phức tạp về mặt tính toán, IIRC. Trên hết, các số Fibonacci có một đặc tính tuyệt vời là, với hai số Fibonacci liên tiếp bất kỳ, giả sử F (k) và F (k + 1), chúng ta có thể dễ dàng tính số Fibonacci tiếp theo hoặc trước đó bằng cách cộng hai giá trị (F (k) + F (k + 1) = F (k + 2)) hoặc trừ chúng (F (k + 1) - F (k) = F (k - 1)). Thuộc tính này được khai thác trong một số thuật toán, kết hợp với thuộc tính (2), để chia nhỏ các số thành tổng các số Fibonacci. Ví dụ: tìm kiếm Fibonacci sử dụng điều này để định vị các giá trị trong bộ nhớ,
  4. Chúng hữu ích về mặt sư phạm. Việc dạy đệ quy rất phức tạp và chuỗi Fibonacci là một cách tuyệt vời để giới thiệu nó. Bạn có thể nói về đệ quy thẳng, về ghi nhớ hoặc về lập trình động khi giới thiệu loạt bài này. Ngoài ra, dạng đóng tuyệt vời cho các số Fibonacci thường được dạy như một bài tập trong quy nạp hoặc trong phân tích chuỗi vô hạn và phương trình ma trận liên quan cho các số Fibonacci thường được giới thiệu trong đại số tuyến tính như một động lực đằng sau các ký hiệu và giá trị riêng. Tôi nghĩ rằng đây là một trong những lý do mà họ rất nổi tiếng trong các lớp nhập môn.

Tôi chắc rằng có nhiều lý do hơn chỉ vì điều này, nhưng tôi chắc chắn rằng một số trong những lý do này là yếu tố chính. Hi vọng điêu nay co ich!


30
Tất cả điều này cũng áp dụng cho lũy thừa của 2 ;-)

Tạo các số Catalan theo thứ tự trong "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
Trong # 2, điều quan trọng là các số fibonacci không liên tiếp để tổng có thể là duy nhất.
kunigami

1
Điều làm cho tìm kiếm Fibonacci hữu ích là đa thức sinh của chúng là x ^ 2-x-1. Tìm kiếm Fibonacci chia sẻ các thuộc tính với Tìm kiếm Tỷ lệ Vàng cho mức tối thiểu của một hàm liên tục.
Alexandre C.

@Alexandre C.- Bạn có thể nói rõ hơn về điều này không? Tôi không biết tại sao đa thức sinh cụ thể đó lại hữu ích.
templatetypedef,

4

Greatest Common Divisor là một phép thuật khác; xem điều này cho quá nhiều phép thuật. Nhưng số Fibonacci rất dễ tính toán; nó cũng có một tên cụ thể. Ví dụ, các số tự nhiên 1,2,3,4,5 có quá nhiều logic; tất cả các số nguyên tố đều nằm trong chúng; tổng của 1..n là có thể tính toán được, mỗi cái có thể sản xuất với những cái khác, ... nhưng không ai quan tâm đến chúng :)

Một điều quan trọng mà tôi quên mất đó là Tỷ lệ vàng , có tác động rất quan trọng trong cuộc sống thực (ví dụ bạn thích màn hình rộng :)


1

Nếu bạn có một thuật toán có thể giải thích thành công một cách đơn giản và ngắn gọn với các ví dụ dễ hiểu về CS và tự nhiên, thì ai đó có thể nghĩ ra công cụ giảng dạy nào tốt hơn?


1

Chuỗi Fibonacci thực sự được tìm thấy ở khắp mọi nơi trong tự nhiên / cuộc sống. Chúng hữu ích trong việc mô hình hóa sự phát triển của quần thể động vật, sự phát triển của tế bào thực vật, hình dạng bông tuyết, hình dạng thực vật, mật mã và tất nhiên là khoa học máy tính. Tôi nghe nói nó được gọi là mẫu DNA của tự nhiên.

Fibonacci heap đã được đề cập; số nút con của mỗi nút trong đống nhiều nhất là log (n). Ngoài ra, cây con bắt đầu một nút với m con là số fibonacci thứ ít nhất (m + 2).

Các giao thức giống như Torrent sử dụng một hệ thống các nút và siêu nút sử dụng fibonacci để quyết định khi nào cần một siêu nút mới và nó sẽ quản lý bao nhiêu nút con. Họ quản lý nút dựa trên xoắn ốc fibonacci (tỷ lệ vàng). Xem ảnh bên dưới cách các nút được tách / hợp nhất (phân vùng từ một hình vuông lớn thành các hình vuông nhỏ hơn và ngược lại). Xem ảnh: http://smartpei.typepad.com/.a/6a00d83451db7969e20115704556bd970b-pi

Một số sự kiện xảy ra trong tự nhiên

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


0

Tôi không nghĩ có câu trả lời chắc chắn nhưng có một khả năng là hoạt động chia tập hợp S thành hai phân vùng S1 và S2, một trong số đó được chia thành các phân vùng phụ S11 và S12, một trong số đó có cùng kích thước S2 - là một cách tiếp cận có khả năng đối với nhiều thuật toán và đôi khi có thể được mô tả bằng số như một chuỗi Fibonacci.


0

Hãy để tôi thêm một cấu trúc dữ liệu khác vào cấu trúc dữ liệu của bạn: cây Fibonacci. Chúng rất thú vị vì việc tính toán vị trí tiếp theo trong cây có thể được thực hiện chỉ bằng cách thêm các nút trước đó:

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

Nó liên quan tốt đến cuộc thảo luận của templatetypedef về cây AVL (cây AVL tệ nhất có thể có cấu trúc fibonacci). Tôi cũng đã thấy các bộ đệm được mở rộng theo các bước fibonacci thay vì các lũy thừa của hai trong một số trường hợp.


0

Chỉ để thêm một câu đố về điều này, các số Fibonacci mô tả sự phân chia của thỏ. Bạn bắt đầu với (1, 1), hai con thỏ, và sau đó dân số của chúng tăng lên theo cấp số nhân.


0

Việc tính toán của chúng dưới dạng lũy ​​thừa của ma trận [[0,1], [1,1]] có thể được coi là bài toán nguyên thủy nhất của Nghiên cứu hoạt động (giống như Vấn đề nan giải của tù nhân là bài toán nguyên thủy nhất của Lý thuyết trò chơi).


0

Các ký hiệu có tần số là số fibonacci liên tiếp tạo ra cây huffman có độ sâu tối đa, các cây này tương ứng với các ký hiệu nguồn được mã hóa bằng mã nhị phân có độ dài tối đa. Các tần số ký hiệu nguồn không fibonacci tạo ra các cây cân bằng hơn, với các mã ngắn hơn. Độ dài mã có ý nghĩa trực tiếp trong độ phức tạp mô tả của máy trạng thái hữu hạn chịu trách nhiệm giải mã một mã huffman nhất định.


Phỏng đoán: Hình ảnh thứ nhất (fib) sẽ được nén thành 38bits, trong khi hình ảnh thứ 2 (đồng nhất) với 50bits. Có vẻ như tần số ký hiệu nguồn của bạn càng gần với số fibonacci thì chuỗi nhị phân cuối cùng càng ngắn, thì độ nén càng tốt, có thể là tối ưu trong mô hình huffman.

huffman.ooz.ie/?text=ABBCCCDDDDDEEEEEEEE

nhập mô tả hình ảnh ở đây

Đọc thêm:

Buro, M. (1993). Về độ dài tối đa của mã Huffman. Thư xử lý thông tin, 45 (5), 219-223. doi: 10.1016 / 0020-0190 (93) 90207-p

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.