2010-12-31 39 views
72

Fibonacci numbers đã trở thành một giới thiệu phổ biến để đệ 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 họ vẫn 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 họ.Tại sao số Fibonacci có ý nghĩa quan trọng trong khoa học máy tính?

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

Có hai ví dụ chính mà tôi suy nghĩ:

  • Fibonacci heaps có tốt hơn khấu hao theo thời gian chạy hơn nhị thức đống.
  • Fibonacci search chia sẻ thời gian chạy O (log N) với số nhị phân tìm kiếm trên một mảng được sắp xếp.

Có một số đặc tính đặc biệt của những con số này mang lại cho họ lợi thế hơn các chuỗi 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 nào khác?

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

+0

Không quen thuộc sẽ là yếu tố lớn nhất? – Cyclone

+13

Tôi nghĩ rằng loại câu hỏi này thuộc về cstheory hoặc math SE. Hấp dẫn, nhưng OT. –

+7

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

Trả lời

67

Các số Fibonacci có tất cả các loại thuộc tính toán học thực sự tốt đẹp làm cho chúng xuất sắc trong khoa học máy tính. Dưới đây là một số ít:

  1. Chúng phát triển nhanh chóng theo cấp số nhân. Một cấu trúc dữ liệu thú vị trong đó 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 phía sau cây này là mỗi nút duy trì một yếu tố cân bằng sao cho chiều cao của cây con trái và phải khác nhau nhiều nhất một. Bởi vì điều này, bạn có thể nghĩ số lượng tối thiểu các nút cần thiết để có được một cây AVL có chiều cao h được xác định bởi sự lặp lại trông giống như N (h + 2) ~ = N (h) + N (h + 1), trông giống như dãy Fibonacci. Nếu bạn tính toán, bạn có thể chỉ ra rằng số lượng nút cần thiết để có được một cây AVL có chiều cao h là F (h + 2) - 1. Vì chuỗi Fibonacci tăng nhanh theo cấp số nhân, điều này có nghĩa là chiều cao của AVL cây có nhiều logarit nhất trong số các nút, cho bạn thời gian tra cứu O (lg n) mà chúng ta 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ể giới hạn kích thước của một số cấu trúc với một số Fibonacci, bạn có thể nhận được một thời gian chạy O (lg n) trên một số hoạt động. Đây là lý do thực sự mà Fibonacci được gọi là Fibonacci heaps - bằng chứng cho thấy số lượng heaps sau một phút dequeue liên quan đến việc giới hạn số lượng nút mà bạn có thể có ở độ sâu nhất định với 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 là rất quan trọng để có được việc tìm kiếm Fibonacci làm việc ở tất cả; nếu bạn không thể thêm các số Fibonacci cùng nhau vào bất kỳ số nào có thể, tìm kiếm này sẽ không hoạt động. Tương phản điều này với nhiều chuỗi khác, như 3 n hoặc số Catalan. Đây cũng là một phần lý do tại sao rất nhiều thuật toán như quyền hạn của hai, tôi nghĩ.
  3. Các số Fibonacci được tính toán hiệu quả. Thực tế là chuỗi có thể được tạo cực kỳ hiệu quả (bạn có thể nhận được n từ đầu tiên trong O (n) hoặc bất kỳ thuật ngữ tùy ý nào trong O (lg n)), sau đó rất nhiều thuật toán sử dụng chúng sẽ không thực tế . Tạo số Catalan là khá phức tạp tính toán, IIRC. Ngày đầu này, các số Fibonacci có một thuộc tính tốt, trong đó, cho bất kỳ hai số Fibonacci liên tiếp, giả sử F (k) và F (k + 1), chúng ta có thể dễ dàng tính toán số Fibonacci tiếp theo hoặc trước đó bằng cách thêm 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ủa 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ớ, trong khi một thuật toán tương tự có thể được sử dụng để tính logarithms một cách nhanh chóng và hiệu quả.
  4. Chúng hữu ích về mặt sư phạm. Đệ trình đệ quy là khó khăn, và dãy 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 bộ truyện. Ngoài ra, tuyệt vời closed-form for the Fibonacci numbers thường được dạy như là một bài tập trong cảm ứng hoặc trong phân tích của chuỗi vô tận, và liên quan matrix equation for Fibonacci numbers thường được giới thiệu trong đại số tuyến tính như một động lực đằng sau eigenvectors và eigenvalues. Tôi nghĩ rằng đây là một trong những lý do khiến họ quá cao trong các lớp giới thiệu.

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

+28

Tất cả điều này cũng áp dụng cho quyền hạn của 2 ;-) –

+0

Tạo số Catalan theo thứ tự trong "O (n)": 'perl -Mbignum -le '$ n = 0; $ c = 1; trong khi (1) {$ n ++ ; $ c * = (4 * $ n-2); $ c/= ($ n + 1); in "$ n \ t $ c"} '| head -n 100' –

+3

Trong # 2 điều quan trọng là số lượng mã không phải là số liên tiếp nên tổng số có thể là duy nhất. – kunigami

0

Tôi không nghĩ rằng có một câu trả lời dứt khoát nhưng một khả năng là hoạt động chia một S thành hai phân vùng S1 và S2 một trong số đó sau đó được chia thành phân vùng phụ S11 và S12, một trong số đó có cùng kích thước với 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.

4

Greatest Common Divisor là một phép thuật khác; xem this cho quá nhiều phép thuật. Nhưng các số Fibonacci dễ tính toán; nó cũng có một cái tên cụ thể. Ví dụ, 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à tính toán, mỗi người có thể sản xuất với những người khác, ... nhưng không ai quan tâm đến họ :)

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

0

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

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

Nó gắn tốt với các cuộc thảo luận bằng cách templatetypedef trên AVL-cây (một cây AVL có thể tồi tệ nhất có cấu trúc fibonacci). Tôi cũng đã nhìn thấy bộ đệm mở rộng trong các bước mã vạch hơn là quyền hạn của hai trong một số trường hợp.

1

Nếu bạn có một thuật toán có thể được giải thích thành công trong một mannor đơn giản và ngắn gọn với các ví dụ dễ hiểu trong CS và bản chất, công cụ giảng dạy nào tốt hơn có thể xuất hiện?

1

Chuỗi Fibonacci thực sự được tìm thấy ở 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ự tăng trưởng 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ã học, và tất nhiên là khoa học máy tính. Tôi đã nghe nó được gọi là mô hình DNA của tự nhiên.

Mức Fibonacci đã được đề cập; số lượng con của mỗi nút trong heap tối đa là log (n). Ngoài ra các subtree bắt đầu một nút với trẻ em m là ít nhất (m + 2) th số hiệu.

Các giao thức giống như Torrent sử dụng hệ thống nút và siêu nút sử dụng một mã vạch để quyết định khi nào một nút siêu mới là cần thiết và số lượng nút con sẽ quản lý.Họ làm 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 phân chia/hợp nhất (được phân đoạn 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ố lần xuất hiện 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

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

0

Tính toán của chúng như là công suất của ma trận [[0,1], [1,1]] có thể được coi là vấn đề nguyên thủy nhất của Nghiên cứu hoạt động (giống như Dilemma của tù nhân là vấn đề nguyên thủy nhất của Lý thuyết trò chơi) .

Các vấn đề liên quan