@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,234 @@
|
|
|
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 RandBinarySearchNode_1 = require("./RandBinarySearchNode");
|
|
17
|
+
var BinarySearchTree_1 = require("../BinarySearchTree/BinarySearchTree");
|
|
18
|
+
/**
|
|
19
|
+
* Randomized binary search tree implementation
|
|
20
|
+
*/
|
|
21
|
+
var RandBinarySearchTree = /** @class */ (function (_super) {
|
|
22
|
+
__extends(RandBinarySearchTree, _super);
|
|
23
|
+
/**
|
|
24
|
+
* @inheritDoc
|
|
25
|
+
*/
|
|
26
|
+
function RandBinarySearchTree(fnCompare) {
|
|
27
|
+
var _this = _super.call(this, fnCompare) || this;
|
|
28
|
+
_this._head = null;
|
|
29
|
+
return _this;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Will update node rank by summing left and right subtrees tanks and itself rank (1)
|
|
33
|
+
*/
|
|
34
|
+
RandBinarySearchTree.prototype.updateRank = function (node) {
|
|
35
|
+
var _a, _b;
|
|
36
|
+
node.rank = (((_a = node.right) === null || _a === void 0 ? void 0 : _a.rank) || 0) + (((_b = node.left) === null || _b === void 0 ? void 0 : _b.rank) || 0) + 1;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Will set rank and parent attributes and update tree length
|
|
40
|
+
*/
|
|
41
|
+
RandBinarySearchTree.prototype.addCreatedNode = function (node, parentNode) {
|
|
42
|
+
if (parentNode === void 0) { parentNode = null; }
|
|
43
|
+
node.rank = 1;
|
|
44
|
+
if (parentNode !== null) {
|
|
45
|
+
node.parent = parentNode;
|
|
46
|
+
}
|
|
47
|
+
return node;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Will rotate node to the right side
|
|
51
|
+
*/
|
|
52
|
+
RandBinarySearchTree.prototype.rotateNodeRight = function (node) {
|
|
53
|
+
var pivot = node.left;
|
|
54
|
+
if (pivot === null) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
node.left = pivot.right;
|
|
58
|
+
if (pivot.right !== null) {
|
|
59
|
+
pivot.right.parent = node;
|
|
60
|
+
}
|
|
61
|
+
pivot.parent = node.parent;
|
|
62
|
+
if (node.parent === null) {
|
|
63
|
+
this._head = pivot;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
if (node === node.parent.right) {
|
|
67
|
+
node.parent.right = pivot;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
node.parent.left = pivot;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
pivot.right = node;
|
|
74
|
+
node.parent = pivot;
|
|
75
|
+
this.updateRank(node);
|
|
76
|
+
this.updateRank(pivot);
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Will rotate node to the left side
|
|
80
|
+
*/
|
|
81
|
+
RandBinarySearchTree.prototype.rotateNodeLeft = function (node) {
|
|
82
|
+
var pivot = node.right;
|
|
83
|
+
if (pivot === null) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
node.right = pivot.left;
|
|
87
|
+
if (pivot.left !== null) {
|
|
88
|
+
pivot.left.parent = node;
|
|
89
|
+
}
|
|
90
|
+
pivot.parent = node.parent;
|
|
91
|
+
if (node.parent === null) {
|
|
92
|
+
this._head = pivot;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
if (node === node.parent.left) {
|
|
96
|
+
node.parent.left = pivot;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
node.parent.right = pivot;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
pivot.left = node;
|
|
103
|
+
node.parent = pivot;
|
|
104
|
+
this.updateRank(node);
|
|
105
|
+
this.updateRank(pivot);
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* @inheritDoc
|
|
109
|
+
*/
|
|
110
|
+
RandBinarySearchTree.prototype.join = function (treeLeft, treeRight) {
|
|
111
|
+
if (treeLeft === null) {
|
|
112
|
+
return treeRight;
|
|
113
|
+
}
|
|
114
|
+
if (treeRight === null) {
|
|
115
|
+
return treeLeft;
|
|
116
|
+
}
|
|
117
|
+
if (Math.random() < treeLeft.rank / (treeLeft.rank + treeRight.rank)) {
|
|
118
|
+
treeLeft.right = this.join(treeLeft.right, treeRight);
|
|
119
|
+
if (treeLeft.right) {
|
|
120
|
+
this.updateLeftRightParents(treeLeft);
|
|
121
|
+
}
|
|
122
|
+
this.updateRank(treeLeft);
|
|
123
|
+
return treeLeft;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
treeRight.left = this.join(treeLeft, treeRight.left);
|
|
127
|
+
if (treeRight.left) {
|
|
128
|
+
this.updateLeftRightParents(treeRight);
|
|
129
|
+
}
|
|
130
|
+
this.updateRank(treeRight);
|
|
131
|
+
return treeRight;
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* @inheritDoc
|
|
136
|
+
*/
|
|
137
|
+
RandBinarySearchTree.prototype.updateLeftRightParents = function (node) {
|
|
138
|
+
_super.prototype.updateLeftRightParents.call(this, node);
|
|
139
|
+
this.updateRank(node);
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* @inheritDoc
|
|
143
|
+
*/
|
|
144
|
+
RandBinarySearchTree.prototype.insertToRoot = function (createdNode, fromNode) {
|
|
145
|
+
var _this = this;
|
|
146
|
+
var recursiveInsert = function (node) {
|
|
147
|
+
if (_this.compare(node.data, createdNode.data)) {
|
|
148
|
+
if (node.left === null) {
|
|
149
|
+
node.left = _this.addCreatedNode(createdNode, node);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
recursiveInsert(node.left);
|
|
153
|
+
}
|
|
154
|
+
_this.rotateNodeRight(node);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
if (node.right === null) {
|
|
158
|
+
node.right = _this.addCreatedNode(createdNode, node);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
recursiveInsert(node.right);
|
|
162
|
+
}
|
|
163
|
+
_this.rotateNodeLeft(node);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
if (this._head === null) {
|
|
167
|
+
this._head = this.addCreatedNode(createdNode);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
fromNode ? recursiveInsert(fromNode) : recursiveInsert(this._head);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* @inheritDoc
|
|
175
|
+
*/
|
|
176
|
+
RandBinarySearchTree.prototype.insertRandomly = function (createdNode) {
|
|
177
|
+
var _this = this;
|
|
178
|
+
var recursiveInsertRandomly = function (node) {
|
|
179
|
+
var shouldInsertToRoot = Math.random() < 1 / (node.rank + 1);
|
|
180
|
+
if (shouldInsertToRoot) {
|
|
181
|
+
_this.insertToRoot(createdNode, node);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
node.rank = node.rank + 1;
|
|
185
|
+
if (_this.compare(node.data, createdNode.data)) {
|
|
186
|
+
if (node.left === null) {
|
|
187
|
+
node.left = _this.addCreatedNode(createdNode, node);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
recursiveInsertRandomly(node.left);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
if (node.right === null) {
|
|
195
|
+
node.right = _this.addCreatedNode(createdNode, node);
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
recursiveInsertRandomly(node.right);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
if (this._head === null) {
|
|
204
|
+
this._head = this.addCreatedNode(createdNode);
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
recursiveInsertRandomly(this._head);
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
/**
|
|
211
|
+
* @inheritDoc
|
|
212
|
+
*/
|
|
213
|
+
RandBinarySearchTree.prototype.insert = function (value) {
|
|
214
|
+
if (this.has(value)) {
|
|
215
|
+
throw new Error("Node already exists");
|
|
216
|
+
}
|
|
217
|
+
var createdNode = new RandBinarySearchNode_1.default(value);
|
|
218
|
+
this.insertRandomly(createdNode);
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* @inheritDoc
|
|
222
|
+
*/
|
|
223
|
+
RandBinarySearchTree.prototype.delete = function (value) {
|
|
224
|
+
_super.prototype.delete.call(this, value);
|
|
225
|
+
this._length = this.length();
|
|
226
|
+
};
|
|
227
|
+
RandBinarySearchTree.prototype.length = function () {
|
|
228
|
+
var _a;
|
|
229
|
+
return ((_a = this._head) === null || _a === void 0 ? void 0 : _a.rank) || 0;
|
|
230
|
+
};
|
|
231
|
+
return RandBinarySearchTree;
|
|
232
|
+
}(BinarySearchTree_1.default));
|
|
233
|
+
exports.default = RandBinarySearchTree;
|
|
234
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZEJpbmFyeVNlYXJjaFRyZWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGF0YS1zdHJ1Y3R1cmVzL0JpbmFyeVRyZWUvUmFuZEJpbmFyeVNlYXJjaFRyZWUvUmFuZEJpbmFyeVNlYXJjaFRyZWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsK0RBQTBEO0FBQzFELHlFQUFvRTtBQUVwRTs7R0FFRztBQUNIO0lBQXFELHdDQUFtQjtJQU10RTs7T0FFRztJQUNILDhCQUFtQixTQUEyQjtRQUE5QyxZQUNFLGtCQUFNLFNBQVMsQ0FBQyxTQUVqQjtRQURDLEtBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDOztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSyx5Q0FBVSxHQUFsQixVQUFtQixJQUE2Qjs7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLE9BQUEsSUFBSSxDQUFDLEtBQUssMENBQUUsSUFBSSxLQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxJQUFJLEtBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNLLDZDQUFjLEdBQXRCLFVBQ0UsSUFBNkIsRUFDN0IsVUFBaUQ7UUFBakQsMkJBQUEsRUFBQSxpQkFBaUQ7UUFFakQsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7U0FDMUI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNLLDhDQUFlLEdBQXZCLFVBQXdCLElBQTZCO1FBQ25ELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ2xCLE9B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
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import GraphEdge from "./GraphEdge";
|
|
2
|
+
export default abstract class AbstractGraph<T> {
|
|
3
|
+
protected _vertices: Map<T, Array<T>>;
|
|
4
|
+
protected _edges: Array<GraphEdge<T>>;
|
|
5
|
+
/**
|
|
6
|
+
* Created empty instance
|
|
7
|
+
*/
|
|
8
|
+
protected constructor();
|
|
9
|
+
/**
|
|
10
|
+
* Find edge by its from and to vertices
|
|
11
|
+
*/
|
|
12
|
+
protected abstract getEdgeByValue(from: T, to: T): GraphEdge<T>;
|
|
13
|
+
/**
|
|
14
|
+
* Get vertices list in array format
|
|
15
|
+
*/
|
|
16
|
+
protected getVerticesArrayFormat(): Array<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Find vertex in vertices list by its data
|
|
19
|
+
* @throws when vertex was not found
|
|
20
|
+
*/
|
|
21
|
+
protected tryFindVertex(data: T): T;
|
|
22
|
+
/**
|
|
23
|
+
* Update edge weight between from and to vertices
|
|
24
|
+
*/
|
|
25
|
+
protected updateEdgeWeight(from: T, to: T, weight: number): void;
|
|
26
|
+
/**
|
|
27
|
+
* Will remove all vertex relations with others vertices
|
|
28
|
+
*/
|
|
29
|
+
protected cascadeRemoveVertexRelations(vertexToRemove: T): void;
|
|
30
|
+
/**
|
|
31
|
+
* Will remove all vertices edges with vertex to remove
|
|
32
|
+
*/
|
|
33
|
+
protected cascadeRemoveVertexEdges(vertexToRemove: T): void;
|
|
34
|
+
/**
|
|
35
|
+
* Get sum of all graph edges
|
|
36
|
+
*/
|
|
37
|
+
weight(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Get array of vertices
|
|
40
|
+
*/
|
|
41
|
+
vertices(): Array<T>;
|
|
42
|
+
/**
|
|
43
|
+
* Get vertices count
|
|
44
|
+
*/
|
|
45
|
+
verticesCount(): number;
|
|
46
|
+
/**
|
|
47
|
+
* Get edges count
|
|
48
|
+
*/
|
|
49
|
+
edgesCount(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Add vertex
|
|
52
|
+
* @throws when vertex is already exists
|
|
53
|
+
*/
|
|
54
|
+
addVertex(data: T): this;
|
|
55
|
+
/**
|
|
56
|
+
* Remove vertex
|
|
57
|
+
* @throws when vertex is already does not exist
|
|
58
|
+
*/
|
|
59
|
+
removeVertex(data: T): this;
|
|
60
|
+
/**
|
|
61
|
+
* Add edge between two vertices
|
|
62
|
+
*/
|
|
63
|
+
abstract addEdge(from: T, to: T, weight?: number): this;
|
|
64
|
+
/**
|
|
65
|
+
* Remove edge between two vertices
|
|
66
|
+
*/
|
|
67
|
+
abstract removeEdge(from: T, to: T): this;
|
|
68
|
+
/**
|
|
69
|
+
* Get vertex neighbors by its data
|
|
70
|
+
*/
|
|
71
|
+
getVertexNeighbors(data: T): Array<T>;
|
|
72
|
+
/**
|
|
73
|
+
* Check if graph has vertex
|
|
74
|
+
*/
|
|
75
|
+
hasVertex(data: T): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Check if graph has edge between from and to vertices
|
|
78
|
+
*/
|
|
79
|
+
hasEdge(from: T, to: T): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Get edge weight between from and to vertices
|
|
82
|
+
*/
|
|
83
|
+
getEdgeWeight(from: T, to: T): number;
|
|
84
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var AbstractGraph = /** @class */ (function () {
|
|
4
|
+
/**
|
|
5
|
+
* Created empty instance
|
|
6
|
+
*/
|
|
7
|
+
function AbstractGraph() {
|
|
8
|
+
this._vertices = new Map();
|
|
9
|
+
this._edges = new Array();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Get vertices list in array format
|
|
13
|
+
*/
|
|
14
|
+
AbstractGraph.prototype.getVerticesArrayFormat = function () {
|
|
15
|
+
return Array.from(this._vertices.keys());
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Find vertex in vertices list by its data
|
|
19
|
+
* @throws when vertex was not found
|
|
20
|
+
*/
|
|
21
|
+
AbstractGraph.prototype.tryFindVertex = function (data) {
|
|
22
|
+
var isExists = this._vertices.has(data);
|
|
23
|
+
if (!isExists) {
|
|
24
|
+
throw new Error("Vertex not found");
|
|
25
|
+
}
|
|
26
|
+
return data;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Update edge weight between from and to vertices
|
|
30
|
+
*/
|
|
31
|
+
AbstractGraph.prototype.updateEdgeWeight = function (from, to, weight) {
|
|
32
|
+
var edge = this.getEdgeByValue(from, to);
|
|
33
|
+
edge.weight = weight;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Will remove all vertex relations with others vertices
|
|
37
|
+
*/
|
|
38
|
+
AbstractGraph.prototype.cascadeRemoveVertexRelations = function (vertexToRemove) {
|
|
39
|
+
var _this = this;
|
|
40
|
+
this.getVerticesArrayFormat().forEach(function (neighbor) {
|
|
41
|
+
var neighborVertexNeighbors = _this._vertices.get(neighbor);
|
|
42
|
+
if (neighborVertexNeighbors) {
|
|
43
|
+
var neighborVertexFilteredNeighbors = neighborVertexNeighbors.filter(function (newNeighbor) { return newNeighbor !== vertexToRemove; });
|
|
44
|
+
_this._vertices.set(neighbor, neighborVertexFilteredNeighbors);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Will remove all vertices edges with vertex to remove
|
|
50
|
+
*/
|
|
51
|
+
AbstractGraph.prototype.cascadeRemoveVertexEdges = function (vertexToRemove) {
|
|
52
|
+
this._edges = this._edges.filter(function (edge) {
|
|
53
|
+
var shouldBeDeleted = edge.toVertex === vertexToRemove || edge.fromVertex === vertexToRemove;
|
|
54
|
+
return !shouldBeDeleted;
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Get sum of all graph edges
|
|
59
|
+
*/
|
|
60
|
+
AbstractGraph.prototype.weight = function () {
|
|
61
|
+
return this._edges.reduce(function (acc, edge) { return acc + edge.weight; }, 0);
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Get array of vertices
|
|
65
|
+
*/
|
|
66
|
+
AbstractGraph.prototype.vertices = function () {
|
|
67
|
+
return this.getVerticesArrayFormat().map(function (vertex) { return vertex; });
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Get vertices count
|
|
71
|
+
*/
|
|
72
|
+
AbstractGraph.prototype.verticesCount = function () {
|
|
73
|
+
return this.vertices().length;
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* Get edges count
|
|
77
|
+
*/
|
|
78
|
+
AbstractGraph.prototype.edgesCount = function () {
|
|
79
|
+
return this._edges.length;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Add vertex
|
|
83
|
+
* @throws when vertex is already exists
|
|
84
|
+
*/
|
|
85
|
+
AbstractGraph.prototype.addVertex = function (data) {
|
|
86
|
+
if (this.hasVertex(data)) {
|
|
87
|
+
throw new Error("Vertex is already exist");
|
|
88
|
+
}
|
|
89
|
+
this._vertices.set(data, new Array());
|
|
90
|
+
return this;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Remove vertex
|
|
94
|
+
* @throws when vertex is already does not exist
|
|
95
|
+
*/
|
|
96
|
+
AbstractGraph.prototype.removeVertex = function (data) {
|
|
97
|
+
try {
|
|
98
|
+
var vertexToRemove = this.tryFindVertex(data);
|
|
99
|
+
this.cascadeRemoveVertexEdges(vertexToRemove);
|
|
100
|
+
this.cascadeRemoveVertexRelations(vertexToRemove);
|
|
101
|
+
this._vertices.delete(vertexToRemove);
|
|
102
|
+
}
|
|
103
|
+
catch (e) {
|
|
104
|
+
throw new Error("Vertex does not exist already");
|
|
105
|
+
}
|
|
106
|
+
return this;
|
|
107
|
+
};
|
|
108
|
+
/**
|
|
109
|
+
* Get vertex neighbors by its data
|
|
110
|
+
*/
|
|
111
|
+
AbstractGraph.prototype.getVertexNeighbors = function (data) {
|
|
112
|
+
var vertex = this.tryFindVertex(data);
|
|
113
|
+
return this._vertices.get(vertex) || [];
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Check if graph has vertex
|
|
117
|
+
*/
|
|
118
|
+
AbstractGraph.prototype.hasVertex = function (data) {
|
|
119
|
+
return this._vertices.has(data);
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Check if graph has edge between from and to vertices
|
|
123
|
+
*/
|
|
124
|
+
AbstractGraph.prototype.hasEdge = function (from, to) {
|
|
125
|
+
return Boolean(this._edges.find(function (edge) {
|
|
126
|
+
return edge.fromVertex === from && edge.toVertex === to;
|
|
127
|
+
}));
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* Get edge weight between from and to vertices
|
|
131
|
+
*/
|
|
132
|
+
AbstractGraph.prototype.getEdgeWeight = function (from, to) {
|
|
133
|
+
var fromVertex = this.tryFindVertex(from);
|
|
134
|
+
var toVertex = this.tryFindVertex(to);
|
|
135
|
+
var edge = this.getEdgeByValue(fromVertex, toVertex);
|
|
136
|
+
return edge.weight;
|
|
137
|
+
};
|
|
138
|
+
return AbstractGraph;
|
|
139
|
+
}());
|
|
140
|
+
exports.default = AbstractGraph;
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RHcmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLXN0cnVjdHVyZXMvR3JhcGgvQWJzdHJhY3RHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBO0lBSUU7O09BRUc7SUFDSDtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFnQixDQUFDO0lBQzFDLENBQUM7SUFPRDs7T0FFRztJQUNPLDhDQUFzQixHQUFoQztRQUNFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHFDQUFhLEdBQXZCLFVBQXdCLElBQU87UUFDN0IsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08sd0NBQWdCLEdBQTFCLFVBQTJCLElBQU8sRUFBRSxFQUFLLEVBQUUsTUFBYztRQUN2RCxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDTyxvREFBNEIsR0FBdEMsVUFBdUMsY0FBaUI7UUFBeEQsaUJBWUM7UUFYQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFXO1lBQ2hELElBQU0sdUJBQXVCLEdBQUcsS0FBSSxDQUFD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
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import AbstractGraph from "./AbstractGraph";
|
|
2
|
+
import GraphEdge from "./GraphEdge";
|
|
3
|
+
/**
|
|
4
|
+
* Directed graph - data structure where edges with same pair of vertices are not equal
|
|
5
|
+
* @example A-B is not the same as B-A
|
|
6
|
+
*/
|
|
7
|
+
export default class DirectedGraph<T> extends AbstractGraph<T> {
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* @inheritDoc
|
|
14
|
+
*/
|
|
15
|
+
protected getEdgeByValue(from: T, to: T): GraphEdge<T>;
|
|
16
|
+
/**
|
|
17
|
+
* @inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
addEdge(from: T, to: T, weight?: number): this;
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
removeEdge(from: T, to: T): this;
|
|
24
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
* Directed graph - data structure where edges with same pair of vertices are not equal
|
|
20
|
+
* @example A-B is not the same as B-A
|
|
21
|
+
*/
|
|
22
|
+
var DirectedGraph = /** @class */ (function (_super) {
|
|
23
|
+
__extends(DirectedGraph, _super);
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
function DirectedGraph() {
|
|
28
|
+
return _super.call(this) || this;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* @inheritDoc
|
|
32
|
+
*/
|
|
33
|
+
DirectedGraph.prototype.getEdgeByValue = function (from, to) {
|
|
34
|
+
var edge = this._edges.find(function (edge) { return edge.fromVertex === from && edge.toVertex === to; });
|
|
35
|
+
if (!edge) {
|
|
36
|
+
throw new Error("Edge not found");
|
|
37
|
+
}
|
|
38
|
+
return edge;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* @inheritDoc
|
|
42
|
+
*/
|
|
43
|
+
DirectedGraph.prototype.addEdge = function (from, to, weight) {
|
|
44
|
+
var _a;
|
|
45
|
+
try {
|
|
46
|
+
var fromVertex = this.tryFindVertex(from);
|
|
47
|
+
var toVertex = this.tryFindVertex(to);
|
|
48
|
+
if (this.hasEdge(fromVertex, toVertex)) {
|
|
49
|
+
if (typeof weight === "number") {
|
|
50
|
+
this.updateEdgeWeight(fromVertex, toVertex, weight);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
var edge = new GraphEdge_1.default(fromVertex, toVertex, weight);
|
|
55
|
+
this._edges.push(edge);
|
|
56
|
+
(_a = this._vertices.get(fromVertex)) === null || _a === void 0 ? void 0 : _a.push(toVertex);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (_b) {
|
|
60
|
+
throw new Error("Edge cannot be added because one of vertices was not found");
|
|
61
|
+
}
|
|
62
|
+
return this;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* @inheritDoc
|
|
66
|
+
*/
|
|
67
|
+
DirectedGraph.prototype.removeEdge = function (from, to) {
|
|
68
|
+
try {
|
|
69
|
+
var fromVertex = this.tryFindVertex(from);
|
|
70
|
+
var toVertex_1 = this.tryFindVertex(to);
|
|
71
|
+
var edgeToRemove_1 = this.getEdgeByValue(fromVertex, toVertex_1);
|
|
72
|
+
var fromVertexNeighbors = this._vertices.get(fromVertex) || [];
|
|
73
|
+
var fromNewNeighbors = fromVertexNeighbors.filter(function (vertex) { return toVertex_1 !== vertex; });
|
|
74
|
+
this._vertices.set(fromVertex, fromNewNeighbors);
|
|
75
|
+
this._edges = this._edges.filter(function (edge) { return edge !== edgeToRemove_1; });
|
|
76
|
+
}
|
|
77
|
+
catch (_a) {
|
|
78
|
+
throw new Error("Edge cannot be removed because one of vertices was not found");
|
|
79
|
+
}
|
|
80
|
+
return this;
|
|
81
|
+
};
|
|
82
|
+
return DirectedGraph;
|
|
83
|
+
}(AbstractGraph_1.default));
|
|
84
|
+
exports.default = DirectedGraph;
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlyZWN0ZWRHcmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhLXN0cnVjdHVyZXMvR3JhcGgvRGlyZWN0ZWRHcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBNEM7QUFDNUMseUNBQW9DO0FBRXBDOzs7R0FHRztBQUNIO0lBQThDLGlDQUFnQjtJQUM1RDs7T0FFRztJQUNIO2VBQ0UsaUJBQU87SUFDVCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxzQ0FBYyxHQUF4QixVQUF5QixJQUFPLEVBQUUsRUFBSztRQUNyQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDM0IsVUFBQyxJQUFrQixJQUFLLE9BQUEsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLEVBQWhELENBQWdELENBQ3pFLENBQUM7UUFFRixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSwrQkFBTyxHQUFkLFVBQWUsSUFBTyxFQUFFLEVBQUssRUFBRSxNQUFlOztRQUM1QyxJQUFJO1lBQ0YsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QyxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXhDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO29CQUM5QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztpQkFDckQ7YUFDRjtpQkFBTTtnQkFDTCxJQUFNLElBQUksR0FBRyxJQUFJLG1CQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLE1BQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLDBDQUFFLElBQUksQ0FBQyxRQUFRLEVBQUU7YUFDaEQ7U0FDRjtRQUFDLFdBQU07WUFDTixNQUFNLElBQUksS0FBSyxDQUNiLDREQUE0RCxDQUM3RCxDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLGtDQUFVLEdBQWpCLFVBQWtCLElBQU8sRUFBRSxFQUFLO1FBQzlCLElBQUk7WUFDRixJQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQU0sVUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBTSxjQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsVUFBUSxDQUFDLENBQUM7WUFFL0QsSUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakUsSUFBTSxnQkFBZ0IsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQ2pELFVBQUMsTUFBUyxJQUFLLE9BQUEsVUFBUSxLQUFLLE1BQU0sRUFBbkIsQ0FBbUIsQ0FDbkMsQ0FBQztZQUVGLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQzlCLFVBQUMsSUFBa0IsSUFBSyxPQUFBLElBQUksS0FBSyxjQUFZLEVBQXJCLENBQXFCLENBQzlDLENBQUM7U0FDSDtRQUFDLFdBQU07WUFDTixNQUFNLElBQUksS0FBSyxDQUNiLDhEQUE4RCxDQUMvRCxDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCxvQkFBQztBQUFELENBQUMsQUE1RUQsQ0FBOEMsdUJBQWEsR0E0RTFEIn0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Graph edge between two vertices
|
|
3
|
+
*/
|
|
4
|
+
export default class GraphEdge<T> {
|
|
5
|
+
private readonly _fromVertex;
|
|
6
|
+
private readonly _toVertex;
|
|
7
|
+
private _weight;
|
|
8
|
+
/**
|
|
9
|
+
* Create instance with linked "from" and "to" vertices
|
|
10
|
+
*/
|
|
11
|
+
constructor(fromVertex: T, toVertex: T, weight?: number);
|
|
12
|
+
get fromVertex(): T;
|
|
13
|
+
get toVertex(): T;
|
|
14
|
+
get weight(): number;
|
|
15
|
+
set weight(value: number);
|
|
16
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/**
|
|
4
|
+
* Graph edge between two vertices
|
|
5
|
+
*/
|
|
6
|
+
var GraphEdge = /** @class */ (function () {
|
|
7
|
+
/**
|
|
8
|
+
* Create instance with linked "from" and "to" vertices
|
|
9
|
+
*/
|
|
10
|
+
function GraphEdge(fromVertex, toVertex, weight) {
|
|
11
|
+
if (weight === void 0) { weight = 0; }
|
|
12
|
+
this._fromVertex = fromVertex;
|
|
13
|
+
this._toVertex = toVertex;
|
|
14
|
+
this._weight = weight;
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(GraphEdge.prototype, "fromVertex", {
|
|
17
|
+
get: function () {
|
|
18
|
+
return this._fromVertex;
|
|
19
|
+
},
|
|
20
|
+
enumerable: false,
|
|
21
|
+
configurable: true
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(GraphEdge.prototype, "toVertex", {
|
|
24
|
+
get: function () {
|
|
25
|
+
return this._toVertex;
|
|
26
|
+
},
|
|
27
|
+
enumerable: false,
|
|
28
|
+
configurable: true
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(GraphEdge.prototype, "weight", {
|
|
31
|
+
get: function () {
|
|
32
|
+
return this._weight;
|
|
33
|
+
},
|
|
34
|
+
set: function (value) {
|
|
35
|
+
this._weight = value;
|
|
36
|
+
},
|
|
37
|
+
enumerable: false,
|
|
38
|
+
configurable: true
|
|
39
|
+
});
|
|
40
|
+
return GraphEdge;
|
|
41
|
+
}());
|
|
42
|
+
exports.default = GraphEdge;
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGhFZGdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGEtc3RydWN0dXJlcy9HcmFwaC9HcmFwaEVkZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7R0FFRztBQUNIO0lBS0U7O09BRUc7SUFDSCxtQkFBbUIsVUFBYSxFQUFFLFFBQVcsRUFBRSxNQUFVO1FBQVYsdUJBQUEsRUFBQSxVQUFVO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxzQkFBSSxpQ0FBVTthQUFkO1lBQ0UsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0JBQVE7YUFBWjtZQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLDZCQUFNO2FBQVY7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdEIsQ0FBQzthQUVELFVBQVcsS0FBYTtZQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDOzs7T0FKQTtJQUtILGdCQUFDO0FBQUQsQ0FBQyxBQTdCRCxJQTZCQyJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import AbstractGraph from "./AbstractGraph";
|
|
2
|
+
import GraphEdge from "./GraphEdge";
|
|
3
|
+
/**
|
|
4
|
+
* Undirected graph - data structure where edges with same pair of vertices are equal
|
|
5
|
+
* @example A-B is same as B-A
|
|
6
|
+
*/
|
|
7
|
+
export default class UndirectedGraph<T> extends AbstractGraph<T> {
|
|
8
|
+
/**
|
|
9
|
+
* @inheritDoc
|
|
10
|
+
*/
|
|
11
|
+
constructor();
|
|
12
|
+
/**
|
|
13
|
+
* @inheritDoc
|
|
14
|
+
*/
|
|
15
|
+
protected getEdgeByValue(from: T, to: T): GraphEdge<T>;
|
|
16
|
+
/**
|
|
17
|
+
* @inheritDoc
|
|
18
|
+
*/
|
|
19
|
+
hasEdge(from: T, to: T): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* @inheritDoc
|
|
22
|
+
*/
|
|
23
|
+
addEdge(from: T, to: T, weight?: number): this;
|
|
24
|
+
/**
|
|
25
|
+
* @inheritDoc
|
|
26
|
+
*/
|
|
27
|
+
removeEdge(from: T, to: T): this;
|
|
28
|
+
}
|