Rumah > Artikel > hujung hadapan web > Mendekati Struktur Data Graf menggunakan Javascript
Satu senarai bersebelahan dan matriks bersebelahan ialah dua cara biasa untuk mewakili graf dalam sains komputer.
Senarai Bersebelahan:
Kebaikan:
Keburukan:
Matriks Bersebelahan:
Kebaikan:
Keburukan:
nota penting
Graf Traversal
Mencari jalan terpendek BFS adalah lebih baik
*Graf Berarah vs Tidak Berarah: *
Graf terarah, juga dipanggil digraf, ialah graf di mana setiap tepi mempunyai arah. Tepi menghala dari satu bucu ke bucu yang lain.
Graf tidak terarah ialah graf di mana tepi tidak mempunyai orientasi. Tepi (x, y) adalah sama dengan tepi (y, x).
Graf Berwajaran vs Tidak Berwajaran:
Graf berwajaran ialah graf di mana setiap tepi diberi pemberat atau kos. Ini berguna dalam masalah di mana bahagian tepi tertentu mempunyai kepentingan atau panjang yang berbeza.
Graf tidak berwajaran ialah graf di mana semua tepi mempunyai berat atau kos yang sama.
Gelung Kendiri:
Graf Jarang lwn Padat:
A graf jarang ialah graf yang bilangan tepinya hampir dengan bilangan tepi minima. Dalam erti kata lain, terdapat sedikit tepi antara bucu.
Graf padat ialah graf yang bilangan tepinya hampir dengan bilangan tepi maksimum yang mungkin. Dalam erti kata lain, terdapat banyak tepi antara bucu.
Graf Kitaran lwn Asiklik:
Graf kitaran ialah graf yang mengandungi sekurang-kurangnya satu kitaran (laluan tepi dan bucu di mana bucu boleh dicapai dari dirinya sendiri).
Graf asiklik ialah graf tanpa kitaran. Jenis graf akiklik khas yang dipanggil pokok, ialah graf bersambung, tidak berarah tanpa kitaran.
// Weighted graph adjacency list would look like { 1: [ {node: 2, weight: 50}, {node: 3, weight: 60}] ... 6: [{node: 1, weight: 40}, {node:5, weight:30 }, {node:4, weight: 90}] }
class Graph { constructor() { this.adjList = {}; } addNode(value) { this.adjList[value] = [] } addEdge(node1, node2) { this.adjList[node1].push(node2); this.adjList[node2].push(node1); } removeEdge(node1, node2) { this.removeElement(node1, node2); this.removeElement(node2, node1); } removeElement(node, value) { const index = this.adjList[node].indexOf(value); this.adjList[node] = [...this.adjList[node].slice(0, index), ...this.adjList[node].slice(index+1)]; } removeNode(node) { const connectedNodes = this.adjList[node]; for (let connectedNode of connectedNodes) { this.removeElement(connectedNode, node); } delete this.adjList[node]; } depthFirstTraversal(startNode) { const stack = []; const visited = {}; stack.push(startNode); visited[startNode] = true; while(stack.length > 0) { const currentNode = stack.pop(); const connectedNodes = this.adjList[currentNode]; console.log(currentNode); connectedNodes.forEach(connectedNode => { if (!visited[connectedNode]) { visited[connectedNode] = true; stack.push(connectedNode); } }) } } breathFirstTraversal(startNode) { const queue = []; const visited = {} queue.push(startNode); visited[startNode] = true; while(queue.length > 0) { const currentElement = queue.shift(); const connectedNodes = this.adjList[currentElement]; console.log(currentElement); connectedNodes.forEach(connectedNode => { if (!visited[connectedNode]) { visited[connectedNode]=true; queue.push(connectedNode); } }); } } } const test = new Graph(); test.addNode(1); test.addNode(2); test.addNode(3); test.addNode(4); test.addNode(5); test.addNode(6); test.addEdge(1,2) test.addEdge(1,3) test.addEdge(1,6) test.addEdge(2, 3); test.addEdge(2, 5); test.addEdge(2, 4); test.addEdge(3, 4); test.addEdge(3, 5); test.addEdge(4, 5); test.addEdge(4, 6); test.addEdge(5, 6); console.log('After adding all node and Edge --> ', test.adjList) test.removeNode(4); console.log('After Removing node 4 --> ', test.adjList) console.log('----------Depth First Traversal -------------') test.depthFirstTraversal(1); console.log('----------Breath First Traversal -------------') test.breathFirstTraversal(1); /* After adding all node and Edge --> { '1': [ 2, 3, 6 ], '2': [ 1, 3, 5, 4 ], '3': [ 1, 2, 4, 5 ], '4': [ 2, 3, 5, 6 ], '5': [ 2, 3, 4, 6 ], '6': [ 1, 4, 5 ] } After Removing node 4 --> { '1': [ 2, 3, 6 ], '2': [ 1, 3, 5 ], '3': [ 1, 2, 5 ], '5': [ 2, 3, 6 ], '6': [ 1, 5 ] } ----------Depth First Traversal ------------- 1 6 5 3 2 ----------Breath First Traversal ------------- 1 2 3 6 5 */
Atas ialah kandungan terperinci Mendekati Struktur Data Graf menggunakan Javascript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!