โดยทั่วไปแล้ว 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|) เวลาทำงานดังนั้นจึงไม่คุ้มค่าที่จะใช้ตารางแฮชเพื่อลบคำศัพท์ที่ได้รับเนื่องจากค่าใช้จ่ายจริงในการทำเช่นนี้