ตัวอย่างของอัลกอริทึมแบบเรียกซ้ำที่ซับซ้อน


14

ผมได้อธิบายที่มีชื่อเสียงกำหนดขั้นตอนวิธีการเลือกเส้นเวลา (ค่ามัธยฐานของอัลกอริทึมมีเดีย) ให้เพื่อน

การเรียกซ้ำในอัลกอริทึมนี้ (ในขณะที่เรียบง่ายมาก) นั้นค่อนข้างซับซ้อน มีการเรียกซ้ำสองครั้งแต่ละครั้งมีพารามิเตอร์แตกต่างกัน

ฉันพยายามค้นหาตัวอย่างอื่น ๆ ของอัลกอริทึมแบบเรียกซ้ำที่น่าสนใจ แต่ไม่สามารถหาได้ อัลกอริธึมการเรียกซ้ำทั้งหมดที่ฉันสามารถทำได้คือการเรียกซ้ำแบบง่าย ๆ หรือการแบ่งและพิชิตอย่างง่าย

คุณช่วยยกตัวอย่างการเรียกซ้ำที่ซับซ้อนได้ไหม


การข้ามเขาวงกตหรือกราฟโดยทั่วไปด้วยการค้นหาแบบกว้างเป็นตัวอย่างง่ายๆของการเรียกซ้ำที่น่าสนใจ

ที่ผ่านมาฉันคิดว่า BFS ไม่ผ่านการรับรองสำหรับคำถามของฉันเพราะมันสามารถดำเนินการได้อย่างง่ายดายและเป็นธรรมชาติโดยใช้คิวและลูปในขณะที่
elektronaj

สิ่งที่เกี่ยวกับการย้อนรอยในการไขปริศนาและการแยกวิเคราะห์? และการจัดอันดับและอัลกอริทึมการจัดเรียงมีการเรียกซ้ำที่ไม่ได้มาตรฐานด้วย
uli

memoizationขั้นตอนวิธีการ?
Kaveh

2
@vzn: คิวไม่สามารถแทนที่สแต็กได้ BFS เป็นกรณีพิเศษ
ราฟาเอล

คำตอบ:


15

