Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

การเรียงลำดับทอพอโลยีโดยใช้ Javascript DFS


การเรียงลำดับทอพอโลยีหรือการจัดลำดับทอพอโลยีของกราฟกำกับเป็นการเรียงลำดับเชิงเส้นของจุดยอดในลักษณะที่ว่าสำหรับรังสีอัลตราไวโอเลตทุกเส้นจากจุดยอด u ถึงจุดยอด v u มาก่อน v ในลำดับ สิ่งนี้สมเหตุสมผลในกราฟกำกับเท่านั้น

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

ตัวอย่าง

 /**
   *       CS101  CS102
   *       /       \ /
   *      CS204    CS340
   *       \      /| \
   *       CS380   | CS410
   *          \    | /
   *           CS540
*/

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

CS101 -> CS204 -> CS102 -> CS340 -> CS410 -> CS380 -> CS540
CS102 -> CS101 -> CS340 -> CS204 -> CS410 -> CS380 -> CS540

ให้เราปรับใช้สิ่งนี้ใน JavaScript เราจะเขียน 2 ฟังก์ชัน ได้แก่ การเรียงลำดับทอพอโลยี และทอพอโลยีSortHelper เพื่อช่วยทำเครื่องหมายและสำรวจกราฟแบบเรียกซ้ำ

ตัวอย่าง

topologicalSortHelper(node, explored, s) {
   explored.add(node);
   // Marks this node as visited and goes on to the nodes
   // that are dependent on this node, the edge is node ----> n
   this.edges[node].forEach(n => {
      if (!explored.has(n)) {
         this.topologicalSortHelper(n, explored, s);
      }
   });
   // All dependencies are resolved for this node, we can now add
   // This to the stack.
   s.push(node);
}

topologicalSort() {
   // Create a Stack to keep track of all elements in sorted order
   let s = new Stack(this.nodes.length);
   let explored = new Set();

   // For every unvisited node in our graph, call the helper.
   this.nodes.forEach(node => {
      if (!explored.has(node)) {
         this.topologicalSortHelper(node, explored, s);
      }
   });

   while (!s.isEmpty()) {
      console.log(s.pop());
   }
}

คุณสามารถทดสอบสิ่งนี้ได้โดยใช้ -

ตัวอย่าง

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.addDirectedEdge("A", "C");
g.addDirectedEdge("A", "B");
g.addDirectedEdge("A", "D");
g.addDirectedEdge("C", "D");
g.addDirectedEdge("D", "E");
g.addDirectedEdge("E", "F");
g.addDirectedEdge("B", "G");

g.topologicalSort();

กราฟที่เราสร้างดูเหมือน -

ตัวอย่าง

/**
   *         A
   *       / | \
   *       C | B
   *       \ | |
   *         D G
   *         |
   *         E
   *         |
   *         F
*/

ผลลัพธ์

สิ่งนี้จะให้ผลลัพธ์ -

A
B
G
C
D
E
F