@raikuxq/alg-ds 1.1.2 → 1.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -2
- package/lib/algorithms/binary-search.d.ts +5 -0
- package/lib/algorithms/binary-search.js +27 -0
- package/lib/algorithms/factorial.d.ts +9 -0
- package/lib/algorithms/factorial.js +17 -0
- package/lib/algorithms/fibonacci.d.ts +9 -0
- package/lib/algorithms/fibonacci.js +17 -0
- package/lib/algorithms/memoize.d.ts +5 -0
- package/lib/algorithms/memoize.js +22 -0
- package/lib/algorithms/sorts/bubble-sort.d.ts +9 -0
- package/lib/algorithms/sorts/bubble-sort.js +23 -0
- package/lib/algorithms/sorts/insertion-sort.d.ts +9 -0
- package/lib/algorithms/sorts/insertion-sort.js +25 -0
- package/lib/algorithms/sorts/merge-sort.d.ts +9 -0
- package/lib/algorithms/sorts/merge-sort.js +61 -0
- package/lib/algorithms/sorts/quick-sort.d.ts +9 -0
- package/lib/algorithms/sorts/quick-sort.js +45 -0
- package/lib/algorithms/sorts/select-sort.d.ts +9 -0
- package/lib/algorithms/sorts/select-sort.js +20 -0
- package/lib/algorithms/transpose-matrix.d.ts +5 -0
- package/lib/algorithms/transpose-matrix.js +20 -0
- package/lib/constants.d.ts +2 -0
- package/lib/constants.js +6 -0
- package/lib/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.d.ts +15 -0
- package/lib/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.js +53 -0
- package/lib/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.d.ts +60 -0
- package/lib/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.js +36 -0
- package/lib/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.d.ts +13 -0
- package/lib/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.js +59 -0
- package/lib/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.d.ts +70 -0
- package/lib/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.js +268 -0
- package/lib/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.d.ts +16 -0
- package/lib/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.js +70 -0
- package/lib/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.d.ts +57 -0
- package/lib/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.js +234 -0
- package/lib/data-structures/Graph/AbstractGraph.d.ts +84 -0
- package/lib/data-structures/Graph/AbstractGraph.js +141 -0
- package/lib/data-structures/Graph/DirectedGraph.d.ts +24 -0
- package/lib/data-structures/Graph/DirectedGraph.js +85 -0
- package/lib/data-structures/Graph/GraphEdge.d.ts +16 -0
- package/lib/data-structures/Graph/GraphEdge.js +43 -0
- package/lib/data-structures/Graph/UndirectedGraph.d.ts +28 -0
- package/lib/data-structures/Graph/UndirectedGraph.js +102 -0
- package/lib/data-structures/Graph/demo/generateRandomGraph.d.ts +4 -0
- package/lib/data-structures/Graph/demo/generateRandomGraph.js +72 -0
- package/lib/data-structures/Graph/iterator/AbstractGraphIterator.d.ts +35 -0
- package/lib/data-structures/Graph/iterator/AbstractGraphIterator.js +90 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorBFS.d.ts +28 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorBFS.js +70 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorDFS.d.ts +28 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorDFS.js +70 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorDijkstra.d.ts +32 -0
- package/lib/data-structures/Graph/iterator/GraphIteratorDijkstra.js +99 -0
- package/lib/data-structures/Graph/presenter/presenterAdjacencyLists.d.ts +19 -0
- package/lib/data-structures/Graph/presenter/presenterAdjacencyLists.js +28 -0
- package/{src/data-structures/Graph/presenter/presenterAdjacencyMatrix.ts → lib/data-structures/Graph/presenter/presenterAdjacencyMatrix.d.ts} +32 -51
- package/lib/data-structures/Graph/presenter/presenterAdjacencyMatrix.js +48 -0
- package/lib/data-structures/Graph/searching/hasPath.d.ts +9 -0
- package/lib/data-structures/Graph/searching/hasPath.js +29 -0
- package/lib/data-structures/Graph/searching/shortestPath.d.ts +9 -0
- package/lib/data-structures/Graph/searching/shortestPath.js +29 -0
- package/lib/data-structures/Graph/strategy/BFSIterationStrategy.d.ts +6 -0
- package/lib/data-structures/Graph/strategy/BFSIterationStrategy.js +13 -0
- package/lib/data-structures/Graph/strategy/DFSIterationStrategy.d.ts +6 -0
- package/lib/data-structures/Graph/strategy/DFSIterationStrategy.js +13 -0
- package/lib/data-structures/Graph/strategy/DijkstraIterationStrategy.d.ts +6 -0
- package/lib/data-structures/Graph/strategy/DijkstraIterationStrategy.js +13 -0
- package/lib/data-structures/Graph/transposing/transposeDirectedGraph.d.ts +2 -0
- package/lib/data-structures/Graph/transposing/transposeDirectedGraph.js +14 -0
- package/lib/data-structures/HashTable/HashTable.d.ts +73 -0
- package/lib/data-structures/HashTable/HashTable.js +169 -0
- package/lib/data-structures/HashTable/HashTableNode.d.ts +11 -0
- package/lib/data-structures/HashTable/HashTableNode.js +39 -0
- package/lib/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.d.ts +125 -0
- package/lib/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.js +236 -0
- package/lib/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.d.ts +20 -0
- package/lib/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.js +41 -0
- package/lib/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.d.ts +48 -0
- package/lib/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.js +150 -0
- package/lib/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.d.ts +25 -0
- package/lib/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.js +65 -0
- package/lib/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.d.ts +52 -0
- package/lib/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.js +137 -0
- package/{src/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.ts → lib/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.d.ts} +7 -10
- package/lib/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.js +29 -0
- package/lib/data-structures/LoopedArray/LoopedArray.d.ts +86 -0
- package/lib/data-structures/LoopedArray/LoopedArray.js +161 -0
- package/lib/data-structures/Queue/Queue.d.ts +50 -0
- package/lib/data-structures/Queue/Queue.js +83 -0
- package/lib/data-structures/Stack/Stack.d.ts +50 -0
- package/lib/data-structures/Stack/Stack.js +83 -0
- package/lib/exports/algorithms.d.ts +16 -0
- package/lib/exports/algorithms.js +36 -0
- package/lib/exports/constants.d.ts +2 -0
- package/lib/exports/constants.js +7 -0
- package/lib/exports/data-structures.d.ts +11 -0
- package/lib/exports/data-structures.js +24 -0
- package/lib/exports/helpers.d.ts +6 -0
- package/lib/exports/helpers.js +14 -0
- package/lib/exports/sorts.d.ts +6 -0
- package/lib/exports/sorts.js +14 -0
- package/lib/exports/utils.d.ts +3 -0
- package/lib/exports/utils.js +14 -0
- package/lib/exports.d.ts +44 -0
- package/lib/exports.js +89 -0
- package/lib/helpers/createBinaryTree.d.ts +6 -0
- package/lib/helpers/createBinaryTree.js +22 -0
- package/lib/helpers/createGraph.d.ts +6 -0
- package/lib/helpers/createGraph.js +24 -0
- package/lib/helpers/createGraphFromMatrix.d.ts +7 -0
- package/lib/helpers/createGraphFromMatrix.js +37 -0
- package/lib/helpers/createLinkedList.d.ts +3 -0
- package/lib/helpers/createLinkedList.js +21 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +6 -0
- package/lib/types/ArrayMatrix.d.ts +1 -0
- package/lib/types/ArrayMatrix.js +3 -0
- package/lib/types/EnumBinarySearchTreeType.d.ts +4 -0
- package/lib/types/EnumBinarySearchTreeType.js +9 -0
- package/lib/types/EnumGraphType.d.ts +4 -0
- package/lib/types/EnumGraphType.js +9 -0
- package/lib/types/EnumLinkedListType.d.ts +4 -0
- package/lib/types/EnumLinkedListType.js +9 -0
- package/lib/types/EnumRandomGenerationFormat.d.ts +4 -0
- package/lib/types/EnumRandomGenerationFormat.js +9 -0
- package/lib/types/EnumTreeTraversalType.d.ts +5 -0
- package/lib/types/EnumTreeTraversalType.js +10 -0
- package/lib/types/FnCompareTwo.d.ts +1 -0
- package/lib/types/FnCompareTwo.js +3 -0
- package/lib/types/FnToMemoize.d.ts +1 -0
- package/lib/types/FnToMemoize.js +3 -0
- package/{src/types/ILinkedList.ts → lib/types/IArrayFacade.d.ts} +4 -6
- package/lib/types/IArrayFacade.js +3 -0
- package/{src/types/IBiDirectIterable.ts → lib/types/IBiDirectIterable.d.ts} +5 -6
- package/lib/types/IBiDirectIterable.js +3 -0
- package/lib/types/IBiDirectIterator.d.ts +11 -0
- package/lib/types/IBiDirectIterator.js +3 -0
- package/lib/types/IBinaryTree.d.ts +12 -0
- package/lib/types/IBinaryTree.js +3 -0
- package/lib/types/IConvertableToArray.d.ts +4 -0
- package/lib/types/IConvertableToArray.js +3 -0
- package/lib/types/IGraph.d.ts +14 -0
- package/lib/types/IGraph.js +3 -0
- package/{src/types/IGraphIterationStrategy.ts → lib/types/IGraphIterationStrategy.d.ts} +5 -6
- package/lib/types/IGraphIterationStrategy.js +3 -0
- package/lib/types/IGraphIterator.d.ts +11 -0
- package/lib/types/IGraphIterator.js +3 -0
- package/{src/types/IIterable.ts → lib/types/IIterable.d.ts} +4 -5
- package/lib/types/IIterable.js +3 -0
- package/lib/types/IIterator.d.ts +14 -0
- package/lib/types/IIterator.js +3 -0
- package/lib/types/IKeyValueStorage.d.ts +8 -0
- package/lib/types/IKeyValueStorage.js +3 -0
- package/lib/types/ILinearStorage.d.ts +11 -0
- package/lib/types/ILinearStorage.js +3 -0
- package/{src/types/ILinearStorageRA.ts → lib/types/ILinearStorageRA.d.ts} +13 -14
- package/lib/types/ILinearStorageRA.js +3 -0
- package/{src/types/IArrayFacade.ts → lib/types/ILinkedList.d.ts} +4 -6
- package/lib/types/ILinkedList.js +3 -0
- package/lib/utils.d.ts +29 -0
- package/lib/utils.js +95 -0
- package/package.json +9 -3
- package/.idea/algorythmes.iml +0 -15
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/deployment.xml +0 -14
- package/.idea/inspectionProfiles/Project_Default.xml +0 -7
- package/.idea/jsLinters/eslint.xml +0 -6
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/lib/algotirhms.ts +0 -35
- package/lib/constants.ts +0 -3
- package/lib/data-structures.ts +0 -23
- package/lib/helpers.ts +0 -13
- package/lib/sorts.ts +0 -7
- package/lib/types.ts +0 -53
- package/lib/utils.ts +0 -21
- package/src/algorithms/binary-search.ts +0 -28
- package/src/algorithms/factorial.ts +0 -18
- package/src/algorithms/fibonacci.ts +0 -18
- package/src/algorithms/memoize.ts +0 -21
- package/src/algorithms/sorts/bubble-sort.ts +0 -21
- package/src/algorithms/sorts/insertion-sort.ts +0 -25
- package/src/algorithms/sorts/merge-sort.ts +0 -74
- package/src/algorithms/sorts/quick-sort.ts +0 -54
- package/src/algorithms/sorts/select-sort.ts +0 -19
- package/src/algorithms/transpose-matrix.ts +0 -19
- package/src/constants.ts +0 -2
- package/src/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.ts +0 -45
- package/src/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.ts +0 -80
- package/src/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.ts +0 -38
- package/src/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.ts +0 -286
- package/src/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.ts +0 -48
- package/src/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.ts +0 -228
- package/src/data-structures/Graph/AbstractGraph.ts +0 -189
- package/src/data-structures/Graph/DirectedGraph.ts +0 -84
- package/src/data-structures/Graph/GraphEdge.ts +0 -33
- package/src/data-structures/Graph/UndirectedGraph.ts +0 -108
- package/src/data-structures/Graph/demo/generateRandomGraph.ts +0 -93
- package/src/data-structures/Graph/iterator/AbstractGraphIterator.ts +0 -99
- package/src/data-structures/Graph/iterator/GraphIteratorBFS.ts +0 -60
- package/src/data-structures/Graph/iterator/GraphIteratorDFS.ts +0 -60
- package/src/data-structures/Graph/iterator/GraphIteratorDijkstra.ts +0 -94
- package/src/data-structures/Graph/presenter/presenterAdjacencyLists.ts +0 -29
- package/src/data-structures/Graph/searching/hasPath.ts +0 -38
- package/src/data-structures/Graph/searching/shortestPath.ts +0 -38
- package/src/data-structures/Graph/strategy/BFSIterationStrategy.ts +0 -11
- package/src/data-structures/Graph/strategy/DFSIterationStrategy.ts +0 -11
- package/src/data-structures/Graph/strategy/DijkstraIterationStrategy.ts +0 -11
- package/src/data-structures/Graph/transposing/transposeDirectedGraph.ts +0 -19
- package/src/data-structures/HashTable/HashTable.ts +0 -202
- package/src/data-structures/HashTable/HashTableNode.ts +0 -31
- package/src/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.ts +0 -310
- package/src/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.ts +0 -33
- package/src/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.ts +0 -156
- package/src/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.ts +0 -47
- package/src/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.ts +0 -147
- package/src/data-structures/LoopedArray/LoopedArray.ts +0 -182
- package/src/data-structures/Queue/Queue.ts +0 -92
- package/src/data-structures/Stack/Stack.ts +0 -92
- package/src/demo/demo.bst.ts +0 -67
- package/src/demo/demo.graph.ts +0 -246
- package/src/demo/demo.hashtable.ts +0 -28
- package/src/demo/demo.linked-list.ts +0 -78
- package/src/demo/demo.looped-array.ts +0 -104
- package/src/demo/demo.queue.ts +0 -40
- package/src/demo/demo.stack.ts +0 -40
- package/src/demo/performance/bst-compare.ts +0 -35
- package/src/demo/performance/ds-compare.ts +0 -58
- package/src/demo/performance/hash-table.compare.ts +0 -40
- package/src/demo/performance/sort-compare.ts +0 -60
- package/src/helpers/createBinaryTree.ts +0 -24
- package/src/helpers/createGraph.ts +0 -24
- package/src/helpers/createGraphFromMatrix.ts +0 -47
- package/src/helpers/createLinkedList.ts +0 -24
- package/src/index.ts +0 -44
- package/src/types/ArrayMatrix.ts +0 -1
- package/src/types/EnumBinarySearchTreeType.ts +0 -4
- package/src/types/EnumGraphTraversalType.ts +0 -5
- package/src/types/EnumGraphType.ts +0 -4
- package/src/types/EnumLinkedListType.ts +0 -4
- package/src/types/EnumRandomGenerationFormat.ts +0 -4
- package/src/types/EnumSortType.ts +0 -7
- package/src/types/EnumTreeTraversalType.ts +0 -5
- package/src/types/FnCompareTwo.ts +0 -1
- package/src/types/FnSort.ts +0 -1
- package/src/types/FnToMemoize.ts +0 -1
- package/src/types/IBiDirectIterator.ts +0 -12
- package/src/types/IBinaryTree.ts +0 -13
- package/src/types/IConvertableToArray.ts +0 -4
- package/src/types/IGraph.ts +0 -16
- package/src/types/IGraphCreator.ts +0 -5
- package/src/types/IGraphIterator.ts +0 -13
- package/src/types/IIterator.ts +0 -14
- package/src/types/IKeyValueStorage.ts +0 -8
- package/src/types/ILinearStorage.ts +0 -11
- package/src/utils.ts +0 -65
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
extendStatics(d, b);
|
|
11
|
+
function __() { this.constructor = d; }
|
|
12
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
var AbstractGraph_1 = require("./AbstractGraph");
|
|
17
|
+
var GraphEdge_1 = require("./GraphEdge");
|
|
18
|
+
/**
|
|
19
|
+
* Undirected graph - data structure where edges with same pair of vertices are equal
|
|
20
|
+
* @example A-B is same as B-A
|
|
21
|
+
*/
|
|
22
|
+
var UndirectedGraph = /** @class */ (function (_super) {
|
|
23
|
+
__extends(UndirectedGraph, _super);
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
function UndirectedGraph() {
|
|
28
|
+
return _super.call(this) || this;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @inheritDoc
|
|
32
|
+
*/
|
|
33
|
+
UndirectedGraph.prototype.getEdgeByValue = function (from, to) {
|
|
34
|
+
var edge = this._edges.find(function (edge) {
|
|
35
|
+
return (edge.fromVertex === from && edge.toVertex === to) ||
|
|
36
|
+
(edge.fromVertex === to && edge.toVertex === from);
|
|
37
|
+
});
|
|
38
|
+
if (!edge) {
|
|
39
|
+
throw new Error("Edge not found");
|
|
40
|
+
}
|
|
41
|
+
return edge;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* @inheritDoc
|
|
45
|
+
*/
|
|
46
|
+
UndirectedGraph.prototype.hasEdge = function (from, to) {
|
|
47
|
+
return Boolean(this._edges.find(function (edge) {
|
|
48
|
+
return ((edge.fromVertex === from && edge.toVertex === to) ||
|
|
49
|
+
(edge.fromVertex === to && edge.toVertex === from));
|
|
50
|
+
}));
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* @inheritDoc
|
|
54
|
+
*/
|
|
55
|
+
UndirectedGraph.prototype.addEdge = function (from, to, weight) {
|
|
56
|
+
var _a, _b;
|
|
57
|
+
try {
|
|
58
|
+
var fromVertex = this.tryFindVertex(from);
|
|
59
|
+
var toVertex = this.tryFindVertex(to);
|
|
60
|
+
/** When edge is already exist, we should only update its weight */
|
|
61
|
+
if (this.hasEdge(fromVertex, toVertex)) {
|
|
62
|
+
if (typeof weight === "number") {
|
|
63
|
+
this.updateEdgeWeight(fromVertex, toVertex, weight);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
var edge = new GraphEdge_1.default(fromVertex, toVertex, weight);
|
|
68
|
+
this._edges.push(edge);
|
|
69
|
+
(_a = this._vertices.get(fromVertex)) === null || _a === void 0 ? void 0 : _a.push(toVertex);
|
|
70
|
+
(_b = this._vertices.get(toVertex)) === null || _b === void 0 ? void 0 : _b.push(fromVertex);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (_c) {
|
|
74
|
+
throw new Error("Edge cannot be added because one of vertices was not found");
|
|
75
|
+
}
|
|
76
|
+
return this;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* @inheritDoc
|
|
80
|
+
*/
|
|
81
|
+
UndirectedGraph.prototype.removeEdge = function (from, to) {
|
|
82
|
+
try {
|
|
83
|
+
var fromVertex_1 = this.tryFindVertex(from);
|
|
84
|
+
var toVertex_1 = this.tryFindVertex(to);
|
|
85
|
+
var edgeToRemove_1 = this.getEdgeByValue(fromVertex_1, toVertex_1);
|
|
86
|
+
var fromVertexNeighbors = this._vertices.get(fromVertex_1) || [];
|
|
87
|
+
var toVertexNeighbors = this._vertices.get(toVertex_1) || [];
|
|
88
|
+
var fromNewNeighbors = fromVertexNeighbors.filter(function (vertex) { return toVertex_1 !== vertex; });
|
|
89
|
+
var toNewNeighbors = toVertexNeighbors.filter(function (vertex) { return fromVertex_1 !== vertex; });
|
|
90
|
+
this._vertices.set(fromVertex_1, fromNewNeighbors);
|
|
91
|
+
this._vertices.set(toVertex_1, toNewNeighbors);
|
|
92
|
+
this._edges = this._edges.filter(function (edge) { return edge !== edgeToRemove_1; });
|
|
93
|
+
}
|
|
94
|
+
catch (_a) {
|
|
95
|
+
throw new Error("Edge cannot be removed because one of vertices was not found");
|
|
96
|
+
}
|
|
97
|
+
return this;
|
|
98
|
+
};
|
|
99
|
+
return UndirectedGraph;
|
|
100
|
+
}(AbstractGraph_1.default));
|
|
101
|
+
exports.default = UndirectedGraph;
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5kaXJlY3RlZEdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGEtc3RydWN0dXJlcy9HcmFwaC9VbmRpcmVjdGVkR3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQTRDO0FBQzVDLHlDQUFvQztBQUVwQzs7O0dBR0c7QUFDSDtJQUFnRCxtQ0FBZ0I7SUFDOUQ7O09BRUc7SUFDSDtlQUNFLGlCQUFPO0lBQ1QsQ0FBQztJQUVEOztPQUVHO0lBQ08sd0NBQWMsR0FBeEIsVUFBeUIsSUFBTyxFQUFFLEVBQUs7UUFDckMsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzNCLFVBQUMsSUFBa0I7WUFDakIsT0FBQSxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO2dCQUNsRCxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDO1FBRGxELENBQ2tELENBQ3JELENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpQ0FBTyxHQUFkLFVBQWUsSUFBTyxFQUFFLEVBQUs7UUFDM0IsT0FBTyxPQUFPLENBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBQyxJQUFJO1lBQ3BCLE9BQU8sQ0FDTCxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO2dCQUNsRCxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxD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
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import IGraph from "../../../types/IGraph";
|
|
2
|
+
import { EnumGraphType } from "../../../types/EnumGraphType";
|
|
3
|
+
import { EnumRandomGenerationFormat } from "../../../types/EnumRandomGenerationFormat";
|
|
4
|
+
export declare const generateRandomGraph: (verticesCount: number, edgesCount: number, type?: EnumGraphType, format?: EnumRandomGenerationFormat) => IGraph<string>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.generateRandomGraph = void 0;
|
|
4
|
+
var EnumGraphType_1 = require("../../../types/EnumGraphType");
|
|
5
|
+
var createGraph_1 = require("../../../helpers/createGraph");
|
|
6
|
+
var utils_1 = require("../../../utils");
|
|
7
|
+
var EnumRandomGenerationFormat_1 = require("../../../types/EnumRandomGenerationFormat");
|
|
8
|
+
var getRandomVertex = function () {
|
|
9
|
+
return "_" + Math.random().toString(36).substr(2, 9);
|
|
10
|
+
};
|
|
11
|
+
var getPossibleEdgesCount = function (type, verticesCount) {
|
|
12
|
+
var possibleEdgesCount = verticesCount * (verticesCount - 1);
|
|
13
|
+
switch (type) {
|
|
14
|
+
case EnumGraphType_1.EnumGraphType.Directed: {
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
case EnumGraphType_1.EnumGraphType.Undirected: {
|
|
18
|
+
possibleEdgesCount = Math.floor(possibleEdgesCount / 2);
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
default: {
|
|
22
|
+
throw new Error("Wrong random generation format");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return possibleEdgesCount;
|
|
26
|
+
};
|
|
27
|
+
var fillGraphRandomly = function (graph, format, verticesCount) {
|
|
28
|
+
switch (format) {
|
|
29
|
+
case EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Hash: {
|
|
30
|
+
for (var i = 0; i < verticesCount; i++) {
|
|
31
|
+
graph.addVertex(getRandomVertex());
|
|
32
|
+
}
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Numbers: {
|
|
36
|
+
for (var i = 0; i < verticesCount; i++) {
|
|
37
|
+
graph.addVertex((i + 1).toString());
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
default: {
|
|
42
|
+
throw new Error("Wrong random generation format");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
exports.generateRandomGraph = function (verticesCount, edgesCount, type, format) {
|
|
47
|
+
if (type === void 0) { type = EnumGraphType_1.EnumGraphType.Undirected; }
|
|
48
|
+
if (format === void 0) { format = EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Numbers; }
|
|
49
|
+
var graph = createGraph_1.createGraph(type);
|
|
50
|
+
var possibleEdgesCount = getPossibleEdgesCount(type, verticesCount);
|
|
51
|
+
if (edgesCount <= 0 || edgesCount > possibleEdgesCount) {
|
|
52
|
+
throw new Error("Edges count must be in range between 0 and " + possibleEdgesCount);
|
|
53
|
+
}
|
|
54
|
+
fillGraphRandomly(graph, format, verticesCount);
|
|
55
|
+
var addedVertices = graph.vertices();
|
|
56
|
+
var addedEdgesCount = 0;
|
|
57
|
+
while (addedEdgesCount < edgesCount) {
|
|
58
|
+
var randomizeIndex = function () {
|
|
59
|
+
return utils_1.randomizeNumberInRange(0, addedVertices.length);
|
|
60
|
+
};
|
|
61
|
+
var randomVertexFrom = addedVertices[randomizeIndex()];
|
|
62
|
+
var randomVertexTo = addedVertices[randomizeIndex()];
|
|
63
|
+
var isEdgeAlreadyExists = graph.hasEdge(randomVertexFrom, randomVertexTo);
|
|
64
|
+
var isTheSameVertex = randomVertexFrom === randomVertexTo;
|
|
65
|
+
if (!isTheSameVertex && !isEdgeAlreadyExists) {
|
|
66
|
+
graph.addEdge(randomVertexFrom, randomVertexTo);
|
|
67
|
+
addedEdgesCount++;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return graph;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVSYW5kb21HcmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0cnVjdHVyZXMvR3JhcGgvZGVtby9nZW5lcmF0ZVJhbmRvbUdyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDhEQUE2RDtBQUM3RCw0REFBMkQ7QUFDM0Qsd0NBQXdEO0FBQ3hELHdGQUF1RjtBQUV2RixJQUFNLGVBQWUsR0FBRztJQUN0QixPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsSUFBTSxxQkFBcUIsR0FBRyxVQUM1QixJQUFtQixFQUNuQixhQUFxQjtJQUVyQixJQUFJLGtCQUFrQixHQUFHLGFBQWEsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU3RCxRQUFRLElBQUksRUFBRTtRQUNaLEtBQUssNkJBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixNQUFNO1NBQ1A7UUFDRCxLQUFLLDZCQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0Isa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNO1NBQ1A7UUFDRCxPQUFPLENBQUMsQ0FBQztZQUNQLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRDtLQUNGO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDLENBQUM7QUFFRixJQUFNLGlCQUFpQixHQUFHLFVBQ3hCLEtBQXFCLEVBQ3JCLE1BQWtDLEVBQ2xDLGFBQXFCO0lBRXJCLFFBQVEsTUFBTSxFQUFFO1FBQ2QsS0FBSyx1REFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7YUFDcEM7WUFDRCxNQUFNO1NBQ1A7UUFDRCxLQUFLLHVEQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3RDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNyQztZQUNELE1BQU07U0FDUDtRQUNELE9BQU8sQ0FBQyxDQUFDO1lBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ25EO0tBQ0Y7QUFDSCxDQUFDLENBQUM7QUFFVyxRQUFBLG1CQUFtQixHQUFHLFVBQ2pDLGFBQXFCLEVBQ3JCLFVBQWtCLEVBQ2xCLElBQThDLEVBQzlDLE1BQXVFO0lBRHZFLHFCQUFBLEVBQUEsT0FBc0IsNkJBQWEsQ0FBQyxVQUFVO0lBQzlDLHVCQUFBLEVBQUEsU0FBcUMsdURBQTBCLENBQUMsT0FBTztJQUV2RSxJQUFNLEtBQUssR0FBRyx5QkFBVyxDQUFTLElBQUksQ0FBQyxDQUFDO0lBQ3hDLElBQU0sa0JBQWtCLEdBQUcscUJBQXFCLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXRFLElBQUksVUFBVSxJQUFJLENBQUMsSUFBSSxVQUFVLEdBQUcsa0JBQWtCLEVBQUU7UUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FDYixnREFBOEMsa0JBQW9CLENBQ25FLENBQUM7S0FDSDtJQUVELGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDaEQsSUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZDLElBQUksZUFBZSxHQUFHLENBQUMsQ0FBQztJQUV4QixPQUFPLGVBQWUsR0FBRyxVQUFVLEVBQUU7UUFDbkMsSUFBTSxjQUFjLEdBQUc7WUFDckIsT0FBTyw4QkFBc0IsQ0FBQyxDQUFDLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQztRQUNGLElBQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFdkQsSUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzVFLElBQU0sZUFBZSxHQUFHLGdCQUFnQixLQUFLLGNBQWMsQ0FBQztRQUU1RCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNoRCxlQUFlLEVBQUUsQ0FBQztTQUNuQjtLQUNGO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUMifQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import IGraphIterator from "../../../types/IGraphIterator";
|
|
2
|
+
import IGraph from "../../../types/IGraph";
|
|
3
|
+
export default abstract class AbstractGraphIterator<T> implements IGraphIterator<T> {
|
|
4
|
+
protected readonly graph: IGraph<T>;
|
|
5
|
+
protected readonly visited: Map<T, boolean>;
|
|
6
|
+
protected readonly parents: Map<T, T>;
|
|
7
|
+
/**
|
|
8
|
+
* Creates empty instance
|
|
9
|
+
*/
|
|
10
|
+
protected constructor(graph: IGraph<T>);
|
|
11
|
+
protected abstract currentImpl(): T;
|
|
12
|
+
protected abstract nextImpl(): T;
|
|
13
|
+
protected abstract initIteratorImpl(from: T): void;
|
|
14
|
+
protected abstract hasNextImpl(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* @inheritDoc
|
|
17
|
+
*/
|
|
18
|
+
initIterator(from: T): void;
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
hasNext(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
next(): T;
|
|
27
|
+
/**
|
|
28
|
+
* @inheritDoc
|
|
29
|
+
*/
|
|
30
|
+
current(): T;
|
|
31
|
+
/**
|
|
32
|
+
* @inheritDoc
|
|
33
|
+
*/
|
|
34
|
+
getPath(from: T, to: T): Array<T>;
|
|
35
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __spreadArrays = (this && this.__spreadArrays) || function () {
|
|
3
|
+
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
|
|
4
|
+
for (var r = Array(s), k = 0, i = 0; i < il; i++)
|
|
5
|
+
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
|
|
6
|
+
r[k] = a[j];
|
|
7
|
+
return r;
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
var AbstractGraphIterator = /** @class */ (function () {
|
|
11
|
+
/**
|
|
12
|
+
* Creates empty instance
|
|
13
|
+
*/
|
|
14
|
+
function AbstractGraphIterator(graph) {
|
|
15
|
+
this.graph = graph;
|
|
16
|
+
this.visited = new Map();
|
|
17
|
+
this.parents = new Map();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* @inheritDoc
|
|
21
|
+
*/
|
|
22
|
+
AbstractGraphIterator.prototype.initIterator = function (from) {
|
|
23
|
+
if (!this.graph.hasVertex(from)) {
|
|
24
|
+
throw new Error("Start vertex does not exist");
|
|
25
|
+
}
|
|
26
|
+
this.initIteratorImpl(from);
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* @inheritDoc
|
|
30
|
+
*/
|
|
31
|
+
AbstractGraphIterator.prototype.hasNext = function () {
|
|
32
|
+
return this.hasNextImpl();
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* @inheritDoc
|
|
36
|
+
*/
|
|
37
|
+
AbstractGraphIterator.prototype.next = function () {
|
|
38
|
+
try {
|
|
39
|
+
if (!this.hasNext()) {
|
|
40
|
+
throw new Error();
|
|
41
|
+
}
|
|
42
|
+
return this.nextImpl();
|
|
43
|
+
}
|
|
44
|
+
catch (e) {
|
|
45
|
+
throw new Error("Next element does not exist");
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* @inheritDoc
|
|
50
|
+
*/
|
|
51
|
+
AbstractGraphIterator.prototype.current = function () {
|
|
52
|
+
try {
|
|
53
|
+
var current = this.currentImpl();
|
|
54
|
+
if (current === null) {
|
|
55
|
+
throw new Error();
|
|
56
|
+
}
|
|
57
|
+
return current;
|
|
58
|
+
}
|
|
59
|
+
catch (e) {
|
|
60
|
+
throw new Error("Current element does not exist");
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* @inheritDoc
|
|
65
|
+
*/
|
|
66
|
+
AbstractGraphIterator.prototype.getPath = function (from, to) {
|
|
67
|
+
var path = new Array();
|
|
68
|
+
var isLinkedDirectly = this.graph.hasEdge(from, to);
|
|
69
|
+
var currentVertex = this.parents.get(to);
|
|
70
|
+
if (isLinkedDirectly) {
|
|
71
|
+
return [from, to];
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
while (currentVertex) {
|
|
75
|
+
if (currentVertex === from) {
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
path.push(currentVertex);
|
|
79
|
+
currentVertex = this.parents.get(currentVertex);
|
|
80
|
+
}
|
|
81
|
+
if (path.length === 0) {
|
|
82
|
+
throw new Error("There is no path found");
|
|
83
|
+
}
|
|
84
|
+
return __spreadArrays([from], path.reverse(), [to]);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
return AbstractGraphIterator;
|
|
88
|
+
}());
|
|
89
|
+
exports.default = AbstractGraphIterator;
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RHcmFwaEl0ZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RydWN0dXJlcy9HcmFwaC9pdGVyYXRvci9BYnN0cmFjdEdyYXBoSXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0E7SUFNRTs7T0FFRztJQUNILCtCQUFzQixLQUFnQjtRQUNwQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFPRDs7T0FFRztJQUNJLDRDQUFZLEdBQW5CLFVBQW9CLElBQU87UUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNoRDtRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSx1Q0FBTyxHQUFkO1FBQ0UsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksb0NBQUksR0FBWDtRQUNFLElBQUk7WUFDRixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7YUFDbkI7WUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4QjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksdUNBQU8sR0FBZDtRQUNFLElBQUk7WUFDRixJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFbkMsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFO2dCQUNwQixNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7YUFDbkI7WUFDRCxPQUFPLE9BQU8sQ0FBQztTQUNoQjtRQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksdUNBQU8sR0FBZCxVQUFlLElBQU8sRUFBRSxFQUFLO1FBQzNCLElBQU0sSUFBSSxHQUFhLElBQUksS0FBSyxFQUFLLENBQUM7UUFDdEMsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekMsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO2FBQU07WUFDTCxPQUFPLGFBQWEsRUFBRTtnQkFDcEIsSUFBSSxhQUFhLEtBQUssSUFBSSxFQUFFO29CQUMxQixNQUFNO2lCQUNQO2dCQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3pCLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNqRDtZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQzthQUMzQztZQUVELHVCQUFRLElBQUksR0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUUsRUFBRSxHQUFFO1NBQ3RDO0lBQ0gsQ0FBQztJQUNILDRCQUFDO0FBQUQsQ0FBQyxBQS9GRCxJQStGQyJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import IGraph from "../../../types/IGraph";
|
|
2
|
+
import AbstractGraphIterator from "./AbstractGraphIterator";
|
|
3
|
+
/**
|
|
4
|
+
* Breadth first graph traversal
|
|
5
|
+
*/
|
|
6
|
+
export default class GraphIteratorBFS<T> extends AbstractGraphIterator<T> {
|
|
7
|
+
private readonly queue;
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
constructor(graph: IGraph<T>);
|
|
12
|
+
/**
|
|
13
|
+
* @inheritDoc
|
|
14
|
+
*/
|
|
15
|
+
protected currentImpl(): T;
|
|
16
|
+
/**
|
|
17
|
+
@inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
initIteratorImpl(startVertex: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
hasNextImpl(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
protected nextImpl(): T;
|
|
28
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
extendStatics(d, b);
|
|
11
|
+
function __() { this.constructor = d; }
|
|
12
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
var Queue_1 = require("../../Queue/Queue");
|
|
17
|
+
var AbstractGraphIterator_1 = require("./AbstractGraphIterator");
|
|
18
|
+
/**
|
|
19
|
+
* Breadth first graph traversal
|
|
20
|
+
*/
|
|
21
|
+
var GraphIteratorBFS = /** @class */ (function (_super) {
|
|
22
|
+
__extends(GraphIteratorBFS, _super);
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
function GraphIteratorBFS(graph) {
|
|
27
|
+
var _this = _super.call(this, graph) || this;
|
|
28
|
+
_this.queue = new Queue_1.default();
|
|
29
|
+
return _this;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @inheritDoc
|
|
33
|
+
*/
|
|
34
|
+
GraphIteratorBFS.prototype.currentImpl = function () {
|
|
35
|
+
return this.queue.peek();
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
@inheritDoc
|
|
39
|
+
*/
|
|
40
|
+
GraphIteratorBFS.prototype.initIteratorImpl = function (startVertex) {
|
|
41
|
+
this.queue.push(startVertex);
|
|
42
|
+
this.visited.set(startVertex, true);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @inheritDoc
|
|
46
|
+
*/
|
|
47
|
+
GraphIteratorBFS.prototype.hasNextImpl = function () {
|
|
48
|
+
return !this.queue.isEmpty();
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* @inheritDoc
|
|
52
|
+
*/
|
|
53
|
+
GraphIteratorBFS.prototype.nextImpl = function () {
|
|
54
|
+
var _this = this;
|
|
55
|
+
var next = this.queue.pop();
|
|
56
|
+
var nextNeighbors = this.graph.getVertexNeighbors(next);
|
|
57
|
+
nextNeighbors.forEach(function (neighbor) {
|
|
58
|
+
var isNotVisited = !_this.visited.get(neighbor);
|
|
59
|
+
if (isNotVisited) {
|
|
60
|
+
_this.queue.push(neighbor);
|
|
61
|
+
_this.visited.set(neighbor, true);
|
|
62
|
+
_this.parents.set(neighbor, next);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return next;
|
|
66
|
+
};
|
|
67
|
+
return GraphIteratorBFS;
|
|
68
|
+
}(AbstractGraphIterator_1.default));
|
|
69
|
+
exports.default = GraphIteratorBFS;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhJdGVyYXRvckJGUy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0cnVjdHVyZXMvR3JhcGgvaXRlcmF0b3IvR3JhcGhJdGVyYXRvckJGUy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBc0M7QUFFdEMsaUVBQTREO0FBRTVEOztHQUVHO0FBQ0g7SUFBaUQsb0NBQXdCO0lBR3ZFOztPQUVHO0lBQ0gsMEJBQW1CLEtBQWdCO1FBQW5DLFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBRWI7UUFEQyxLQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBSyxFQUFFLENBQUM7O0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNPLHNDQUFXLEdBQXJCO1FBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLDJDQUFnQixHQUF2QixVQUF3QixXQUFjO1FBQ3BDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxzQ0FBVyxHQUFsQjtRQUNFLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNPLG1DQUFRLEdBQWxCO1FBQUEsaUJBZUM7UUFkQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzlCLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxVQUFDLFFBQVE7WUFDN0IsSUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVqRCxJQUFJLFlBQVksRUFBRTtnQkFDaEIsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDakMsS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCx1QkFBQztBQUFELENBQUMsQUFwREQsQ0FBaUQsK0JBQXFCLEdBb0RyRSJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import IGraph from "../../../types/IGraph";
|
|
2
|
+
import AbstractGraphIterator from "./AbstractGraphIterator";
|
|
3
|
+
/**
|
|
4
|
+
* Deep first graph traversal
|
|
5
|
+
*/
|
|
6
|
+
export default class GraphIteratorDFS<T> extends AbstractGraphIterator<T> {
|
|
7
|
+
private readonly stack;
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
constructor(graph: IGraph<T>);
|
|
12
|
+
/**
|
|
13
|
+
* @inheritDoc
|
|
14
|
+
*/
|
|
15
|
+
hasNextImpl(): boolean;
|
|
16
|
+
/**
|
|
17
|
+
@inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
initIteratorImpl(startVertex: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
currentImpl(): T;
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
nextImpl(): T;
|
|
28
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
extendStatics(d, b);
|
|
11
|
+
function __() { this.constructor = d; }
|
|
12
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
var Stack_1 = require("../../Stack/Stack");
|
|
17
|
+
var AbstractGraphIterator_1 = require("./AbstractGraphIterator");
|
|
18
|
+
/**
|
|
19
|
+
* Deep first graph traversal
|
|
20
|
+
*/
|
|
21
|
+
var GraphIteratorDFS = /** @class */ (function (_super) {
|
|
22
|
+
__extends(GraphIteratorDFS, _super);
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
function GraphIteratorDFS(graph) {
|
|
27
|
+
var _this = _super.call(this, graph) || this;
|
|
28
|
+
_this.stack = new Stack_1.default();
|
|
29
|
+
return _this;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* @inheritDoc
|
|
33
|
+
*/
|
|
34
|
+
GraphIteratorDFS.prototype.hasNextImpl = function () {
|
|
35
|
+
return !this.stack.isEmpty();
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
@inheritDoc
|
|
39
|
+
*/
|
|
40
|
+
GraphIteratorDFS.prototype.initIteratorImpl = function (startVertex) {
|
|
41
|
+
this.stack.push(startVertex);
|
|
42
|
+
this.visited.set(startVertex, true);
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @inheritDoc
|
|
46
|
+
*/
|
|
47
|
+
GraphIteratorDFS.prototype.currentImpl = function () {
|
|
48
|
+
return this.stack.peek();
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* @inheritDoc
|
|
52
|
+
*/
|
|
53
|
+
GraphIteratorDFS.prototype.nextImpl = function () {
|
|
54
|
+
var _this = this;
|
|
55
|
+
var next = this.stack.pop();
|
|
56
|
+
var nextNeighbors = this.graph.getVertexNeighbors(next);
|
|
57
|
+
nextNeighbors.forEach(function (neighbor) {
|
|
58
|
+
var isNotVisited = !_this.visited.get(neighbor);
|
|
59
|
+
if (isNotVisited) {
|
|
60
|
+
_this.stack.push(neighbor);
|
|
61
|
+
_this.visited.set(neighbor, true);
|
|
62
|
+
_this.parents.set(neighbor, next);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return next;
|
|
66
|
+
};
|
|
67
|
+
return GraphIteratorDFS;
|
|
68
|
+
}(AbstractGraphIterator_1.default));
|
|
69
|
+
exports.default = GraphIteratorDFS;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhJdGVyYXRvckRGUy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kYXRhLXN0cnVjdHVyZXMvR3JhcGgvaXRlcmF0b3IvR3JhcGhJdGVyYXRvckRGUy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBc0M7QUFFdEMsaUVBQTREO0FBRTVEOztHQUVHO0FBQ0g7SUFBaUQsb0NBQXdCO0lBR3ZFOztPQUVHO0lBQ0gsMEJBQW1CLEtBQWdCO1FBQW5DLFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBRWI7UUFEQyxLQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBSyxFQUFFLENBQUM7O0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLHNDQUFXLEdBQWxCO1FBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksMkNBQWdCLEdBQXZCLFVBQXdCLFdBQWM7UUFDcEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLHNDQUFXLEdBQWxCO1FBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNJLG1DQUFRLEdBQWY7UUFBQSxpQkFlQztRQWRDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxRCxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUTtZQUM3QixJQUFNLFlBQVksR0FBRyxDQUFDLEtBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRWpELElBQUksWUFBWSxFQUFFO2dCQUNoQixLQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUIsS0FBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDbEM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILHVCQUFDO0FBQUQsQ0FBQyxBQXBERCxDQUFpRCwrQkFBcUIsR0FvRHJFIn0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import IGraph from "../../../types/IGraph";
|
|
2
|
+
import AbstractGraphIterator from "./AbstractGraphIterator";
|
|
3
|
+
/**
|
|
4
|
+
* Dijkstra method graph traversal
|
|
5
|
+
*/
|
|
6
|
+
export default class GraphIteratorDijkstra<T> extends AbstractGraphIterator<T> {
|
|
7
|
+
private readonly costs;
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
constructor(graph: IGraph<T>);
|
|
12
|
+
/**
|
|
13
|
+
* Get not visited vertex with minimal cost
|
|
14
|
+
*/
|
|
15
|
+
private getClosestNotVisited;
|
|
16
|
+
/**
|
|
17
|
+
* @inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
initIteratorImpl(startVertex: T): void;
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
hasNextImpl(): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
currentImpl(): T;
|
|
28
|
+
/**
|
|
29
|
+
* @inheritDoc
|
|
30
|
+
*/
|
|
31
|
+
nextImpl(): T;
|
|
32
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __extends = (this && this.__extends) || (function () {
|
|
3
|
+
var extendStatics = function (d, b) {
|
|
4
|
+
extendStatics = Object.setPrototypeOf ||
|
|
5
|
+
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
+
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
+
return extendStatics(d, b);
|
|
8
|
+
};
|
|
9
|
+
return function (d, b) {
|
|
10
|
+
extendStatics(d, b);
|
|
11
|
+
function __() { this.constructor = d; }
|
|
12
|
+
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
13
|
+
};
|
|
14
|
+
})();
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
var AbstractGraphIterator_1 = require("./AbstractGraphIterator");
|
|
17
|
+
/**
|
|
18
|
+
* Dijkstra method graph traversal
|
|
19
|
+
*/
|
|
20
|
+
var GraphIteratorDijkstra = /** @class */ (function (_super) {
|
|
21
|
+
__extends(GraphIteratorDijkstra, _super);
|
|
22
|
+
/**
|
|
23
|
+
* @inheritDoc
|
|
24
|
+
*/
|
|
25
|
+
function GraphIteratorDijkstra(graph) {
|
|
26
|
+
var _this = _super.call(this, graph) || this;
|
|
27
|
+
_this.costs = new Map();
|
|
28
|
+
return _this;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get not visited vertex with minimal cost
|
|
32
|
+
*/
|
|
33
|
+
GraphIteratorDijkstra.prototype.getClosestNotVisited = function () {
|
|
34
|
+
var _this = this;
|
|
35
|
+
var keys = Array.from(this.costs.keys());
|
|
36
|
+
var priorityList = keys
|
|
37
|
+
.filter(function (key) { return !_this.visited.get(key); })
|
|
38
|
+
.sort(function (aKey, bKey) {
|
|
39
|
+
var aCost = _this.costs.get(aKey) || 0;
|
|
40
|
+
var bCost = _this.costs.get(bKey) || 0;
|
|
41
|
+
return aCost - bCost;
|
|
42
|
+
});
|
|
43
|
+
if (priorityList[0] === undefined) {
|
|
44
|
+
throw new Error("No more vertices found");
|
|
45
|
+
}
|
|
46
|
+
return priorityList[0];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* @inheritDoc
|
|
50
|
+
*/
|
|
51
|
+
GraphIteratorDijkstra.prototype.initIteratorImpl = function (startVertex) {
|
|
52
|
+
var _this = this;
|
|
53
|
+
if (!this.graph.hasVertex(startVertex)) {
|
|
54
|
+
throw new Error("Start vertex does not exist");
|
|
55
|
+
}
|
|
56
|
+
this.visited.set(startVertex, true);
|
|
57
|
+
this.costs.set(startVertex, 0);
|
|
58
|
+
this.graph.getVertexNeighbors(startVertex).forEach(function (neighbor) {
|
|
59
|
+
var edgeWeight = _this.graph.getEdgeWeight(startVertex, neighbor);
|
|
60
|
+
_this.costs.set(neighbor, edgeWeight);
|
|
61
|
+
_this.parents.set(neighbor, startVertex);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* @inheritDoc
|
|
66
|
+
*/
|
|
67
|
+
GraphIteratorDijkstra.prototype.hasNextImpl = function () {
|
|
68
|
+
return !(this.getClosestNotVisited() === null);
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* @inheritDoc
|
|
72
|
+
*/
|
|
73
|
+
GraphIteratorDijkstra.prototype.currentImpl = function () {
|
|
74
|
+
return this.getClosestNotVisited();
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* @inheritDoc
|
|
78
|
+
*/
|
|
79
|
+
GraphIteratorDijkstra.prototype.nextImpl = function () {
|
|
80
|
+
var _this = this;
|
|
81
|
+
var next = this.getClosestNotVisited();
|
|
82
|
+
this.visited.set(next, true);
|
|
83
|
+
var nextNeighbors = this.graph.getVertexNeighbors(next);
|
|
84
|
+
var nextCost = this.costs.get(next);
|
|
85
|
+
nextNeighbors.forEach(function (neighbor) {
|
|
86
|
+
var edgeWeight = _this.graph.getEdgeWeight(next, neighbor);
|
|
87
|
+
var currentNeighborCost = _this.costs.get(neighbor) || Infinity;
|
|
88
|
+
var newNeighborCost = (nextCost || 0) + edgeWeight;
|
|
89
|
+
if (newNeighborCost < currentNeighborCost) {
|
|
90
|
+
_this.costs.set(neighbor, newNeighborCost);
|
|
91
|
+
_this.parents.set(neighbor, next);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
return next;
|
|
95
|
+
};
|
|
96
|
+
return GraphIteratorDijkstra;
|
|
97
|
+
}(AbstractGraphIterator_1.default));
|
|
98
|
+
exports.default = GraphIteratorDijkstra;
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhJdGVyYXRvckRpamtzdHJhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RhdGEtc3RydWN0dXJlcy9HcmFwaC9pdGVyYXRvci9HcmFwaEl0ZXJhdG9yRGlqa3N0cmEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsaUVBQTREO0FBRTVEOztHQUVHO0FBQ0g7SUFBc0QseUNBQXdCO0lBRzVFOztPQUVHO0lBQ0gsK0JBQW1CLEtBQWdCO1FBQW5DLFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBRWI7UUFEQyxLQUFJLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7O0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNLLG9EQUFvQixHQUE1QjtRQUFBLGlCQWdCQztRQWZDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQU0sWUFBWSxHQUFHLElBQUk7YUFDdEIsTUFBTSxDQUFDLFVBQUMsR0FBTSxJQUFLLE9BQUEsQ0FBQyxLQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBdEIsQ0FBc0IsQ0FBQzthQUMxQyxJQUFJLENBQUMsVUFBQyxJQUFPLEVBQUUsSUFBTztZQUNyQixJQUFNLEtBQUssR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBTSxLQUFLLEdBQUcsS0FBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXhDLE9BQU8sS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxD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
|