برنامه نویسی

درک نمودارها در 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 شیرجه می زنیم.

💬 بیایید وصل شویم!

توییتر

اینستاگرام

نهایی

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا