Всем привет,

Сегодня я буду говорить о структурах данных Graph. Графики используются практически во всех социальных сетях, когда мы моделируем пользователей, а также механизмы рекомендаций. Например, когда Youtube или Netflix рекомендуют вам фильмы, графики обычно остаются за кадром. Итак, что такое график? Граф - это просто набор узлов с ребрами между ними. Графики могут быть как направленными, так и неориентированными. Направленные кромки похожи на улицу с односторонним движением, неориентированные кромки похожи на улицу с двусторонним движением.

Графики - это отличные структуры данных , они используются повсеместно. Некоторые из реальных приложений - это Google Maps, Google Search, Facebook, Twitter и многие другие.

Типы графиков

Условия графика:

Вершина → Узел

Edge → Связь между узлами

Взвешенный график → Если на краях графика есть значения, значит, это взвешенный график.

Невзвешенный график → Если на краях графика нет значений, значит, это взвешенный график.

Ненаправленный граф → Граф с неориентированными краями (например, улица с двусторонним движением).

Вы можете думать об этом примере неориентированного графа как о друзьях по моделированию в Facebook. Когда ваш друг отправляет ваш запрос, если вы принимаете его, вы и ваш друг можете видеть материалы друг друга. Это двусторонние отношения.

Пример неориентированных графов, используемых при картировании

Это пример того, как Google дает вам маршруты,

Направленный граф → Граф только с направленными ребрами (например, улица с односторонним движением).

Вы можете думать об этом как о запросе подписки в Instagram над примером направленного графа. Однако, если вы принимаете запрос, они видят ваши материалы, вы также должны запросить их, если хотите увидеть их профиль.

Хранение графиков

Матрицы смежности

Матрица смежности - это квадратная (NxN) логическая матрица (где N - количество узлов). При этом мы храним информацию в строках и столбцах. Мы можем представить отношения между узлами с помощью матрицы.

Вверху справа матрица, представляющая отношения для левого графика. Если вы хотите увидеть взаимосвязь между узлом A и F, вы можете просто посмотреть на столбец F и строку A. Вы должны увидеть Y, что означает «Да». Это работает в обоих направлениях: сначала вы можете перейти к строке F, а затем к столбцу A, вы получите те же результаты.

Каждый раз, когда вы добавляете новый узел, вам придется добавлять совершенно новую строку и новый столбец.

Список смежности

Это наиболее распространенный способ представления графа. Мы можем использовать хеш-таблицу для хранения структуры данных пары ключ-значение.

Используя хеш-таблицу, мы видим, что A связан с (A, B и A, F). Мы можем сделать то же самое для узла B (B, A и B, C).

Реализация графа с использованием списка смежности

class Graph{
    constructor(){
        this.adjacencyList = {};
    }
    addVertex(vertex){
    if(!this.adjacencyList[vertex]) this.adjacencyList[vertex] = [];
    }
    addEdge(vertex1,vertex2){
        this.adjacencyList[vertex1].push(vertex2);
        this.adjacencyList[vertex2].push(vertex1);
    }
    removeEdge(vertex1,vertex2){
        this.adjacencyList[vertex1] =   this.adjacencyList[vertex1].filter(
            v => v !== vertex2
        );
        this.adjacencyList[vertex2] = this.adjacencyList[vertex2].filter(
            v => v !== vertex1
        );
    }
    removeVertex(vertex){
        while(this.adjacencyList[vertex].length){
            const adjacentVertex = this.adjacencyList[vertex].pop();
            this.removeEdge(vertex, adjacentVertex);
        }
        delete this.adjacencyList[vertex]
    }
}

Для сравнения, Список смежности занимает меньше места и является первым при итерации, однако он может быть медленнее при поиске определенных краев. Матрица смежности - это полная противоположность, она занимает больше места и медленнее при итерации по краям, однако быстрее при поиске определенных краев.

Вот и все. Надеюсь, этот блог был вам полезен. Если у вас возникнут какие-либо трудности или вам нужно больше объяснений, я буду более чем счастлив помочь вам. Пожалуйста, свяжитесь со мной в LinkedIn или мой адрес электронной почты [email protected]. Также ознакомьтесь с моим последним блогом Развертывание приложения React на Heroku.

Удачного кодирования :)

Ресурсы:

Https://www.udemy.com/course/js-algorithms-and-data-structures-masterclass/learn/lecture/8344874#overview