เหตุใดความซับซ้อนของเวลาของทั้ง DFS และ BFS O (V + E)


137

อัลกอริทึมพื้นฐานสำหรับ BFS:

set start vertex to visited

load it into queue

while queue not empty

   for each edge incident to vertex

        if its not visited

            load into queue

            mark vertex

ดังนั้นฉันคิดว่าความซับซ้อนของเวลาจะเป็น:

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges) 

vจุดยอด1ถึงอยู่ที่ไหนn

ประการแรกสิ่งที่ฉันพูดถูกต้องหรือไม่? ประการที่สองสิ่งนี้เป็นอย่างไรO(N + E)และสัญชาตญาณว่าทำไมถึงดีจริงๆ ขอบคุณ

คำตอบ:


276

ผลรวมของคุณ

v1 + (incident edges) + v2 + (incident edges) + .... + vn + (incident edges)

สามารถเขียนใหม่เป็นไฟล์

(v1 + v2 + ... + vn) + [(incident_edges v1) + (incident_edges v2) + ... + (incident_edges vn)]

และกลุ่มแรกคือO(N)ในขณะที่อื่น ๆ O(E)คือ


1
แต่ทุกจุดยอดจะต้องแยกออกจากคิวและนี่คือบันทึก (| Q |) แล้วส่วนนี้ล่ะ?
Yola

3
log (| Q |) <log (N) <N ดังนั้นคุณสามารถละเว้นคำใน asymptotic ได้อย่างปลอดภัย
Mihai Maruseac

2
หากอยู่ในรายการ adjacency จุดยอดแต่ละจุดเชื่อมต่อกับจุดยอดอื่น ๆ ความซับซ้อนจะเทียบเท่ากับ O (V + E) = O (V + V ^ 2) = O (V ^ 2) E = V ^ 2 เนื่องจากจำนวนขอบมากที่สุด = V ^ 2
สูงสุด

ตามคำตอบของคุณความซับซ้อนจะไม่กลายเป็น O (V + 2E) หรือ? เนื่องจากทุกขอบอาจมีขอบร่วมกับขอบอื่น?
karansky

2
เงื่อนไขคงที่สามารถหลุดได้
Mihai Maruseac

41

DFS (การวิเคราะห์):

  • การตั้งค่า / รับป้ายจุดยอด / ขอบต้องใช้O(1)เวลา
  • แต่ละจุดยอดมีป้ายกำกับสองครั้ง
    • ครั้งเดียวที่ไม่ได้อธิบาย
    • เมื่อเข้าชมแล้ว
  • ขอบแต่ละด้านมีป้ายกำกับสองครั้ง
    • ครั้งเดียวที่ไม่ได้อธิบาย
    • หนึ่งครั้งในการค้นพบหรือย้อนกลับ
  • วิธีการ IncidentEdges ถูกเรียกหนึ่งครั้งสำหรับจุดยอดแต่ละจุด
  • DFS ทำงานO(n + m)ทันเวลาหากกราฟแสดงโดยโครงสร้างรายการ adjacency
  • จำได้ว่า Σv deg(v) = 2m

BFS (การวิเคราะห์):

  • การตั้งค่า / รับป้ายจุดยอด / ขอบใช้เวลา O (1)
  • แต่ละจุดยอดมีป้ายกำกับสองครั้ง
    • ครั้งเดียวที่ไม่ได้อธิบาย
    • เมื่อเข้าชมแล้ว
  • ขอบแต่ละด้านมีป้ายกำกับสองครั้ง
    • ครั้งเดียวที่ไม่ได้อธิบาย
    • ครั้งเดียวเป็น DISCOVERY หรือ CROSS
  • แต่ละจุดยอดจะถูกแทรกหนึ่งครั้งในลำดับ Li
  • วิธีการ IncidentEdges ถูกเรียกหนึ่งครั้งสำหรับจุดยอดแต่ละจุด
  • BFS ทำงานO(n + m)ทันเวลาหากกราฟแสดงโดยโครงสร้างรายการ adjacency
  • จำได้ว่า Σv deg(v) = 2m

tnx สำหรับการแก้ไขฉันยังใหม่ที่นี่ดังนั้นฉันยังคงพยายามจัดการด้วยหน้าจอแก้ไข :)
TheNewOne

