درک نمودارها در JavaScript: ماتریس مجاور در مقابل لیست مجاور

مقدمه
نمودارها یکی از اساسی ترین ساختارهای داده در علوم کامپیوتر است. آنها از گره هایی تشکیل شده اند (که به آن راس نیز گفته می شود) که توسط لبه ها متصل هستند. نمودارها به طور گسترده در برنامه های مختلف در دنیای واقعی ، مانند شبکه های اجتماعی ، سیستم های ناوبری و موتورهای توصیه استفاده می شوند.
در این پست ، ما دو روش مشترک برای نشان دادن نمودارها را کشف خواهیم کرد: ماتریس مجاورت وت لیست مجاورتبشر ما همچنین هر دو نمایش را در JavaScript پیاده سازی می کنیم و کارآیی آنها را با هم مقایسه می کنیم.
انواع نمایش های نمودار
1. ماتریس مجاور
یک ماتریس مجاور یک آرایه 2D (یا ماتریس) است که نشان دهنده اتصالات بین گره ها است. اگر لبه ای بین گره وجود داشته باشد i
و گره j
، ماتریس در موقعیت [i][j]
حاوی 1
(یا وزن لبه ، در مورد نمودارهای وزنی). در غیر این صورت ، حاوی آن است 0
بشر
اجرای در جاوا اسکریپت
class Graph {
constructor(numNodes) {
this.matrix = [];
for (let i = 0; i < numNodes; i++) {
this.matrix.push(new Array(numNodes).fill(0));
}
}
addEdge(to, from) {
if (!this.isEdge(to, from) && !this.isEdge(from, to)) {
this.matrix[to][from] = 1;
this.matrix[from][to] = 1;
} else {
console.log("Edge already exists", to, from);
}
}
removeEdge(from, to) {
this.matrix[from][to] = 0;
this.matrix[to][from] = 0;
}
isEdge(from, to) {
return this.matrix[from][to] === 1;
}
}
const graph = new Graph(3);
graph.addEdge(0, 1);
graph.addEdge(0, 2);
console.log(graph.matrix);
/*
Output :
[
[0, 1, 1],
[1, 0, 0],
[1, 0, 0]
]
*/
2. لیست مجاورت
یک لیست مجاور یک نمودار با استفاده از a نقشه هش (شیء در جاوا اسکریپت) که در آن هر کلید (گره) مجموعه ای از گره های متصل را ذخیره می کند.
اجرای در جاوا اسکریپت
// adjacency list ( unweighted and undirected graph )
/**
* {
1: [2, 3],
2: [1],
3: [1]
}
*/
class AdjacencyList {
constructor() {
this.list = {}
}
addNode(node) {
if(this.list[node]){
console.log(`${node} already exists`);
return false;
}
this.list[node] = []
return true
}
addEdge(from, to) {
if (!this.list[from] || !this.list[to]) {
console.log(`One or both nodes (${from}, ${to}) do not exist.`);
return;
}
if(!this.isEdge(from, to)){
this.list[from].push(to);
this.list[to].push(from);
}
}
removeEdge(from, to) {
if (this.list[from]) {
this.list[from] = this.list[from].filter(node => node !== to)
}
if (this.list[to]) {
this.list[to] = this.list[to].filter(node => node !== from)
}
}
isEdge(from, to) {
//return this.list[from]?.includes(to) || false;
return this.list[from] ? this.list[from].indexOf(to) !== -1 : false
}
}
const newGraph = new AdjacencyList();
newGraph.addNode(1)
newGraph.addNode(2)
newGraph.addNode(3)
newGraph.addEdge(1,2)
newGraph.addEdge(1,3)
console.log(newGraph)
ماتریس مجاور در مقابل لیست مجاورت – اختلافات بررسی لبه
ماتریس مجاور (آرایه 2D)
if (!this.isEdge(from, to) || !this.isEdge(to, from))
-
ماتریس یک است آرایه 2D با اندازه ثابت جایی که ما هر دو را به صورت دستی تنظیم می کنیم
matrix[from][to]
وتmatrix[to][from]
به1
بشر -
از آنجا که ما لبه ها را صریحاً در آن ذخیره می کنیم هر دو جهت، بررسی هر دو برای اطمینان از تقارن در یک نمودار غیرمجاز.
-
نمونه ماتریس برای 3 گره:
0 1 2 0 [0, 1, 1] 1 [1, 0, 0] 2 [1, 0, 0]
- اگر
(0,1)
وجود دارد ، پس(1,0)
باید همچنین وجود دارد - بررسی تضمین می کند که هر دو موقعیت به طور مداوم به روز می شوند.
- اگر
لیست مجاور (شی با آرایه ها)
if (!this.isEdge(from, to)) {
-
لیست مجاورت لبه ها را در یک روش تک جهته (ما هر دو را به صورت دستی فشار می دهیم
from → to
وتto → from
). -
اگر
from
حاویto
، پسto
اراده بطور خودکار حاوی بودنfrom
، زیرا ما هر دو را همزمان اضافه می کنیم. -
لیست نمونه:
{ 0: [1, 2], 1: [0], 2: [0] }
- اگر
0 → 1
وجود دارد ، پس1 → 0
است ، قبلاً تضمین شده استبشر - بنابراین ، بررسی فقط یک جهت کافی است.
- اگر
مقایسه: ماتریس مجاور در مقابل لیست مجاورت
نشان | ماتریس مجاورت | لیست مجاورت |
---|---|---|
پیچیدگی فضا | o (v^2) | O (V + E) |
بررسی یک لبه | o (1) | o (v) |
اضافه کردن یک لبه | o (1) | o (1) |
حذف یک لبه | o (1) | o (v) |
بهترین برای نمودارهای متراکم | ✅ | ❌ |
بهترین برای نمودارهای پراکنده | ❌ | ✅ |
برنامه های کاربردی در دنیای واقعی نمودارها
-
شبکه های اجتماعی (دوستان فیس بوک ، LinkedIn Connections)
-
Google Maps (یافتن کوتاهترین مسیر)
-
سیستم های توصیه (Netflix ، پیشنهادات محصول آمازون)
پایان
هر دو ماتریس مجاورت وت لیست مجاورت جوانب مثبت و منفی خود را داشته باشید. انتخاب به مورد استفاده بستگی دارد:
کدام روش را ترجیح می دهید؟ در نظرات به من اطلاع دهید! 🚀
از خواندن شما متشکرم! امیدوارم این موضوع درک روشنی از ماتریس و لیست های مجاور داشته باشد. در وبلاگ بعدی ، ما به تکنیک های نمودار Traversal مانند BFS و DFS شیرجه می زنیم.
💬 بیایید وصل شویم!
اینستاگرام