Ví dụ về các thuật toán đệ quy tinh vi


14

Tôi đã giải thích thuật toán lựa chọn thời gian tuyến tính xác định nổi tiếng ( thuật toán trung vị của trung vị) cho một người bạn.

Sự đệ quy trong thuật toán này (trong khi rất đơn giản) khá phức tạp. Có hai cuộc gọi đệ quy, mỗi cuộc gọi có các tham số khác nhau.

Tôi đã cố gắng tìm các ví dụ khác về các thuật toán đệ quy thú vị như vậy, nhưng không thể tìm thấy bất kỳ thuật toán nào. Tất cả các thuật toán đệ quy mà tôi có thể đưa ra là các phép thu hồi đuôi đơn giản hoặc phân chia và chinh phục đơn giản (trong đó hai cuộc gọi là "giống nhau").

Bạn có thể cho một số ví dụ về đệ quy tinh vi?


Đi qua một mê cung hay nói chung là một biểu đồ với tìm kiếm theo chiều rộng là một ví dụ đơn giản về một đệ quy thú vị.

không thể tin được, tôi nghĩ rằng BFS không đủ điều kiện cho câu hỏi của tôi, vì nó có thể được thực hiện dễ dàng và tự nhiên bằng cách sử dụng hàng đợi và vòng lặp while.
elektronaj

Điều gì về quay lui trong việc giải câu đố và phân tích cú pháp? Và thuật toán xếp hạng và Unranking cũng có các thu hồi không chuẩn.
uli

Memoization thuật toán?
Kaveh

2
@vzn: Một hàng đợi không thể thay thế một ngăn xếp. BFS là một trường hợp đặc biệt.
Raphael

Câu trả lời:


15

