อัลกอริธึมที่มีประสิทธิภาพสำหรับการเรียกการปิดสกรรมกริยาของกราฟเชิงเส้นกำกับ


14

ฉันพยายามที่จะแก้ปัญหากราฟ (ไม่ใช่สำหรับการบ้านเพียงเพื่อฝึกทักษะของฉัน) DAG จะถูกกำหนดโดยที่VคือชุดของจุดยอดและEคือขอบ กราฟจะแสดงเป็นรายการถ้อยคำดังนั้นโวลต์เป็นชุดที่มีการเชื่อมต่อทั้งหมดของโวลต์ งานของฉันคือการหาที่จุดสามารถเข้าถึงได้จากแต่ละจุดสุดยอดวี V โซลูชันที่ฉันใช้มีความซับซ้อนของ O ( V 3 )G(V,E)VEAvvvVO(V3)ด้วยการปิดสกรรมกริยา แต่ฉันอ่านว่าในบล็อกมันสามารถเร็วกว่าแม้ว่ามันจะไม่เปิดเผยก็ตาม ใครช่วยบอกฉันอีกวิธีหนึ่ง (มีความซับซ้อนที่ดีขึ้น) เพื่อแก้ปัญหาการปิดสกรรมกริยาใน DAG?


ลองดูที่: stackoverflow.com/questions/3517524/…
AJed

และสิ่งนี้: cs.hut.fi/~enu/thesis.html
AJed

อย่างไรก็ตามข้อเสนอแนะของฉันคือการให้ ) แต่ลองลดจำนวนการเปรียบเทียบโดยเฉลี่ย นั่นคือเดาและเพิ่มกฎง่าย ๆ สำหรับอัลกอริทึมของคุณ คุณสามารถใช้การคูณเมทริกซ์ - แต่ถ้าคุณใช้มันสำหรับกราฟขนาดเล็ก - มันก็แค่เป็นระเบียบและในความเป็นจริงในการฝึกฝนวิธีการของคุณดีกว่า O(|V|3)
AJed

@AJed ในปัญหานี้โดยเฉพาะจะเกินเวลาที่กำหนด O(V3)
Rontogiannis Aristofanis

2
@RondogiannisAristophanes เมื่อคุณพูดถึงการ จำกัด เวลาคุณหมายถึงว่านี่เป็นปัญหาในการเขียนโปรแกรม / อัลกอริทึมบางอย่างที่ท้าทายเช่น topcoder หรือไม่? ถ้าเป็นเช่นนั้นและถ้าคุณแน่ใจว่าคุณได้ใช้โซลูชันอย่างถูกต้องคุณอาจต้องการดูปัญหาอีกครั้ง อาจมีทรัพย์สินที่ซ่อนอยู่ซึ่งอาจทำให้สิ่งต่าง ๆ ง่ายขึ้นหรืออาจมีวิธีที่ดีกว่าในการแสดงปัญหาเพื่อไม่ให้มีการปิดสกรรมกริยา เพราะการปิดสกรรมกริยานั้นยากเท่ากับการคูณเมทริกซ์ อ่าน student.cs.uwaterloo.ca/~cs466/Old_courses/F08/…O(V3)
Paresh

คำตอบ:


8

ความจริงที่ว่ากราฟของเราเป็นแบบวนรอบทำให้ปัญหานี้ง่ายขึ้นมาก

การจัดเรียง topologicalสามารถให้เราสั่งของจุดเช่นว่าถ้าฉัน< Jแล้วมีขอบจากไม่มีวีเจกลับไปวีฉัน เราได้แสดงรายการจุดยอดที่ขอบทั้งหมดไปใน "ไปข้างหน้า" ในรายการของเราv1,v2,,vni<jvjvi

(แก้ไขเพื่อแก้ไขการวิเคราะห์และให้อัลกอริทึมเร็วขึ้นเล็กน้อย)

ตอนนี้เราก็ย้อนกลับไปดูรายการนี้เริ่มต้นที่จุดสุดท้าย n การปิดสกรรมกริยาของv nเป็นเพียงตัวของมันเอง นอกจากนี้ยังเพิ่มV nเพื่อปิดสกรรมกริยาของทุกจุดสุดยอดกับขอบสระV nvnvnvnvn

สำหรับแต่ละจุดสุดยอดอื่น ๆไปจากที่สิ้นสุดหลังแรกเพิ่มโวลต์ฉันไปสู่การปิดสกรรมกริยาของตัวเองแล้วเพิ่มทุกอย่างในการปิดสกรรมกริยาของวีฉันจะปิดสกรรมกริยาของจุดทั้งหมดที่มีขอบสระโวฉันvivivivi

เวลาทำงานเป็นในกรณีที่เลวร้ายที่สุดที่มีnจำนวนจุดและม. O ( n 2 )จำนวนขอบ การจัดเรียง topological ต้องใช้เวลาO ( n + ม. ) จากนั้นเราก็ทำงานO ( m n ) อีกอันใน backward pass: เมื่อเราย้อนกลับไปตามรายการสำหรับแต่ละ edge เราต้องรวมกันเป็นnO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n การปิดจุดยอดของใครบางคน

โปรดทราบว่าคุณสามารถเพิ่มความเร็วได้อย่างต่อเนื่องด้วยการแสดงการปิดบิตของอาร์เรย์ สมมติว่าคุณมีเพียง ; จากนั้นคุณจะใช้ int 64- บิตเดียวโดยที่ bit iคือ 1 ถ้าฉันอยู่ใน transitive closure และ 0 เป็นอย่างอื่น นั้นเป็นส่วนหนึ่งที่เราเพิ่มทุกอย่างในฉัน 'ปิดสกรรมกริยาเพื่อJ ' S มันอย่างรวดเร็ว: เราใช้เวลาเพียงแค่เจ | = Cฉัน (ไบนารีหรือการดำเนินการ)n=64iiijcjci

สำหรับคุณจะต้องเก็บมันไว้ในอาร์เรย์และทำเลขคณิต แต่มันจะเร็วกว่าชุดวัตถุn>64

นอกจากนี้ฉันรู้ว่าตัวใหญ่ - ในกรณีที่เลวร้ายที่สุดคือยังคงเป็นO ( n 3 )แต่การเอาชนะสิ่งนี้ในทางปฏิบัติคุณต้องมีอะไรที่ซับซ้อนกว่านี้ อัลกอริทึมนี้ยังทำงานได้ดีบนกราฟกระจายOO(n3)


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