Mind.js — это библиотека для построения и управления графовыми структурами, а также реализации алгоритмов обхода и поиска путей. Основная цель — облегчить работу с графами в JavaScript, предоставляя удобный интерфейс для создания узлов, рёбер и выполнения различных обходов.
Граф в Mind.js представляет собой совокупность узлов (nodes) и рёбер (edges). Узел хранит уникальный идентификатор и произвольные данные, ребро соединяет два узла и может иметь вес.
Пример создания графа:
import { Graph } from 'mindjs';
const graph = new Graph();
graph.addNode('A');
graph.addNode('B');
graph.addEdge('A', 'B', { weight: 5 });
Здесь создаются два узла A и B, а также
ребро с весом 5.
Mind.js реализует основные алгоритмы обхода: обход в глубину (DFS) и обход в ширину (BFS). Они применяются для поиска путей, проверки связности графа и поиска циклов.
DFS исследует граф, начиная с указанного узла, углубляясь по каждому пути до конца, прежде чем переходить к соседнему узлу.
Пример использования DFS:
const dfsResult = graph.depthFirstSearch('A', {
visit: (node) => console.log(`Посещён узел: ${node.id}`)
});
Особенности DFS в Mind.js:
visit для обработки
каждого узла при посещении.DFS эффективен для задач:
BFS исследует граф послойно, начиная с начального узла и проходя всех соседей перед переходом на следующий уровень.
Пример использования BFS:
const bfsResult = graph.breadthFirstSearch('A', {
visit: (node) => console.log(`Посещён узел: ${node.id}`)
});
Особенности BFS в Mind.js:
BFS предпочтителен, когда необходимо:
Mind.js поддерживает взвешенные рёбра, что позволяет использовать алгоритмы поиска кратчайшего пути.
Алгоритм Дейкстры вычисляет кратчайший путь от одного узла до всех остальных в графе с неотрицательными весами рёбер.
Пример:
const dijkstraResult = graph.dijkstra('A');
console.log(dijkstraResult.getPath('B')); // Возвращает кратчайший путь до узла B
Особенности:
A* применяется, если известна эвристическая функция, которая оценивает расстояние от узла до цели. Подходит для оптимизированного поиска пути.
const aStarResult = graph.aStar('A', 'B', {
heuristic: (node, target) => Math.abs(node.x - target.x) + Math.abs(node.y - target.y)
});
console.log(aStarResult.path);
Эвристическая функция позволяет направлять обход в сторону цели, сокращая количество посещённых узлов.
Mind.js предоставляет гибкие параметры обхода:
enter,
leave для DFS, visitLevel для BFS.Пример с фильтрацией:
graph.depthFirstSearch('A', {
visit: (node) => console.log(node.id),
filter: (node) => node.data.active === true
});
Это позволяет обходить только активные узлы.
Алгоритмы DFS и BFS в Mind.js широко используются для:
Каждый алгоритм имеет свои особенности, и выбор зависит от структуры графа и задачи: BFS лучше для кратчайших путей в невзвешенных графах, DFS — для глубокого анализа и поиска всех возможных путей.
Для больших графов рекомендуется:
Map вместо массива).Mind.js реализует все эти подходы под капотом, что позволяет писать эффективный и читаемый код обхода графов.