BFS เยี่ยมชมจุดยอดเพื่อนบ้านก่อนที่จะไปที่จุดยอดย่อย และใช้คิวในกระบวนการค้นหา ต่อไปนี้เป็นวิธีการทำงานของ BFS -
- เยี่ยมชมจุดยอดที่ไม่ได้เยี่ยมชมที่อยู่ติดกัน ทำเครื่องหมายว่าเยี่ยมชมแล้ว แสดงมัน ใส่ในคิว
- หากไม่พบจุดยอดที่อยู่ติดกัน ให้นำจุดยอดแรกออกจากคิว
- ทำซ้ำกฎ 1 และกฎ 2 จนกว่าคิวจะว่าง
ให้เราดูภาพประกอบว่า BFS Traversal ทำงานอย่างไร:
ขั้นตอน | ข้ามผ่าน | คำอธิบาย |
---|---|---|
1 | เริ่มต้นคิว | |
2 | เราเริ่มต้นด้วยการไปที่ S (โหนดเริ่มต้น) และทำเครื่องหมายว่าเข้าชมแล้ว | |
3 | จากนั้นเราจะเห็นโหนดที่อยู่ติดกันที่ไม่ได้เยี่ยมชมจาก S. ในตัวอย่างนี้ เรามีสามโหนด แต่ตามลำดับตัวอักษร เราเลือก A, ทำเครื่องหมายว่าเข้าชมแล้วเข้าคิว | |
4 | ถัดไป โหนดที่อยู่ติดกันที่ไม่ได้เยี่ยมชมจาก S คือข . เราทำเครื่องหมายว่าเข้าชมแล้วและจัดคิวให้ | |
5 | ถัดไป โหนดที่อยู่ติดกันที่ไม่ได้เยี่ยมชมจาก S คือ C . เราทำเครื่องหมายว่าเข้าชมแล้วและจัดคิวให้ | |
6 | เอาล่ะ ซ ถูกทิ้งไว้โดยไม่มีโหนดที่อยู่ติดกันที่ยังไม่ได้เยี่ยมชม เลยดับเครื่องและพบว่า A . | |
7 | ตั้งแต่ A เรามี D เป็นโหนดที่อยู่ติดกันที่ไม่ได้เยี่ยมชม เราทำเครื่องหมายว่าเข้าชมแล้วและจัดคิวให้ |
ในขั้นตอนนี้ เราจะไม่มีโหนดที่ไม่ได้ทำเครื่องหมาย (ไม่ได้เยี่ยมชม) แต่ตามอัลกอริธึม เราจะทำการ dequeuing ต่อไป เพื่อให้ได้โหนดที่ยังไม่ได้เยี่ยมชมทั้งหมด เมื่อคิวว่าง โปรแกรมก็จบ
มาดูกันว่าเราจะใช้สิ่งนี้ใน JavaScript ได้อย่างไร
ตัวอย่าง
BFS(node) { // Create a Queue and add our initial node in it let q = new Queue(this.nodes.length); let explored = new Set(); q.enqueue(node); // Mark the first node as explored explored. add(node); // We'll continue till our queue gets empty while (!q.isEmpty()) { let t = q.dequeue(); // Log every element that comes out of the Queue console.log(t); // 1. In the edges object, we search for nodes this node is directly connected to. // 2. We filter out the nodes that have already been explored. // 3. Then we mark each unexplored node as explored and add it to the queue. this.edges[t] .filter(n => !explored.has(n)) .forEach(n => { explored.add(n); q.enqueue(n); }); } }
คุณสามารถทดสอบฟังก์ชันนี้ได้โดยใช้ -
ตัวอย่าง
let g = new Graph(); g.addNode("A"); g.addNode("B"); g.addNode("C"); g.addNode("D"); g.addNode("E"); g.addNode("F"); g.addNode("G"); g.addEdge("A", "C"); g.addEdge("A", "B"); g.addEdge("A", "D"); g.addEdge("D", "E"); g.addEdge("E", "F"); g.addEdge("B", "G"); g.BFS("A");
ผลลัพธ์
สิ่งนี้จะให้ผลลัพธ์ -
A C B D G E F