เหตุใดจึงกล่าวได้ว่าการค้นหาแบบกว้างแรกแสดงในเวลา


9

มันมักจะระบุไว้ (เช่นในวิกิพีเดีย ) ที่เวลาทำงานของการค้นหาในแนวกว้าง (BFS) ในกราฟเป็น|) อย่างไรก็ตามกราฟที่เชื่อมต่อใด ๆ มีและแม้ในกราฟที่ไม่ได้เชื่อมต่อ BFS จะไม่มองจุดยอดนอกส่วนประกอบที่มีจุดยอดเริ่มต้น องค์ประกอบนั้นมีอย่างมาก ขอบดังนั้นมันจึงมีจุดยอดมากที่สุดและนั่นเป็นสิ่งเดียวที่อัลกอริธึมจะเข้าชมG=(V,E)O(|V|+|E|)|V||E|+1|E||E|+1

ซึ่งหมายความว่าดังนั้นทำไมเราไม่พูดว่าเวลาทำงานเป็นเพียง ?|V|+|E|2|E|+1O(|E|)

นี้ขึ้นมาในความคิดเห็นในคำถามเกี่ยวกับเวลาทำงานของอัลกอริทึม Disjkstra ของ


ทำไมคุณคิดว่ามีจุดสุดยอดเริ่มต้น? BFS ในปัญหาการจับคู่สูงสุดตัวอย่างเช่นเริ่มจากจุดยอดที่ไม่ตรงกันในอัลกอริทึม hopcroft karp ในกรณีนี้ถ้ากราฟที่ระบุเป็นฟอเรสต์ของส่วนประกอบที่เชื่อมต่อจำนวนมากเราจะมีจุดยอดมากกว่า edgers และเราจะไปเยี่ยมพวกมันทั้งหมด
narek Bojikian

2
@narekBojikian ในขณะที่ BFS สามารถใช้งานได้หลายวิธีเมื่อนำเสนอเป็นอัลกอริธึมแบบสแตนด์อะโลนมันค่อนข้างจะมีจุดเริ่มต้นเสมอ
David Richerby

คำตอบ:


9

โดยทั่วไปแล้ว BFS จะอธิบายบางอย่างดังนี้ (จากWikipedia )

 1  procedure BFS(G,start_v):
 2      let Q be a queue
 3      label start_v as discovered
 4      Q.enqueue(start_v)
 5      while Q is not empty
 6          v = Q.dequeue()
 7          if v is the goal:
 8              return v
 9          for all edges from v to w in G.adjacentEdges(v) do
10             if w is not labeled as discovered:
11                 label w as discovered
12                 w.parent = v
13                 Q.enqueue(w)

ปัญหานี้ค่อนข้างบอบบาง: ซ่อนอยู่ในบรรทัดที่ 3! คำถามคือเราจะใช้โครงสร้างข้อมูลใดในการจัดเก็บจุดยอดที่ถูกค้นพบ?

ทางออกที่ง่ายที่สุดคือการใช้อาร์เรย์บูลีนกับหนึ่งรายการต่อยอด ในกรณีนี้เราจะต้องเริ่มต้นองค์ประกอบของอาร์เรย์ทุกfalseนี้และต้องใช้เวลา|) สิ่งนี้ใช้กับกราฟทุกอันแม้ว่าจะไม่มีขอบเลยดังนั้นเราจึงไม่สามารถสรุปความสัมพันธ์ระหว่างและ และเราได้รับเป็นเวลาการทำงานของ|)Θ(|V|)|V||E|O(|V|+|E|)

เราสามารถหลีกเลี่ยงโครงสร้างข้อมูลด้วยเวลาเริ่มต้นหรือไม่? ความพยายามครั้งแรกของเราอาจจะใช้รายการเชื่อมโยง อย่างไรก็ตามตอนนี้ทดสอบว่ามีการค้นพบจุดสุดยอด (บรรทัดที่ 10) ต้องใช้เวลาเป็นเส้นตรงในจำนวนจุดยอดเยี่ยมแทนที่จะเป็นเวลาคงที่เหมือนเมื่อก่อน ซึ่งหมายความว่าเวลาทำงานกลายเป็นซึ่งเลวร้ายยิ่งกว่าในกรณีที่เลวร้ายที่สุด (โปรดทราบว่าเราไม่ต้องการเขียนซ้ำว่าเป็นเนื่องจากมันแย่ยิ่งกว่า: มันอาจจะแย่กว่าในขณะที่ )Θ(|V|)O(|V||E|)O(|E|2)|V|4|V||E||V|3

