2013-04-13 36 views
7

Dưới đây là một chương trình C đơn giản:Sử dụng các quan hệ lặp lại để chứng minh một hàm có thời gian chạy theo hàm mũ?

int f(int n) { 
    if(n==0 || n==1) { 
    return n; 
    } else { 
    return 2 * f(n - 1) + 3 * f(n - 2); 
    } 
} 

Chương trình này có độ phức tạp thời gian mũ. Bạn có thể thấy điều này trong sơ đồ này của các cuộc gọi chức năng cho f(5):

n = 5

Tôi muốn chứng minh rằng chức năng có độ phức tạp hàm mũ sử dụng một phương trình tái phát, không phải bằng cách vẽ một sơ đồ và đếm số lượng các chức năng cuộc gọi.

Mối quan hệ tái phát tôi đã đưa ra là

T (n) = T (n-1) + T (n-2) + c

mở rộng cho

T (n) = 2T (n - 2) + T (n - 3) + 2c

Tuy nhiên, tôi không biết cách giải quyết thi s hơn nữa. Làm thế nào tôi có thể giải quyết mối quan hệ tái diễn này?

+4

Vui lòng đọc lại ghi chú bài giảng. –

+0

Để cho phép bạn đi đến quầy bar - hãy đọc http://en.wikipedia.org/wiki/Recurrence_relation –

Trả lời

7

Đối với người mới bắt đầu, tái phát của bạn cần một số loại trường hợp cơ sở, vì nếu không thì nó không xác định khi bạn nhấn 0. Để đơn giản, giả sử rằng

T (0) = a

T (1) = a + b

T (n + 2) = T (n) + T (n + 1) + c

Hãy bắt đầu mở rộng ra vài thuật ngữ đầu tiên của tái phát này:

  • T (0) = a
  • T (1) = a + b
  • T (2) = 2a + b + c
  • T (3) = 3a + 2b + 2c
  • T (4) = 5a + 3b + 4c
  • T (5) = 8a + 5b + 7c
  • T (6) = 13a + 8b + 12c
  • T (7) = 21a + 13b + 20c

Có một mô hình rất thú vị đang được định hình ở đây. Hãy xem xét riêng các hệ số của các điều khoản a, b và c. Các hệ số của các điều khoản một theo mô hình

1, 1, 2, 3, 5, 8, 13, 21, ...

Đây là loạt Fibonacci, bù đắp bằng một bước . Hệ số của các thuật ngữ b là

0, 1, 1, 2, 3, 5, 8, 13, ...

Chính xác là chính xác dãy Fibonacci. Cuối cùng, chúng ta hãy nhìn vào các điều khoản c:

0, 0, 1, 2, 4, 7, 12, 20, ...

Hmmm, điều đó không trông quen thuộc. Tuy nhiên, nếu chúng ta đặt nó side-by-side với một điều kiện, chúng tôi thấy điều này:

a: 1, 1, 2, 3, 5, 8, 13, 21, ...

b: 0, 0, 1, 2, 4, 7, 12, 20, ...

Lưu ý rằng các thuật ngữ b là tất cả các cụm từ được trừ ra! Nói cách khác, đó là dãy Fibonacci được dịch chuyển một bước, nhưng với 1 trừ đi từ mỗi kỳ.

Dựa trên những quan sát này, chúng ta có thể phỏng đoán rằng sau đây là đúng:

T (n) = AF n + 1 + BF n + c (F n + 1 - 1)

Bây giờ chúng tôi có thể cố gắng chứng minh điều này bằng cảm ứng.Như trường hợp cơ sở của chúng tôi:

T (0) = a = 1a + 0b + 0c = 1a + 0b + (1 - 1) c = AF + BF + c (F -1)

T (1) = a + b = 1a + 1b + 0c = 1a + 1b + (1 - 1) c = AF + BF + c (F - 1)

Đối với bước quy nạp của chúng tôi, chúng ta hãy giả định rằng đối với một số số n tự nhiên, mà

T (n) = AF n + 1 + BF n + c (F n + 1-1)

T (n + 1) = AF n + 2 + BF n + 1 + c (F 0.123.n + 2 - 1)

Sau đó, chúng tôi có mà

T (n + 2) = T (n) + T (n + 1) + c

= AF n + 1 + BF n + c (F n + 1-1) + AF n + 2 + BF n + 1 + c (F n + 2 - 1) + c

= a (F n + 1 + F n + 2) + b (F n + F n + 1) + c (F n + 1 + F n + 2 - 2 + 1)

= AF n + 3 + BF n + 2 + c (F + 3 n-1)

Điều này hoàn thành cảm ứng, vì vậy công thức của chúng tôi phải chính xác!

Vậy điều này liên quan đến hiệu quả như thế nào? Vâng, Binet's formula cho chúng tôi biết rằng F n = Θ (φ n), trong đó φ là golden ratio (khoảng 1.61).Điều này có nghĩa rằng

T (n) = AF n + 1 + BF n + c (F n + 1-1) = a Θ (φ n) + b Θ (φ n) + c Θ (φ n) = Θ ((a + b + c) φ n)

0.123.

Vì vậy, miễn là + b + c ≠ 0, thời gian chạy là Θ (φ n), là theo cấp số mũ.

Hy vọng điều này sẽ hữu ích!

+0

giải thích tuyệt vời này, làm thế nào bạn có thể viết câu trả lời hay này với trong 9 phút .. bạn có vẻ như từ lý thuyết về nền tính toán. .. –

+1

@ GrijeshChauhan- Tôi dạy một lý thuyết về khóa học tính toán và đã xảy ra để biết ý tưởng cơ bản đằng sau sự tái diễn đặc biệt này. Đó là chủ yếu từ kinh nghiệm. – templatetypedef

+0

Đẹp !! Tôi cũng thích dạy và dạy lý thuyết tính toán Nhưng tôi là kĩ sư phần mềm, tôi chỉ thấy câu trả lời của bạn về trang chủ mà tôi muốn đọc trong thời gian thêm ... và tôi sẽ bắt bạn khi tôi tìm thấy một số câu hỏi/nghi ngờ –