1
ขอบคุณที่ระบุว่ากราฟจะถูกแสดงโดยโครงสร้างรายการ adjacency มันทำให้ฉันงงว่าทำไม DFS ถึง O (n + m) ฉันคิดว่ามันเป็น O (n + 2m) เพราะแต่ละขอบถูกลากผ่านสองครั้ง โดย backtracking
mib1413456

23

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


เข้าใจง่ายกว่าสัญกรณ์คณิตศาสตร์โดยไม่ต้องอธิบายเพิ่มเติมแม้ว่านั่นคือสิ่งที่ Google มีไว้สำหรับ
mLstudent33

ทำไมทุกขอบถึงถูกพิจารณาว่าเป็นสองเท่า?
amy

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

11

ความซับซ้อนของเวลาO(E+V)แทนO(2E+V)เพราะถ้าความซับซ้อนของเวลาเป็น n ^ 2 + 2n + 7 จะเขียนเป็น O (n ^ 2)

ดังนั้น O (2E + V) จึงเขียนเป็น O (E + V)

เพราะความแตกต่างระหว่าง n ^ 2 และ n มีความสำคัญ แต่ไม่ใช่ระหว่าง n และ 2n


@Am_I_ มีคนช่วยขอ 2E ข้างบนด้วยสัญกรณ์ใหญ่โอ้ .... ว่าทำไม 2 ไม่ได้รับการพิจารณาในความซับซ้อนของเวลา
Dhruvam Gupta

@Am_I_ Helpful เพียงแค่เห็นโพสต์ด้านบนคำตอบของฉัน .... มีผู้ใช้ชื่อ Kehe CAI เขียนว่า "ฉันคิดว่าทุกขอบได้รับการพิจารณาสองครั้งและทุกโหนดได้รับการเยี่ยมชมหนึ่งครั้งดังนั้นความซับซ้อนของเวลาทั้งหมดควรเป็น O (2E + V ).” ผมก็เลยตอบไปว่า .... เข้าใจแล้ว !!!
Dhruvam Gupta

ฉันลบการลงคะแนนของฉันเพียงเพราะคุณแก้ไขคำตอบของคุณ
Am_I_Helpful

5

คำอธิบายที่เข้าใจง่ายคือการวิเคราะห์ลูปเดียว:

  1. ไปที่จุดยอด -> O (1)
  2. a สำหรับการวนซ้ำบนขอบตกกระทบทั้งหมด -> O (e) โดยที่ e คือจำนวนของขอบที่เกิดขึ้นบนจุดยอดที่กำหนด v.

ดังนั้นเวลาทั้งหมดสำหรับลูปเดียวคือ O (1) + O (e) ตอนนี้รวมมันสำหรับจุดยอดแต่ละจุดเนื่องจากแต่ละจุดยอดถูกเยี่ยมครั้งเดียว สิ่งนี้ให้

For every V
=> 

    O(1)
    +

    O(e)

=> O(V) + O(E)

3

ฉันคิดว่าทุก ๆ ขอบได้รับการพิจารณาสองครั้งและทุกโหนดได้รับการเยี่ยมชมหนึ่งครั้งดังนั้นความซับซ้อนของเวลาทั้งหมดควรเป็น O (2E + V)


แม้แต่ฉันก็รู้สึกเหมือนกัน ใครสามารถให้คำอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้?
Chaitanya

12
การวิเคราะห์ Big O จะไม่สนใจค่าคงที่ O (2E + V) คือ O (E + V)
Hemm

3

คำอธิบายสั้น ๆ แต่เรียบง่าย:

ฉันเป็นกรณีที่แย่ที่สุดที่คุณจะต้องไปที่จุดยอดและขอบทั้งหมดดังนั้นความซับซ้อนของเวลาในกรณีที่เลวร้ายที่สุดคือ O (V + E)


0

เป็น O (V + E) เนื่องจากการเยี่ยมชม v ของ V แต่ละครั้งต้องไปที่ E แต่ละครั้งโดยที่ | e | <= V-1 เนื่องจากมีการเยี่ยมชม V ถึง v ของ V จึงเป็น O (V) ตอนนี้คุณต้องเพิ่ม V * | e | = E => O (อี) ความซับซ้อนของเวลาทั้งหมดจึงเท่ากับ O (V + E)

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