การใช้อาร์เรย์ที่ปรับขนาดแบบไดนามิกจะช่วยให้เราสามารถเรียงลำดับรายการดังนั้นตอนนี้การค้นหาจะใช้เวลาเพียงแต่ยังคงให้เวลาในการรันเพียงซึ่งยังคงแย่กว่ามาตรฐานO(log|V|)O(|E|log|V|)

ในที่สุดเราสามารถใช้ตารางแฮชแบบไดนามิกขนาด: เริ่มต้นด้วยตารางขนาดคงที่ และเพิ่มเป็นสองเท่าทุกครั้งที่ได้รับครึ่งเต็ม นี่หมายความว่าขนาดสุดท้ายของตารางเป็นสองเท่าของจำนวนจุดยอดที่ถูกค้นพบก่อนที่อัลกอริทึมจะสิ้นสุดและนี่คือมากที่สุดเพราะเราไม่เคยค้นพบอะไรเลยนอกส่วนประกอบของจุดเริ่มต้น นอกจากนี้จำนวนงานทั้งหมดที่ทำเสร็จแล้วการคัดลอกตารางแฮชที่จะขยายมากที่สุดคือ. การค้นหาและการแทรกลงในตารางแฮชจะถูกตัดจำหน่ายดังนั้นเราจึงได้เวลาแน่นอนc|E|+1c+2c+4c++2|E|4|E| O(1)O(|E|)

ดังนั้นจึงเป็นไปได้ แต่ต้องการทำเช่นนั้นในการดำเนินการจริงหรือไม่? ฉันจะบอกว่าอาจจะไม่ หากคุณไม่มีเหตุผลที่จะเชื่อว่ากราฟอินพุตของคุณจะมีส่วนประกอบขนาดเล็กจำนวนมากค่าใช้จ่ายในการบำรุงรักษาตารางแฮชจะเพิ่มปัจจัยคงที่ที่เห็นได้ชัดเจนในเวลาทำงาน การเพิ่มตารางแฮชอาจใช้เวลาและการค้นหาจะทำให้คุณต้องคำนวณฟังก์ชันแฮชและโดยเฉลี่ยแล้วให้ดูที่ช่องมากกว่าหนึ่งช่องในตาราง ประสิทธิภาพการทำงานแคชที่ไม่ดีของตารางแฮชอาจทำให้คุณเสียหายบนคอมพิวเตอร์จริง ในกรณีส่วนใหญ่ที่มีการใช้อาร์เรย์มาตรฐานส่วนเป็นคำที่โดดเด่นของO(|E|)4|E|O(|E|)O(|V|+|E|) เวลาทำงานดังนั้นจึงไม่คุ้มค่าที่จะใช้ตารางแฮชเพื่อลบคำศัพท์ที่ได้รับเนื่องจากค่าใช้จ่ายจริงในการทำเช่นนี้


1
ฉันคิดว่ามันอาจจะแรงเกินกว่าที่จะอ้างว่าตารางแฮชในทางปฏิบัติมีประสิทธิภาพของแคชต่ำ หากดำเนินการด้วยการผูกมัด (เช่นรายการที่เชื่อมโยง) ฉันเห็นด้วย แต่ถ้านำมาใช้กับหน่วยความจำอย่างต่อเนื่องและเปิดที่อยู่ไม่มาก
Juho

คำตอบที่ยอดเยี่ยมแน่นอน! แม้ว่าจะมีหมายเหตุเล็กน้อยหนึ่งตารางแฮชที่มีขนาดแบบไดนามิกนั้นเป็นตัวเลือกที่ดีไม่เพียง แต่หากมีส่วนประกอบขนาดเล็กจำนวนมาก แต่หากค่าแฮชสำหรับจุดสุดยอดใด ๆ ถูก จำกัด ด้วยค่าคงที่ที่เหมาะสมและเกิดขึ้นบ่อยครั้ง ตอบที่ดี!
Carlos Linares López

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