อัลกอริทึมที่ค้นหาจำนวนเส้นทางง่าย ๆ จาก


34

ทุกคนสามารถแนะนำผมอัลกอริทึมเส้นเวลาที่ใช้เวลาเป็น input กำกับวัฏจักรกราฟG=(V,E)และสองจุดsและtและผลตอบแทนจำนวนเส้นทางที่เรียบง่ายจากsไปtในG ฉันมีขั้นตอนวิธีการที่ฉันจะทำงาน DFS (ความลึกการค้นหาครั้งแรก) แต่ถ้า DFS พบทีแล้วมันจะไม่เปลี่ยนสี (จากสีขาวเป็นสีเทา) ใด ๆ ของโหนดที่มาในเส้นทางs \ rightsquigarrow เสื้อเพื่อให้ ถ้าเป็น subpath ของเส้นทางอื่น ๆ แล้วยัง DFS ผ่านไป subpath นี้ again.For ตัวอย่างพิจารณารายการถ้อยคำที่เราต้องค้นหาหมายเลขของเส้นทางจากหน้าไปวีG
tstpv

poszorsvsrryyvvwzwz
นี่ DFS จะเริ่มต้นด้วยpแล้วให้บอกว่ามันไปที่pzเนื่องจากไม่พบv DFS จะทำงานตามปกติตอนนี้สอง เส้นทางเป็นpsryvเนื่องจากพบvเราจะไม่เปลี่ยนสีของจุดยอดs,r,y,vเป็นสีเทาจากนั้นเส้นทางpovเนื่องจากสีของvยังคงเป็นสีขาวแล้วเส้นทางposryvเนื่องจากสีของsเป็นสีขาวและคล้ายกันของ เส้นทางporyv. ยังมีการรักษาตัวนับซึ่งจะเพิ่มขึ้นเมื่อพบv

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

หมายเหตุ : ที่นี่ฉันได้พิจารณาอัลกอริทึม DFS ที่ให้ไว้ในหนังสือ"รู้เบื้องต้นเกี่ยวกับอัลกอริทึมโดย Cormen"ซึ่งมันสีโหนดตามสถานะของมันดังนั้นถ้าโหนดไม่ได้เยี่ยมชมสำรวจและสำรวจจากนั้นสีจะเป็นสีขาว สีเทาและสีดำตามลำดับทุกสิ่งเป็นมาตรฐาน



4
โปรดทราบว่าเส้นทางทั้งหมดในกราฟ acyclic นั้นจำเป็นต้องเรียบง่าย (โดยอาศัย acyclicity)
Noldorin

คำตอบ:


37

การใช้งานในปัจจุบันของคุณจะคำนวณจำนวนเส้นทางที่ถูกต้องใน DAG อย่างไรก็ตามโดยไม่ทำเครื่องหมายเส้นทางจะใช้เวลาชี้แจง ตัวอย่างเช่นในภาพประกอบด้านล่างแต่ละขั้นตอนของ DAG จะเพิ่มจำนวนเส้นทางทั้งหมดโดยคูณด้วย 3 จากการเติบโตแบบเลขชี้กำลังนี้สามารถจัดการได้ด้วยการเขียนโปรแกรมแบบไดนามิก

dag

การคำนวณจำนวนของเส้นทาง -ใน DAG นั้นได้รับจากการเกิดซ้ำ t Paths ( u ) = { 1 ถ้า  u = t ( u , v ) E Paths ( v ) เป็นอย่างอื่นst

Paths(u)={1if u=t(u,v)EPaths(v)otherwise.

การแก้ไข DFS อย่างง่ายจะคำนวณสิ่งนี้ตามที่กำหนด

def dfs(u, t):
    if u == t:
        return 1
    else:
        if not u.npaths:
            # assume sum returns 0 if u has no children
            u.npaths = sum(dfs(c, t) for c in u.children)
        return u.npaths

มันไม่ได้เป็นเรื่องยากที่จะเห็นว่าแต่ละขอบจะมองเพียงครั้งเดียวจึงรันไทม์ของE)O(V+E)


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

1
@SaurabhHota มันใช้การเขียนโปรแกรมแบบไดนามิก ครั้งแรกที่จุดสุดยอดจะพบว่ามันคำนวณจำนวนเส้นทางที่มันมีการทีสิ่งนี้ถูกเก็บไว้ใน u.npaths แต่ละการเรียกไปยังตามมาจะไม่คำนวณจำนวนเส้นทางใหม่ แต่จะส่งคืน u.npaths ทียูutu
Nicholas Mancuso

1
สำหรับกราฟดังกล่าวไม่ใช่คำตอบเพียง m ^ n โดยที่ m คือจำนวนโหนดในคอลัมน์ (3 ที่นี่) และ n คือจำนวนคอลัมน์ที่ไม่รวม s, t (4 ที่นี่) เอาท์พุทเป็น 3 ^ 4 = 81 สำหรับกราฟตัวอย่าง
saadtaame

@saadtaame แน่นอน; อย่างไรก็ตามความตั้งใจของฉันคือเพียงแสดงการเพิ่มเลขชี้กำลังเมื่อ "ความยาว" ของกราฟเพิ่มขึ้น แน่นอนว่ากราฟที่มีโครงสร้างสูงนั้นคุณสามารถนับในรูปแบบปิดในขณะที่อัลกอริทึมที่แสดงนั้นใช้ได้กับกราฟทั้งหมด
Nicholas Mancuso

3
เวลาทำงานอนุมานว่าคุณสามารถดำเนินการเพิ่มเติมที่จำเป็นในเวลาที่คงที่ แต่ตัวเลขที่เพิ่มเข้ามาสามารถมีบิตในกรณีที่เลวร้ายที่สุด ถ้าคุณต้องการที่แน่นอนจำนวนเส้นทางที่เวลาทำงาน (การดำเนินงานนับบิต) เป็นจริง(VE) Θ ( V ) O ( V E )O(V+E)Θ(V)O(VE)
JeffE

15

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

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


0

จำนวนเส้นทางระหว่างจุดยอดสองจุดใด ๆ ใน DAG สามารถพบได้โดยใช้การแทนเมทริกซ์ adjacency

สมมติว่า A คือเมทริกซ์ adjacency ของ G. การใช้ Kth ของ A หลังจากเพิ่มเมทริกซ์เอกลักษณ์ให้กับมันแล้วให้จำนวนเส้นทางยาว <= K

เนื่องจากความยาวสูงสุดของเส้นทางแบบง่าย ๆ ใน DAG คือ | V | -1 การคำนวณกำลัง | V | -1 นั้นจะให้จำนวนเส้นทางระหว่างจุดยอดทั้งหมด

การคำนวณ | V | -1 กำลังสามารถทำได้โดยทำ log (| V | -1) muliplications แต่ละ TC: | V | ^ 2


คำถามถามถึงขั้นตอนวิธีเชิงเส้นตรง อัลกอริทึมของคุณช้ากว่านั้น
DW

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