Sự tái phát yêu thích của tôi xuất hiện trong các thuật toán nhạy cảm đầu ra để tính toán vỏ lồi, đầu tiên là Kirkpatrick và Seidel , nhưng sau đó được lặp lại bởi những người khác. Gọi biểu thị thời gian để tính vỏ lồi của điểm trong mặt phẳng, khi thân lồi có đỉnh. (Giá trị của không được biết trước, ngoài giới hạn tầm thường .) Thuật toán của Kirkpatrick và Seidel mang lại sự tái phát trong đó và vàn h h h n T ( n , h ) = { O ( n ) nếu  n 3  hoặc  h 3 T ( n 1 , h 1 ) + T ( n 2 , h 2 ) + O ( n ) nếu không n 1 , n 2T(n,h)nhhhn

T(n,h)={O(n)if n3 or h3T(n1,h1)+T(n2,h2)+O(n)otherwise
n 1 + n 2 = n h 1 + h 2 = hn1,n23n/4n1+n2=nh1+h2=h .

Giải pháp là . Đây là một chút ngạc nhiên, vì không phải là tham số được chia đều. Nhưng trên thực tế, trường hợp xấu nhất của sự tái phát xảy ra khi và đều khoảng ; nếu bằng cách nào đó, luôn luôn là hằng số, thì giải pháp sẽ là .h h 1 h 2 h / 2 h 1 T ( n , h ) = O ( n )T(n,h)=O(nlogh)hh1h2h/2h1T(n,h)=O(n)

Tôi đã sử dụng một biến thể của sự tái phát này trong một trong những bài viết cấu trúc tính toán đầu tiên của mình : trong đó và . Một lần nữa, giải pháp là và trường hợp xấu nhất xảy ra khi cả và luôn được chia đều. n 1 + n 2 = n g 1 +

T(n,g)={O(n)if n3 or g=0T(n1,g1)+T(n2,g2)+O(min{n1,n2})otherwise
n1+n2=ng1+g2=gO(nlogg)ng

Tôi có vấn đề với điều kiện "if hoặc "; những gì hiện trung bình ở đây? Có hằng số giới hạn toàn cầu mà và phải cắt xén để kết thúc trong trường hợp một (và các tác giả không bận tâm để cung cấp cho họ). Bởi vì nếu tôi đọc nó theo nghĩa đen (nghĩa là giải thích cả theo cùng một cách như trong cùng một hàng) thì trường hợp hai không bao giờ hoặc luôn xảy ra (tôi thậm chí không chắc chắn). Lạm dụng ký hiệu đưa đi quá xa, imho. n=O(1)h=O(1)OnhO(1)O(n)
Raphael

1
Xin lỗi, tôi đã chỉnh sửa câu trả lời của mình để làm rõ. có nghĩa là "hằng số yêu thích của bạn". Tôi đã sử dụng trong bản sửa đổi của mình, nhưng sẽ hoạt động tốt. O(1)31010100!
JeffE

Làm thế nào bạn vẽ những sơ đồ đó trong các bài viết cấu trúc liên kết tính toán?
dùng119264

12

Phép đệ quy mà tôi đã sử dụng trong bài báo của mình "Thuật toán thời gian tuyến tính để tính toán sơ đồ Voronoi của đa giác lồi" của Aggarwal et al cũng khá phức tạp.

Dưới đây là một mô tả của thuật toán từ bài báo của chúng tôi. Trong trường hợp không rõ ràng từ mô tả, ở bước 3, các điểm màu đỏ được phân chia thành các điểm màu đỏ thẫm và garnet. Bước 1, 3 và 6 đều là thời gian tuyến tính. Chúng ta cũng biết rằng nếu là tổng số điểm, , và đối với một số .n|B|αn|R|βn|C|γnα,β,γ>0

Tôi sẽ cho bạn biết tại sao toàn bộ thuật toán mất thời gian tuyến tính.

  1. Phân vùng các điểm ban đầu thành tập hợp màu xanh và đỏ B và R.
  2. Tính toán đệ quy thân lồi của các điểm màu xanh.
  3. Sử dụng cấu trúc của thân tàu màu xanh, chọn các điểm C. màu đỏ thẫm.
  4. Thêm các điểm màu đỏ thẫm vào thân tàu màu xanh một lần.
  5. Tính toán đệ quy thân lồi của các điểm garnet G.
  6. Hợp nhất thân tàu garnet này với thân màu xanh mở rộng của bước 4.

Điều làm cho thuật toán tuyến tính là khả năng thêm một phần cố định của các điểm đỏ vào thân màu xanh với chi phí không đổi trên mỗi điểm. Các điểm được thêm vào là các điểm đỏ thẫm.

Do đó, đệ quy là mà bạn không biếtvànhưng được đảm bảo rằng .

T(n)=T(|B|)+T(|G|)+O(n)
|B||G||B|+|G|(1γ)n

7

Có một biến thể về sự tái phát trung bình xuất phát từ việc tìm kiếm phạm vi bằng máy bay nửa vòng. Sự tái phát là của hình thức

T(n)=T(n/2)+T(n/4)+cn

1
Câu trả lời của tôi ở đây ( cs.stackexchange.com/questions/332/ diệt ) tình cờ có cùng một đợt tái phát chính xác cho thời gian hoạt động của nó :)
Alex ten Brink

6

Có một loạt các thuật toán đệ quy tuyệt vời [1], [2] được sử dụng trong dự đoán cấu trúc thứ cấp RNA. Còn lại với các thiết bị của riêng mình, một chuỗi RNA sẽ tạo thành các cặp cơ sở với chính nó; một ví dụ tương đối đơn giản từ [3] tính toán số lượng tối đa các cơ sở được ghép, được ghép nối với nhau, một chuỗi RNA sẽ tự hình thành:

M(i,j)=maxik<jLmin{M(i,k1)+M(k+1,j1)+1M(i,j1)


  1. Máy tính tối ưu gấp các chuỗi RNA lớn bằng cách sử dụng nhiệt động lực và thông tin phụ trợ của M. Zuker, P. Stiegler (1981)

  2. Một thuật toán lập trình động cho dự đoán cấu trúc RNA bao gồm các giả hành của E. Rivas, SR Eddy (1999)

  3. Thuật toán nhanh để dự đoán cấu trúc thứ cấp của RNA chuỗi đơn của R. Nussinov, AB Jacobson (1980)


Một liên quan được đề xuất ở đây khá phức tạp vì nó có ba lần thu hồi phụ thuộc lẫn nhau (lập trình động).
Raphael

4

Tôi vẫn không thực sự hiểu ý của bạn là "đệ quy tinh vi". Ví dụ, bước đệ quy trong thuật toán FFT rất phức tạp!

Nhưng nếu bạn muốn tìm kiếm đệ quy phức tạp hơn , thì đệ quy lẫn nhau có thể là một câu trả lời có thể. Đệ quy lẫn nhau rất hữu ích khi làm việc với các ngôn ngữ lập trình giả tưởng . Đệ quy lẫn nhau là tính năng chính của trình phân tích cú pháp gốc đệ quy .


Chà, đệ quy trong FFT (dạng đơn giản nhất của Cooley-Tukey) là sự phân chia và chinh phục "tiêu chuẩn". Điều này là rõ ràng từ độ phức tạp O (nlogn) của nó. 2 cuộc gọi đệ quy (1 cho số chẵn, 1 cho tỷ lệ cược) có phần "giống nhau".
elektronaj

3

Nằm trên đỉnh đầu của tôi, chức năng McCarthy 91

F(N) = 
    n - 100    if n > 100
    F(F(n+11)) if n <= 100

chức năng Ackermann

A(m, n) = 
    n + 1             if m = 0
    A(m-1, 1)         if m > 0 and n = 0
    A(m-1, A(m, n-1)) if m > 0 and n > 0

có thể được tính là khác thường, mặc dù đồ chơi-ish, các hàm đệ quy.

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.