การเกิดซ้ำและฟังก์ชันสร้างในอัลกอริทึม


18

Combinatorics มีบทบาทสำคัญในวิทยาการคอมพิวเตอร์ เราใช้วิธี combinatorial ในการวิเคราะห์และการออกแบบอัลกอริทึมบ่อยครั้ง ตัวอย่างเช่นวิธีหนึ่งสำหรับการค้นหาชุดk -vertex ในกราฟอาจตรวจสอบชุดย่อย(nk)เป็นไปได้ทั้งหมด ในขณะที่ฟังก์ชั่นทวินามเติบโตขึ้นแบบทวีคูณถ้าkเป็นค่าคงที่ที่แน่นอนเราจะสิ้นสุดด้วยอัลกอริธึมเวลาพหุนามโดยการวิเคราะห์เชิงเส้นกำกับ

บ่อยครั้งที่ปัญหาในชีวิตจริงต้องการกลไกการผสมผสานที่ซับซ้อนมากขึ้นซึ่งเราอาจนิยามในแง่ของการเกิดซ้ำ ตัวอย่างที่มีชื่อเสียงอย่างหนึ่งคือลำดับฟีโบนักชี (ไร้เดียงสา) ที่นิยามเป็น:

f(n)={1if n=10if n=0f(n1)+f(n2)otherwise

ขณะนี้การคำนวณมูลค่าของคำศัพท์ที่nเพิ่มขึ้นแบบทวีคูณโดยใช้การเกิดซ้ำนี้ แต่ด้วยการเขียนโปรแกรมแบบไดนามิกเราอาจคำนวณในเวลาเชิงเส้น ทีนี้ไม่ใช่การเกิดซ้ำทั้งหมดให้ตัวเองกับ DP (ฟังก์ชั่นแฟกทอเรียล) แต่มันเป็นคุณสมบัติที่สามารถเอาเปรียบได้เมื่อกำหนดบางอย่างว่าเป็นการเกิดซ้ำมากกว่าฟังก์ชั่นการสร้าง

ฟังก์ชั่นการสร้างเป็นวิธีที่สง่างามในการทำให้เป็นรูปเป็นร่างสำหรับโครงสร้างที่กำหนด บางทีที่มีชื่อเสียงที่สุดคือฟังก์ชันการสร้างทวินามที่กำหนดเป็น:

(x+Y)α=Σk=0(αk)xα-kYk

โชคดีที่มีโซลูชันแบบปิด ฟังก์ชั่นการสร้างไม่ได้อนุญาตให้มีคำอธิบายแบบกระชับ

ทีนี้คำถามของฉันคือ: สร้างฟังก์ชันที่ใช้ในการออกแบบอัลกอริทึมบ่อยแค่ไหน? เป็นเรื่องง่ายที่จะเห็นว่าพวกเขาจะถูกนำไปใช้เพื่อทำความเข้าใจกับอัตราการเติบโตที่ต้องการโดยอัลกอริทึมผ่านการวิเคราะห์อย่างไร แต่พวกเขาจะบอกอะไรเราเกี่ยวกับปัญหาเมื่อสร้างวิธีการแก้ปัญหา

หากหลายครั้งที่จำนวนเดียวกันอาจถูกจัดรูปแบบใหม่ในฐานะการเกิดซ้ำมันอาจยืมตัวเองไปสู่การเขียนโปรแกรมแบบไดนามิก แต่อีกครั้งฟังก์ชั่นการสร้างเดียวกันอาจมีรูปแบบปิด ดังนั้นจึงไม่ได้ถูกตัดอย่างสม่ำเสมอ


หากฟังก์ชันการสร้างมีสูตร (ตัวอย่างเช่นสูตรของ Binet สำหรับหมายเลขฟีโบนักชี) ซึ่งสามารถใช้ในการคำนวณจำนวนแทนที่จะใช้การเกิดซ้ำ (อาจมีประสิทธิภาพมากกว่า) คุณคิดว่าเป็นคำตอบหรือไม่?
Aryabhata

คำตอบ:


11

การสร้างฟังก์ชั่นมีประโยชน์เมื่อคุณกำลังออกแบบอัลกอริทึมการนับ นั่นคือไม่เพียง แต่เมื่อคุณกำลังมองหาจำนวนวัตถุที่มีคุณสมบัติบางอย่าง แต่ยังเมื่อคุณกำลังมองหาวิธีที่จะระบุวัตถุเหล่านี้ (และบางทีอาจจะสร้างอัลกอริทึมในการนับวัตถุ) มีการนำเสนอที่ดีมากในบทที่ 7 คือคณิตศาสตร์คอนกรีตโดยโรนัลด์เกรแฮม, โดนัลด์ Knuth และโอเรนพาทาชนิก ตัวอย่างด้านล่างมาจากหนังสือเหล่านี้ (ความผิดพลาดและการขาดความชัดเจนเป็นของฉัน)

สมมติว่าคุณกำลังมองหาวิธีที่จะเปลี่ยนแปลงด้วยชุดเหรียญที่กำหนด ตัวอย่างเช่นกับที่พบบ่อยdenominations¹สหรัฐเหรียญที่เป็นไปได้[100] เพื่อให้การเปลี่ยนแปลง¢ 42 มีความเป็นไปได้หนึ่งอย่างคือ ; ความเป็นไปได้อีกอย่างก็คือ[1] เราจะเขียน\ โดยทั่วไปเราสามารถเขียนฟังก์ชันการสร้างสำหรับวิธีทั้งหมดเพื่อให้การเปลี่ยนแปลง: ในคำศัพท์ทางเทคนิคเพิ่มเติมคือคำศัพท์ในช่องว่างของอนุกรมพลังงานในห้าตัวแปร[ 25 ] [ 10 ] [ 5 ] [ 1 ] [ 1 ] [ 10 ] [ 10 ] [ 10 ] [ 10 ] [ 1 ] [ 1 ] 42 [ 25 ] [ 10 ][1],[5],[10],[25],[100][25][10][5][1][1][10][10][10][10][1][1]H = h 0 q 0 d 0 n 0 p 0 [ 100 ] h [ 25 ] q [ 10 ] d [ 5 ] n [ 1 ] หน้า42[25][10][5][1]2=[10]4[1]2

H=Σชั่วโมง0ΣQ0Σd0Σn0Σพี0[100]ชั่วโมง[25]Q[10]d[5]n[1]พี
[ 100 ] , [ 25 ] , [ 10 ] , [ 5 ] , [ 1 ] [ 100 ] h [ 25 ] q [ 10 ] d [ 5 ] n [ 1 ] p= 100 h + 25 q + 10 d + 5 n + p v v H PH[100],[25],[10],[5],[1]. กำหนดการประเมินค่า monomial ในพื้นที่นี้โดย แล้ววิธีการที่จะให้เซนต์ในการเปลี่ยนแปลงจำนวนของ monomials ที่มีการประเมินมูลค่าเป็นวีเราสามารถแสดงในรูปแบบที่เพิ่มขึ้นโดยการเขียนวิธีการที่เพื่อให้การเปลี่ยนแปลงใน pennies เท่านั้นแล้ววิธีที่เพื่อให้การเปลี่ยนแปลงใน pennies และ nickels และอื่น ๆ (หมายถึงไม่มีเหรียญ)
[100]ชั่วโมง[25]Q[10]d[5]n[1]พี=100ชั่วโมง+25Q+10d+5n+พี
โวลต์โวลต์HPI P = I + [ 1 ] + [ 1 ] 2 + [ 1 ] 3 + = Iยังไม่มีข้อความผม S:
P=ผม+[1]+[1]2+[1]3+...=ผมผม-[1]ยังไม่มีข้อความ=(ผม+[5]+[5]2+[5]3+...)P=Pผม-[5]D=(ผม+[10]+[10]2+[10]3+...)ยังไม่มีข้อความ=ยังไม่มีข้อความผม-[10]Q=(ผม+[25]+[25]2+[25]3+...)D=Dผม-[25]H=(ผม+[100]+[100]2+[100]3+...)Q=Qผม-[100]
หากคุณต้องการนับและไม่เพียงแค่ระบุวิธีที่จะเปลี่ยนแปลงแล้วมีวิธีง่ายๆในการใช้ซีรีย์ทางการที่เราได้รับมา ใช้โฮโมมอร์ฟิซึม ค่าสัมประสิทธิ์ของในคือจำนวนวิธีที่จะเปลี่ยน cents X v S ( C ) v
S:[1]X,[5]X5,[10]X10,[25]X25,[100]X100
Xโวลต์S()โวลต์

ตัวอย่างที่ยากกว่า: สมมติว่าคุณต้องการศึกษาทุกวิธีในการเรียงไพ่สี่เหลี่ยมด้วยแต้ม 2 × 1 ตัวอย่างเช่นมีสองวิธีในการเรียงสี่เหลี่ยมผืนผ้า 2 × 2 สี่เหลี่ยมผืนผ้าไม่ว่าจะเป็นโดมิโนแนวนอนสองแบบหรือโดมิโนแนวตั้งสองแบบ การนับจำนวนวิธีในการเรียงสี่เหลี่ยมสี่เหลี่ยมผืนผ้าค่อนข้างง่าย แต่กรณีจะกลายเป็นไม่เด่นชัดอย่างรวดเร็ว เราสามารถแจกแจงความเป็นไปได้ทั้งหมดของแถบแนวนอนที่มีความสูง 3 โดยผสานแต้มเข้าด้วยกันซึ่งให้รูปแบบซ้ำ ๆ อย่างรวดเร็ว: 3 × n { U = o + L V + แกมมา Λ + U V = ฉัน2×n3×noL

{ยู=โอ+LV+ΓΛ+ยูV=ผมยู+=-VΛ=ผมยู+-=Λ
ที่รูปร่างตลกเป็นตัวแทนของโดมิโนจัดการเบื้องต้น:ไม่มีโดมิโนเป็นแนวดิ่งบนโดมิโนโดมิโนด้านซ้ายของแนวโดมิโนเป็นโดมิโนแนวตั้งชิดกับด้านล่างของวงดนตรีของความสูง 3,เป็นโดมิโนแนวนอนชิดกับด้านบนของวงบวกสองแต้มแนวนอนด้านล่างและขั้นตอนหนึ่งไปทางขวา, เป็นต้นที่นี่การคูณหมายถึงการต่อเรียงแนวนอนและไม่ใช่การสลับสับเปลี่ยน แต่มีสมการระหว่างรูปแบบพื้นฐานที่เป็นตัวแปรในชุดพลังงานนี้ เช่นเคยกับเหรียญเราสามารถแทนที่สำหรับโดมิโนทุกตัวและรับซีรีย์การสร้างสำหรับจำนวนการเอียงของโอLผม-=X3×(2n/3)สี่เหลี่ยมผืนผ้า (เช่นสัมประสิทธิ์คือจำนวนวิธีที่จะเรียงต่อกันสี่เหลี่ยมของพื้นที่ซึ่งประกอบด้วยโดมิโนและมีความกว้าง ) ซีรีย์นี้ยังสามารถใช้งานได้หลากหลายมากขึ้น ตัวอย่างเช่นโดยการแยกโดมิโนแนวตั้งและแนวนอนเราสามารถนับความเอียงด้วยจำนวนโดมิโนแนวตั้งและแนวนอนที่กำหนดX3k6k3k2k

อ่านคณิตศาสตร์คอนกรีตอีกครั้งเพื่อนำเสนอที่เร่งรีบน้อยลง

¹ ฉันรู้ว่ารายชื่อของฉันไม่สมบูรณ์ สมมติให้สหรัฐฯง่ายขึ้นที่เหมาะสมสำหรับตัวอย่างทางคณิตศาสตร์
²² นอกจากนี้ถ้ามันเกิดขึ้นสมมติว่าเหรียญทรงกลม
types และเรียงพิมพ์ที่ดีขึ้น


8

ฉันจำปัญหาที่ฉันต้องแก้ไขในระหว่างการแข่งขันเขียนโปรแกรมนักเรียนในปี 2544 ปัญหาคือปัญหานี้:

มวลที่ได้รับจาก 1, 7, 13, ... (ฉันจำไม่ได้ว่าคนไหนที่มีมวล แต่มีจำนวน จำกัด แน่นอนของมวลชน) ออกแบบฟังก์ชั่นที่พิจารณาว่าน้ำหนักที่กำหนดสามารถชั่งน้ำหนักในระดับนี้ได้หรือไม่ ชุดมวลชน

ฉันเริ่มด้วยลูปซ้อนกัน แต่ชนกำแพงอย่างรวดเร็ว จากนั้นฉันก็เริ่มตระหนักว่าฉันต้องเริ่มต้นด้วยการแจกแจงสิ่งที่สามารถทำได้กับมวลเบาก่อนที่จะไปกับคนที่หนักกว่า ฉันสามารถแก้ปัญหาด้วยลูปที่ไม่ได้ทดสอบมากมาย

ถ้าฉันไม่หยิ่งและพอเพียงในวัยเยาว์ในเวลานั้น (และหากฉันรู้จักและฝึกฝนการสร้างฟังก์ชั่น) ฉันอาจกำหนดปัญหาด้วยการสร้างฟังก์ชั่นดังกล่าว:

กำหนดเป็น OGF ตามจำนวนวิธีที่น้ำหนักสามารถชั่งน้ำหนักได้เมื่อตั้งค่ามวลชน(x)n

น้ำหนักบนกระทะที่ถูกต้องฉันสามารถชั่งน้ำหนักเท่าใดเมื่อมีมวล 1 อัน

สามความเป็นไปได้:

  • ถ้าฉันเอามวลไปไว้บนกระทะซ้ายฉันก็สามารถชั่งน้ำหนักได้ 1
  • ถ้าฉันเอามวลไปวางบนกระทะที่ถูกต้องฉันก็จะได้น้ำหนัก -1
  • หากฉันไม่ได้ใช้มวลฉันสามารถชั่งน้ำหนักได้ 0

จึงมีวิธีหนึ่งที่จะมีน้ำหนักวิธีหนึ่งที่จะมีน้ำหนักและวิธีหนึ่งที่จะมีน้ำหนัก1ฟังก์ชั่นการสร้างสำหรับมวลนี้เป็นอะไรที่เหมือนซึ่งสอดคล้องกับ:-101x-1+1+x

1-x3x(1-x)

ฟังก์ชั่นการสร้างสำหรับมวลเดี่ยวคือซึ่งก็คือ:ม.x-ม.+1+xม.

1-x3ม.xม.(1-xม.)

เมื่อได้รับมัลติเซ็ตของมวลชนจะแสดงเป็นผลคูณของฟังก์ชันสร้างมวลเดี่ยว:M

(x)=Πม.M(1-x3ม.)xΣม.Mม.Πม.M(1-xม.)

ตอนนี้รับแพ็คเกจที่สามารถดำเนินการเกี่ยวกับพหุนามคุณต้อง:

  • คำนวณทั้งผลิตภัณฑ์
  • ดำเนินการแบ่งผลิตภัณฑ์เหล่านี้เริ่มต้นด้วยระดับต่ำสุด (ซึ่งสิ้นสุด)
  • เลื่อนพหุนาม (euclidian หารด้วยรักษาความฉลาดทางและทิ้งส่วนที่เหลือ)xk

และคุณทำเสร็จแล้ว ตอนนี้พหุนามของคุณมีหลายวิธีในการชั่งน้ำหนักที่ดัชนีWการป้อนข้อมูลเพียงอย่างเดียวคือ MultiSet ของฝูงMW0WM

ฉันออกแบบอัลกอริทึมโดยใช้ส่วนประกอบเสียงทางคณิตศาสตร์ ส่วนหลักของอัลกอริทึมซึ่งเป็นส่วนพหุนามที่มีระดับต่ำสุดก่อนเป็นเส้นตรงและสามารถดำเนินการได้โดยแพ็คเกจนอกชั้นวาง อาจไม่ดีที่สุด แต่มันก็ทำงานได้ดีกว่าสิ่งที่ฉันทำในการแข่งขันและในทางที่ผิดพลาดน้อยกว่า

หากคุณดูกระบวนการแบ่งอย่างใกล้ชิดคุณจะเห็นได้อย่างรวดเร็วว่าส่วนที่เหลือสามารถมองเห็นเป็น "สถานะที่ซ่อนอยู่ในปัจจุบัน" ในทุกสถานะของกระบวนการและความฉลาดเป็นผลลัพธ์ กระบวนการจะสิ้นสุดลงเมื่อ "สถานะที่ซ่อนอยู่ในปัจจุบัน" ถึงศูนย์ทุกที่

คุณสามารถนำพหุนามไปใช้เป็นอาร์เรย์ได้หรือถ้าพวกมันกระจัดกระจายจริงๆเป็นรายการที่มีค่าสัมประสิทธิ์ดัชนีสั่งและสิ่งนี้จะไม่เปลี่ยนอัลกอริทึม


3

ในขณะที่การพัฒนาอัลกอริธึมสำหรับการเพิ่มซับโทนแบบโมโนโทนหนึ่งผ่าน matroid เราต้องแก้ปัญหาการเกิดซ้ำ หลังจากสังเกตว่า , เราลดปัญหาในการคำนวณลำดับสากลบาง(0)} หลังสำเร็จโดยใช้ฟังก์ชั่นการสร้างและจากนั้นเราได้สูตรที่ชัดเจนสำหรับอีกครั้งโดยใช้ฟังก์ชั่นการสร้าง คุณสามารถหาคำตอบในบทความนี้ได้หากคุณสงสัย แต่เราไม่เคยใส่ใจที่จะรวมแหล่งที่มานี้

γ+1(ม.)=(2-ม.)γ(ม.)+(ม.-+1)γ-1(ม.),γ0(ม.)=1,γม.+1(ม.)=อี.
γ(ม.)=ม.(γ(ม.-1)-γ-1(ม.-1))γ(0)γ(ม.)

0

บางทีการศึกษาอย่างละเอียดของ Quicksort และตัวแปรหลายอย่างเป็นตัวอย่างที่ชัดเจนที่สุด มีการพิจารณาแบบ combinatoric ภายใต้การพิจารณาของทางเลือกและการวิเคราะห์คำตอบของสมการที่ค่อนข้างซับซ้อนแสดงให้เห็นถึงข้อได้เปรียบด้านประสิทธิภาพ (หรือไม่) ของพวกเขา

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