การเกิดขึ้นอีกครั้งที่ชื่นชอบของฉันแสดงในอัลกอริทึมที่ไวต่อการส่งออกสำหรับการคำนวณเปลือกนูนครั้งแรกโดยKirkpatrick และ Seidelแต่ทำซ้ำในภายหลังโดยคนอื่น ๆ ให้หมายถึงเวลาในการคำนวณเปลือกนูนของnจุดในเครื่องบินเมื่อเปลือกนูนมีชั่วโมงจุด ( ไม่ทราบค่าของเอชล่วงหน้านอกเหนือจากขอบเขตที่ไม่สำคัญh n .) อัลกอริทึมของเคิร์กแพททริกและเซเดลทำให้เกิดการกลับเป็นซ้ำ T ( n , h ) = { O ( n ) ถ้า T(n,h)nhhhn ที่n1,n23n/4และn1+n2=nและเอช1+H2=ชั่วโมง

T(n,ชั่วโมง)={O(n)ถ้า n3 หรือ ชั่วโมง3T(n1,ชั่วโมง1)+T(n2,ชั่วโมง2)+O(n)มิฉะนั้น
n1,n23n/4n1+n2=nh1+h2=h

การแก้ปัญหาคือ ) มันน่าแปลกใจนิดหน่อยเนื่องจากhไม่ได้เป็นพารามิเตอร์ที่แบ่งเท่า ๆ กัน แต่ในความเป็นจริงที่เลวร้ายที่สุดกรณีของการเกิดซ้ำที่เกิดขึ้นเมื่อเอช1และเอช2มีทั้งที่เกี่ยวกับเอช/ 2 ; ถ้าอย่างใดอย่างน่าอัศจรรย์ชั่วโมง1เป็นค่าคงที่เสมอ, การแก้ปัญหาจะเป็นT ( n , H ) = O ( n )T(n,h)=O(nlogh)hh1h2h/2h1T(n,h)=O(n)

ฉันใช้ตัวแปรของการเกิดซ้ำในเอกสารโทโพโลยีการคำนวณครั้งแรกของฉัน : ที่

T(n,g)={O(n)if n3 or g=0T(n1,g1)+T(n2,g2)+O(min{n1,n2})otherwise
และ g 1 + gn1+n2=nกรัม อีกครั้งวิธีแก้ปัญหาคือ O ( n log g )และกรณีที่เลวร้ายที่สุดเกิดขึ้นเมื่อทั้ง nและ gถูกแบ่งเท่า ๆ กันg1+g2=gO(nlogg)ng

n=O(1)h=O(1)OnhO(1)O(n)
กราฟิลส์

1
O(1) meant "your favorite constant". I've used 3 in my revision, but 1010100!จะได้ทำงานเช่นกัน
JeffE

คุณวาดไดอะแกรมเหล่านั้นลงในเอกสารโทโพโลยีการคำนวณได้อย่างไร
user119264

12

การเรียกซ้ำที่ฉันใช้ในบทความของฉัน "อัลกอริทึมเชิงเส้นเวลาสำหรับการคำนวณแผนภาพ Voronoi ของรูปหลายเหลี่ยมนูน" โดย Aggarwal et alก็ค่อนข้างซับซ้อนเช่นกัน

นี่คือคำอธิบายของอัลกอริทึมจากบทความของเรา ในกรณีที่ยังไม่ชัดเจนจากคำอธิบายในขั้นตอนที่ 3 จุดสีแดงจะถูกแบ่งเป็นจุดสีแดงเข้มและสีแดงโกเมน ขั้นตอนที่ 1, 3 และ 6 เป็นเวลาเชิงเส้นทั้งหมด เราก็รู้ว่าถ้าn คือจำนวนคะแนนทั้งหมด |B|αn, |R|βn, and |C|γn for some α,β,γ>0.

I'll let you figure out why the entire algorithm takes linear time.

  1. Partition the original points into the blue and red sets B and R.
  2. Recursively compute the convex hull of the blue points.
  3. Using the structure of the blue hull, select the crimson points C.
  4. Add the crimson points to the blue hull one at a time.
  5. Recursively compute the convex hull of the garnet points G.
  6. Merge this garnet hull with the expanded blue hull of step 4.

What makes the algorithm linear is the ability to add a fixed fraction of the red points to the blue hull at constant cost per point. The points added are the crimson points.

The recursion is thus

T(n)=T(|B|)+T(|G|)+O(n)
where you don't know |B| and |G| but are guaranteed that |B|+|G|(1γ)n.

7

There is a variation on the median finding recurrence that comes from range searching with halfplanes. The recurrence itself is of the form

T(n)=T(n/2)+T(n/4)+cn
which is similar to the median-finding recurrence. For more on this, look at Jeff Erickson's lecture notes and in particular Section 4.

1
My answer here (cs.stackexchange.com/questions/332/…) happens to have the exact same recurrence for its running time :)
Alex ten Brink

6

There are a bunch of cool recursive algorithms [1], [2] used in RNA secondary structure prediction. Left to its own devices, a strand of RNA will form base pairs with itself; one relatively simple example from [3] computes the maximum number of nested, paired bases an RNA string will form with itself:

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


  1. Optimal computer folding of large RNA sequences using thermodynamics and auxiliary information by M. Zuker, P. Stiegler (1981)

  2. A Dynamic Programming Algorithm for RNA Structure Prediction Including Pseudoknots by E. Rivas, S. R. Eddy (1999)

  3. Fast algorithm for predicting the secondary structure of single-stranded RNA by R. Nussinov, A. B. Jacobson (1980)


A related one proposed here is quite intricate as it sports three mutually dependent (dynamic programming) recursions.
Raphael

4

I still don't really understand what you mean by "sophisticated recursion". For example, the recursion step in the FFT algorithm is sophisticated!

แต่ถ้าคุณต้องการค้นหาการเรียกซ้ำที่ซับซ้อนกว่าการสอบถามซ้ำซึ่งกันและกันอาจเป็นคำตอบที่เป็นไปได้ recursion ร่วมกันจะเป็นประโยชน์เมื่อทำงานร่วมกับการเขียนโปรแกรมภาษา Fuctional recursion รวมเป็นคุณลักษณะที่สำคัญของparsers โคตร recursive


การเรียกซ้ำใน FFT (รูปแบบที่ง่ายที่สุดของ Cooley-Tukey) คือการหารและพิชิต "มาตรฐาน" สิ่งนี้ชัดเจนจากความซับซ้อนของ O (nlogn) การเรียกซ้ำ 2 ครั้ง (1 สำหรับเท่า, 1 สำหรับอัตราต่อรอง) ค่อนข้าง "เหมือนกัน"
elektronaj

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.