@raikuxq/alg-ds 1.1.6 → 1.2.1
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 +71 -88
- package/lib/app/algorithms/binary-search.d.ts +5 -0
- package/lib/app/algorithms/binary-search.js +27 -0
- package/lib/app/algorithms/factorial.d.ts +9 -0
- package/lib/app/algorithms/factorial.js +17 -0
- package/lib/app/algorithms/fibonacci.d.ts +9 -0
- package/lib/app/algorithms/fibonacci.js +17 -0
- package/lib/app/algorithms/graph/iterator/AbstractGraphIterator.d.ts +35 -0
- package/lib/app/algorithms/graph/iterator/AbstractGraphIterator.js +83 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorBFS.d.ts +28 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorBFS.js +70 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorDFS.d.ts +28 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorDFS.js +70 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorDijkstra.d.ts +32 -0
- package/lib/app/algorithms/graph/iterator/GraphIteratorDijkstra.js +97 -0
- package/lib/app/algorithms/graph/iterator-strategy/BFSIterationStrategy.d.ts +6 -0
- package/lib/app/algorithms/graph/iterator-strategy/BFSIterationStrategy.js +13 -0
- package/lib/app/algorithms/graph/iterator-strategy/DFSIterationStrategy.d.ts +6 -0
- package/lib/app/algorithms/graph/iterator-strategy/DFSIterationStrategy.js +13 -0
- package/lib/app/algorithms/graph/iterator-strategy/DijkstraIterationStrategy.d.ts +6 -0
- package/lib/app/algorithms/graph/iterator-strategy/DijkstraIterationStrategy.js +13 -0
- package/lib/app/algorithms/graph/presenter/presenterAdjacencyLists.d.ts +19 -0
- package/lib/app/algorithms/graph/presenter/presenterAdjacencyLists.js +28 -0
- package/lib/app/algorithms/graph/presenter/presenterAdjacencyMatrix.d.ts +32 -0
- package/lib/app/algorithms/graph/presenter/presenterAdjacencyMatrix.js +48 -0
- package/lib/app/algorithms/graph/searching/hasPath.d.ts +9 -0
- package/lib/app/algorithms/graph/searching/hasPath.js +30 -0
- package/lib/app/algorithms/graph/searching/shortestPath.d.ts +9 -0
- package/lib/app/algorithms/graph/searching/shortestPath.js +30 -0
- package/lib/app/algorithms/graph/transposing/transposeDirectedGraph.d.ts +2 -0
- package/lib/app/algorithms/graph/transposing/transposeDirectedGraph.js +14 -0
- package/lib/app/algorithms/memoize.d.ts +5 -0
- package/lib/app/algorithms/memoize.js +22 -0
- package/lib/app/algorithms/sorts/bubble-sort.d.ts +9 -0
- package/lib/app/algorithms/sorts/bubble-sort.js +23 -0
- package/lib/app/algorithms/sorts/insertion-sort.d.ts +9 -0
- package/lib/app/algorithms/sorts/insertion-sort.js +25 -0
- package/lib/app/algorithms/sorts/merge-sort.d.ts +9 -0
- package/lib/app/algorithms/sorts/merge-sort.js +61 -0
- package/lib/app/algorithms/sorts/quick-sort.d.ts +9 -0
- package/lib/app/algorithms/sorts/quick-sort.js +45 -0
- package/lib/app/algorithms/sorts/select-sort.d.ts +9 -0
- package/lib/app/algorithms/sorts/select-sort.js +20 -0
- package/lib/app/algorithms/transpose-matrix.d.ts +5 -0
- package/lib/app/algorithms/transpose-matrix.js +18 -0
- package/lib/app/constants.d.ts +2 -0
- package/lib/app/constants.js +6 -0
- package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.d.ts +15 -0
- package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.js +53 -0
- package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.d.ts +60 -0
- package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.js +36 -0
- package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.d.ts +13 -0
- package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.js +59 -0
- package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.d.ts +70 -0
- package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.js +271 -0
- package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.d.ts +16 -0
- package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.js +70 -0
- package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.d.ts +57 -0
- package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.js +235 -0
- package/lib/app/data-structures/BinaryTree/_helpers/createBinaryTree.d.ts +6 -0
- package/lib/app/data-structures/BinaryTree/_helpers/createBinaryTree.js +22 -0
- package/lib/app/data-structures/Graph/AbstractGraph.d.ts +84 -0
- package/lib/app/data-structures/Graph/AbstractGraph.js +143 -0
- package/lib/app/data-structures/Graph/DirectedGraph.d.ts +24 -0
- package/lib/app/data-structures/Graph/DirectedGraph.js +86 -0
- package/lib/app/data-structures/Graph/GraphEdge.d.ts +16 -0
- package/lib/app/data-structures/Graph/GraphEdge.js +43 -0
- package/lib/app/data-structures/Graph/UndirectedGraph.d.ts +28 -0
- package/lib/app/data-structures/Graph/UndirectedGraph.js +103 -0
- package/lib/app/data-structures/Graph/_helpers/createGraph.d.ts +6 -0
- package/lib/app/data-structures/Graph/_helpers/createGraph.js +22 -0
- package/lib/app/data-structures/Graph/_helpers/createGraphFromMatrix.d.ts +7 -0
- package/lib/app/data-structures/Graph/_helpers/createGraphFromMatrix.js +42 -0
- package/lib/app/data-structures/Graph/_helpers/generateRandomGraph.d.ts +4 -0
- package/lib/app/data-structures/Graph/_helpers/generateRandomGraph.js +67 -0
- package/lib/app/data-structures/HashTable/HashTable.d.ts +73 -0
- package/lib/app/data-structures/HashTable/HashTable.js +171 -0
- package/lib/app/data-structures/HashTable/HashTableNode.d.ts +11 -0
- package/lib/app/data-structures/HashTable/HashTableNode.js +39 -0
- package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.d.ts +125 -0
- package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.js +241 -0
- package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.d.ts +20 -0
- package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.js +41 -0
- package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.d.ts +48 -0
- package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.js +151 -0
- package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.d.ts +25 -0
- package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.js +65 -0
- package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.d.ts +52 -0
- package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.js +138 -0
- package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.d.ts +7 -0
- package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.js +29 -0
- package/lib/app/data-structures/LinkedList/_helpers/createLinkedList.d.ts +3 -0
- package/lib/app/data-structures/LinkedList/_helpers/createLinkedList.js +19 -0
- package/lib/app/data-structures/LoopedArray/LoopedArray.d.ts +83 -0
- package/lib/app/data-structures/LoopedArray/LoopedArray.js +169 -0
- package/lib/app/data-structures/Queue/Queue.d.ts +50 -0
- package/lib/app/data-structures/Queue/Queue.js +85 -0
- package/lib/app/data-structures/Stack/Stack.d.ts +50 -0
- package/lib/app/data-structures/Stack/Stack.js +85 -0
- package/lib/app/exceptions/CollectionIsEmptyException.d.ts +4 -0
- package/lib/app/exceptions/CollectionIsEmptyException.js +28 -0
- package/lib/app/exceptions/CollectionIsFullException.d.ts +4 -0
- package/lib/app/exceptions/CollectionIsFullException.js +28 -0
- package/lib/app/exceptions/IndexOutOfBoundsException.d.ts +4 -0
- package/lib/app/exceptions/IndexOutOfBoundsException.js +28 -0
- package/lib/app/exceptions/IsAlreadyExistsException.d.ts +4 -0
- package/lib/app/exceptions/IsAlreadyExistsException.js +28 -0
- package/lib/app/exceptions/IsNotFoundException.d.ts +4 -0
- package/lib/app/exceptions/IsNotFoundException.js +28 -0
- package/lib/app/exceptions/ValueOutOfRangeException.d.ts +4 -0
- package/lib/app/exceptions/ValueOutOfRangeException.js +28 -0
- package/lib/app/exceptions/base/IllegalArgumentException.d.ts +3 -0
- package/lib/app/exceptions/base/IllegalArgumentException.js +27 -0
- package/lib/app/exceptions/base/IllegalStateException.d.ts +3 -0
- package/lib/app/exceptions/base/IllegalStateException.js +27 -0
- package/lib/app/types/EnumBinarySearchTreeType.d.ts +4 -0
- package/lib/app/types/EnumBinarySearchTreeType.js +9 -0
- package/lib/app/types/EnumGraphTraversalType.d.ts +5 -0
- package/lib/app/types/EnumGraphTraversalType.js +10 -0
- package/lib/app/types/EnumGraphType.d.ts +4 -0
- package/lib/app/types/EnumGraphType.js +9 -0
- package/lib/app/types/EnumLinkedListType.d.ts +4 -0
- package/lib/app/types/EnumLinkedListType.js +9 -0
- package/lib/app/types/EnumRandomGenerationFormat.d.ts +4 -0
- package/lib/app/types/EnumRandomGenerationFormat.js +9 -0
- package/lib/app/types/EnumSortType.d.ts +7 -0
- package/lib/app/types/EnumSortType.js +12 -0
- package/lib/app/types/EnumTreeTraversalType.d.ts +5 -0
- package/lib/app/types/EnumTreeTraversalType.js +10 -0
- package/lib/app/types/FnCompareTwo.d.ts +1 -0
- package/lib/app/types/FnCompareTwo.js +3 -0
- package/lib/app/types/FnToMemoize.d.ts +1 -0
- package/lib/app/types/FnToMemoize.js +3 -0
- package/lib/app/types/IArrayFacade.d.ts +4 -0
- package/lib/app/types/IArrayFacade.js +3 -0
- package/lib/app/types/IBiDirectIterable.d.ts +5 -0
- package/lib/app/types/IBiDirectIterable.js +3 -0
- package/lib/app/types/IBiDirectIterator.d.ts +11 -0
- package/lib/app/types/IBiDirectIterator.js +3 -0
- package/lib/app/types/IBinaryTree.d.ts +12 -0
- package/lib/app/types/IBinaryTree.js +3 -0
- package/lib/app/types/IConvertableToArray.d.ts +4 -0
- package/lib/app/types/IConvertableToArray.js +3 -0
- package/lib/app/types/IGraph.d.ts +14 -0
- package/lib/app/types/IGraph.js +3 -0
- package/lib/app/types/IGraphIterationStrategy.d.ts +5 -0
- package/lib/app/types/IGraphIterationStrategy.js +3 -0
- package/lib/app/types/IGraphIterator.d.ts +11 -0
- package/lib/app/types/IGraphIterator.js +3 -0
- package/lib/app/types/IIterable.d.ts +4 -0
- package/lib/app/types/IIterable.js +3 -0
- package/lib/app/types/IIterator.d.ts +14 -0
- package/lib/app/types/IIterator.js +3 -0
- package/lib/app/types/IKeyValueStorage.d.ts +8 -0
- package/lib/app/types/IKeyValueStorage.js +3 -0
- package/lib/app/types/ILinearStorage.d.ts +11 -0
- package/lib/app/types/ILinearStorage.js +3 -0
- package/lib/app/types/ILinearStorageRA.d.ts +13 -0
- package/lib/app/types/ILinearStorageRA.js +3 -0
- package/lib/app/types/ILinkedList.d.ts +4 -0
- package/lib/app/types/ILinkedList.js +3 -0
- package/lib/app/types/TypeArrayMatrix.d.ts +1 -0
- package/lib/app/types/TypeArrayMatrix.js +3 -0
- package/lib/app/utils.d.ts +37 -0
- package/lib/app/utils.js +114 -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/types.d.ts +16 -0
- package/lib/exports/types.js +34 -0
- package/lib/exports/utils.d.ts +3 -0
- package/lib/exports/utils.js +14 -0
- package/lib/exports.d.ts +53 -0
- package/lib/exports.js +105 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +5 -0
- package/package.json +11 -6
|
@@ -0,0 +1,67 @@
|
|
|
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("./createGraph");
|
|
6
|
+
var utils_1 = require("../../../utils");
|
|
7
|
+
var EnumRandomGenerationFormat_1 = require("../../../types/EnumRandomGenerationFormat");
|
|
8
|
+
var ValueOutOfRangeException_1 = require("../../../exceptions/ValueOutOfRangeException");
|
|
9
|
+
var getRandomVertex = function () {
|
|
10
|
+
return "_" + Math.random().toString(36).substr(2, 9);
|
|
11
|
+
};
|
|
12
|
+
var getPossibleEdgesCount = function (type, verticesCount) {
|
|
13
|
+
var possibleEdgesCount = verticesCount * (verticesCount - 1);
|
|
14
|
+
switch (type) {
|
|
15
|
+
case EnumGraphType_1.EnumGraphType.Directed: {
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
case EnumGraphType_1.EnumGraphType.Undirected: {
|
|
19
|
+
possibleEdgesCount = Math.floor(possibleEdgesCount / 2);
|
|
20
|
+
break;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return possibleEdgesCount;
|
|
24
|
+
};
|
|
25
|
+
var fillGraphRandomly = function (graph, format, verticesCount) {
|
|
26
|
+
switch (format) {
|
|
27
|
+
case EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Hash: {
|
|
28
|
+
for (var i = 0; i < verticesCount; i++) {
|
|
29
|
+
graph.addVertex(getRandomVertex());
|
|
30
|
+
}
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Numbers: {
|
|
34
|
+
for (var i = 0; i < verticesCount; i++) {
|
|
35
|
+
graph.addVertex((i + 1).toString());
|
|
36
|
+
}
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.generateRandomGraph = function (verticesCount, edgesCount, type, format) {
|
|
42
|
+
if (type === void 0) { type = EnumGraphType_1.EnumGraphType.Undirected; }
|
|
43
|
+
if (format === void 0) { format = EnumRandomGenerationFormat_1.EnumRandomGenerationFormat.Numbers; }
|
|
44
|
+
var graph = createGraph_1.createGraph(type);
|
|
45
|
+
var possibleEdgesCount = getPossibleEdgesCount(type, verticesCount);
|
|
46
|
+
if (edgesCount <= 0 || edgesCount > possibleEdgesCount) {
|
|
47
|
+
throw new ValueOutOfRangeException_1.default("Edges count must be in range between 0 and " + possibleEdgesCount);
|
|
48
|
+
}
|
|
49
|
+
fillGraphRandomly(graph, format, verticesCount);
|
|
50
|
+
var addedVertices = graph.vertices();
|
|
51
|
+
var addedEdgesCount = 0;
|
|
52
|
+
while (addedEdgesCount < edgesCount) {
|
|
53
|
+
var randomizeIndex = function () {
|
|
54
|
+
return utils_1.randomizeNumberInRange(0, addedVertices.length);
|
|
55
|
+
};
|
|
56
|
+
var randomVertexFrom = addedVertices[randomizeIndex()];
|
|
57
|
+
var randomVertexTo = addedVertices[randomizeIndex()];
|
|
58
|
+
var isEdgeAlreadyExists = graph.hasEdge(randomVertexFrom, randomVertexTo);
|
|
59
|
+
var isTheSameVertex = randomVertexFrom === randomVertexTo;
|
|
60
|
+
if (!isTheSameVertex && !isEdgeAlreadyExists) {
|
|
61
|
+
graph.addEdge(randomVertexFrom, randomVertexTo);
|
|
62
|
+
addedEdgesCount++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return graph;
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVSYW5kb21HcmFwaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1zdHJ1Y3R1cmVzL0dyYXBoL19oZWxwZXJzL2dlbmVyYXRlUmFuZG9tR3JhcGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsOERBQTZEO0FBQzdELDZDQUE0QztBQUM1Qyx3Q0FBd0Q7QUFDeEQsd0ZBQXVGO0FBQ3ZGLHlGQUFvRjtBQUVwRixJQUFNLGVBQWUsR0FBRztJQUN0QixPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdkQsQ0FBQyxDQUFDO0FBRUYsSUFBTSxxQkFBcUIsR0FBRyxVQUM1QixJQUFtQixFQUNuQixhQUFxQjtJQUVyQixJQUFJLGtCQUFrQixHQUFHLGFBQWEsR0FBRyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU3RCxRQUFRLElBQUksRUFBRTtRQUNaLEtBQUssNkJBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQixNQUFNO1NBQ1A7UUFDRCxLQUFLLDZCQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDN0Isa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBRUYsSUFBTSxpQkFBaUIsR0FBRyxVQUN4QixLQUFxQixFQUNyQixNQUFrQyxFQUNsQyxhQUFxQjtJQUVyQixRQUFRLE1BQU0sRUFBRTtRQUNkLEtBQUssdURBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDdEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2FBQ3BDO1lBQ0QsTUFBTTtTQUNQO1FBQ0QsS0FBSyx1REFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDckM7WUFDRCxNQUFNO1NBQ1A7S0FDRjtBQUNILENBQUMsQ0FBQztBQUVXLFFBQUEsbUJBQW1CLEdBQUcsVUFDakMsYUFBcUIsRUFDckIsVUFBa0IsRUFDbEIsSUFBOEMsRUFDOUMsTUFBdUU7SUFEdkUscUJBQUEsRUFBQSxPQUFzQiw2QkFBYSxDQUFDLFVBQVU7SUFDOUMsdUJBQUEsRUFBQSxTQUFxQyx1REFBMEIsQ0FBQyxPQUFPO0lBRXZFLElBQU0sS0FBSyxHQUFHLHlCQUFXLENBQVMsSUFBSSxDQUFDLENBQUM7SUFDeEMsSUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFdEUsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFVBQVUsR0FBRyxrQkFBa0IsRUFBRTtRQUN0RCxNQUFNLElBQUksa0NBQXdCLENBQ2hDLGdEQUE4QyxrQkFBb0IsQ0FDbkUsQ0FBQztLQUNIO0lBRUQsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRCxJQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdkMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLE9BQU8sZUFBZSxHQUFHLFVBQVUsRUFBRTtRQUNuQyxJQUFNLGNBQWMsR0FBRztZQUNyQixPQUFPLDhCQUFzQixDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0YsSUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFNLGNBQWMsR0FBRyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUV2RCxJQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDNUUsSUFBTSxlQUFlLEdBQUcsZ0JBQWdCLEtBQUssY0FBYyxDQUFDO1FBRTVELElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUM1QyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2hELGVBQWUsRUFBRSxDQUFDO1NBQ25CO0tBQ0Y7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQyJ9
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import IKeyValueStorage from "../../types/IKeyValueStorage";
|
|
2
|
+
/**
|
|
3
|
+
* Implementation of open addressing hash table using quadratic probing
|
|
4
|
+
*/
|
|
5
|
+
export default class HashTable<T> implements IKeyValueStorage<T> {
|
|
6
|
+
/**
|
|
7
|
+
Constants
|
|
8
|
+
*/
|
|
9
|
+
private static DEFAULT_MAX_CAPACITY;
|
|
10
|
+
private static MAX_LOAD_FACTOR;
|
|
11
|
+
/**
|
|
12
|
+
* State
|
|
13
|
+
*/
|
|
14
|
+
private storage;
|
|
15
|
+
private maxCapacity;
|
|
16
|
+
private storageCapacity;
|
|
17
|
+
/**
|
|
18
|
+
* Given init capacity size will be used
|
|
19
|
+
* @throws when initial capacity value is not larger than 0
|
|
20
|
+
*/
|
|
21
|
+
constructor(initialCapacity?: number);
|
|
22
|
+
/**
|
|
23
|
+
* Main-hash function
|
|
24
|
+
*/
|
|
25
|
+
private hashFn;
|
|
26
|
+
/**
|
|
27
|
+
* Helper-hash function
|
|
28
|
+
*/
|
|
29
|
+
private innerHashFn;
|
|
30
|
+
/**
|
|
31
|
+
* Max capacity will be increased and storage will be overwritten
|
|
32
|
+
*/
|
|
33
|
+
private resizeStorage;
|
|
34
|
+
/**
|
|
35
|
+
* Will find node instance by its key
|
|
36
|
+
* @throws when element does not exist
|
|
37
|
+
*/
|
|
38
|
+
private findNode;
|
|
39
|
+
/**
|
|
40
|
+
* Will create new node instance and set in to storage by index
|
|
41
|
+
*/
|
|
42
|
+
private addNode;
|
|
43
|
+
/**
|
|
44
|
+
* Will create new node instance and set in to storage by index
|
|
45
|
+
*/
|
|
46
|
+
private updateNode;
|
|
47
|
+
/**
|
|
48
|
+
* Will insert item to hash table
|
|
49
|
+
*/
|
|
50
|
+
set(key: string, data: T): void;
|
|
51
|
+
/**
|
|
52
|
+
* Will update item property isDeleted to false
|
|
53
|
+
* @throws when element does not exist
|
|
54
|
+
*/
|
|
55
|
+
delete(key: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Will find item in hash table
|
|
58
|
+
* @throws when element does not exist
|
|
59
|
+
*/
|
|
60
|
+
get(key: string): T;
|
|
61
|
+
/**
|
|
62
|
+
* Check if node with given key exists
|
|
63
|
+
*/
|
|
64
|
+
has(key: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Added elements count
|
|
67
|
+
*/
|
|
68
|
+
length(): number;
|
|
69
|
+
/**
|
|
70
|
+
* Will overwrite storage with array of null elements
|
|
71
|
+
*/
|
|
72
|
+
clear(): void;
|
|
73
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var HashTableNode_1 = require("./HashTableNode");
|
|
4
|
+
var ValueOutOfRangeException_1 = require("../../exceptions/ValueOutOfRangeException");
|
|
5
|
+
var IsNotFoundException_1 = require("../../exceptions/IsNotFoundException");
|
|
6
|
+
/**
|
|
7
|
+
* Implementation of open addressing hash table using quadratic probing
|
|
8
|
+
*/
|
|
9
|
+
var HashTable = /** @class */ (function () {
|
|
10
|
+
/**
|
|
11
|
+
* Given init capacity size will be used
|
|
12
|
+
* @throws when initial capacity value is not larger than 0
|
|
13
|
+
*/
|
|
14
|
+
function HashTable(initialCapacity) {
|
|
15
|
+
if (initialCapacity === void 0) { initialCapacity = HashTable.DEFAULT_MAX_CAPACITY; }
|
|
16
|
+
this.storageCapacity = 0;
|
|
17
|
+
if (initialCapacity <= 0) {
|
|
18
|
+
throw new ValueOutOfRangeException_1.default("Size must be larger than 0");
|
|
19
|
+
}
|
|
20
|
+
this.maxCapacity = initialCapacity;
|
|
21
|
+
this.storage = new Array(this.maxCapacity).fill(null);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Main-hash function
|
|
25
|
+
*/
|
|
26
|
+
HashTable.prototype.hashFn = function (key, number) {
|
|
27
|
+
return ((this.innerHashFn(key) + 127 * number + 365 * number * number) %
|
|
28
|
+
this.maxCapacity);
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Helper-hash function
|
|
32
|
+
*/
|
|
33
|
+
HashTable.prototype.innerHashFn = function (key) {
|
|
34
|
+
var length = key.length;
|
|
35
|
+
if (length === 0) {
|
|
36
|
+
return 0;
|
|
37
|
+
}
|
|
38
|
+
var substring = key.substring(0, length - 1);
|
|
39
|
+
var symbol = key.charCodeAt(length - 1);
|
|
40
|
+
return (127 * this.innerHashFn(substring) + symbol) % this.maxCapacity;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Max capacity will be increased and storage will be overwritten
|
|
44
|
+
*/
|
|
45
|
+
HashTable.prototype.resizeStorage = function () {
|
|
46
|
+
this.maxCapacity *= 2;
|
|
47
|
+
var newArray = new Array(this.maxCapacity).fill(null);
|
|
48
|
+
for (var i = 0; i < this.storage.length; i++) {
|
|
49
|
+
var element = this.storage[i];
|
|
50
|
+
if (element != null) {
|
|
51
|
+
for (var j = 0; j < this.maxCapacity; j++) {
|
|
52
|
+
var newIndex = this.hashFn(element.key, j);
|
|
53
|
+
if (newArray[newIndex] == null) {
|
|
54
|
+
newArray[newIndex] = element;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return newArray;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Will find node instance by its key
|
|
64
|
+
* @throws when element does not exist
|
|
65
|
+
*/
|
|
66
|
+
HashTable.prototype.findNode = function (key) {
|
|
67
|
+
for (var i = 0; i < this.maxCapacity; i++) {
|
|
68
|
+
var index = this.hashFn(key, i);
|
|
69
|
+
var node = this.storage[index];
|
|
70
|
+
if ((node === null || node === void 0 ? void 0 : node.key) === key) {
|
|
71
|
+
if (node === null || node === void 0 ? void 0 : node.isDeleted) {
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
return node;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
throw new IsNotFoundException_1.default("Element does not exist");
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Will create new node instance and set in to storage by index
|
|
81
|
+
*/
|
|
82
|
+
HashTable.prototype.addNode = function (key, data, index) {
|
|
83
|
+
this.storage[index] = new HashTableNode_1.default(key, data);
|
|
84
|
+
this.storageCapacity++;
|
|
85
|
+
var loadFactor = this.storageCapacity / this.maxCapacity;
|
|
86
|
+
if (loadFactor >= HashTable.MAX_LOAD_FACTOR) {
|
|
87
|
+
this.storage = this.resizeStorage();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Will create new node instance and set in to storage by index
|
|
92
|
+
*/
|
|
93
|
+
HashTable.prototype.updateNode = function (data, index) {
|
|
94
|
+
this.storage[index].data = data;
|
|
95
|
+
this.storage[index].isDeleted = false;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Will insert item to hash table
|
|
99
|
+
*/
|
|
100
|
+
HashTable.prototype.set = function (key, data) {
|
|
101
|
+
for (var i = 0; i < this.maxCapacity; i++) {
|
|
102
|
+
var index = this.hashFn(key, i);
|
|
103
|
+
var node = this.storage[index];
|
|
104
|
+
var shouldAddNode = node === null;
|
|
105
|
+
if (shouldAddNode) {
|
|
106
|
+
this.addNode(key, data, index);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
var shouldUpdateNode = node.key === key;
|
|
110
|
+
if (shouldUpdateNode) {
|
|
111
|
+
this.updateNode(data, index);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Will update item property isDeleted to false
|
|
118
|
+
* @throws when element does not exist
|
|
119
|
+
*/
|
|
120
|
+
HashTable.prototype.delete = function (key) {
|
|
121
|
+
for (var i = 0; i < this.maxCapacity; i++) {
|
|
122
|
+
var index = this.hashFn(key, i);
|
|
123
|
+
if (this.storage[index] !== null) {
|
|
124
|
+
this.storage[index].isDeleted = true;
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
throw new IsNotFoundException_1.default("Element does not exist");
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Will find item in hash table
|
|
132
|
+
* @throws when element does not exist
|
|
133
|
+
*/
|
|
134
|
+
HashTable.prototype.get = function (key) {
|
|
135
|
+
return this.findNode(key).data;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Check if node with given key exists
|
|
139
|
+
*/
|
|
140
|
+
HashTable.prototype.has = function (key) {
|
|
141
|
+
try {
|
|
142
|
+
return Boolean(this.findNode(key));
|
|
143
|
+
}
|
|
144
|
+
catch (e) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Added elements count
|
|
150
|
+
*/
|
|
151
|
+
HashTable.prototype.length = function () {
|
|
152
|
+
var actualItems = this.storage.filter(function (item) {
|
|
153
|
+
return item !== null && !item.isDeleted;
|
|
154
|
+
});
|
|
155
|
+
return actualItems.length;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Will overwrite storage with array of null elements
|
|
159
|
+
*/
|
|
160
|
+
HashTable.prototype.clear = function () {
|
|
161
|
+
this.storage = new Array(HashTable.DEFAULT_MAX_CAPACITY).fill(null);
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
Constants
|
|
165
|
+
*/
|
|
166
|
+
HashTable.DEFAULT_MAX_CAPACITY = 100;
|
|
167
|
+
HashTable.MAX_LOAD_FACTOR = 0.5;
|
|
168
|
+
return HashTable;
|
|
169
|
+
}());
|
|
170
|
+
exports.default = HashTable;
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaFRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLXN0cnVjdHVyZXMvSGFzaFRhYmxlL0hhc2hUYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLGlEQUE0QztBQUM1QyxzRkFBaUY7QUFDakYsNEVBQXVFO0FBRXZFOztHQUVHO0FBQ0g7SUFjRTs7O09BR0c7SUFDSCxtQkFBbUIsZUFBd0Q7UUFBeEQsZ0NBQUEsRUFBQSxrQkFBMEIsU0FBUyxDQUFDLG9CQUFvQjtRQU5uRSxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQU8xQixJQUFJLGVBQWUsSUFBSSxDQUFDLEVBQUU7WUFDeEIsTUFBTSxJQUFJLGtDQUF3QixDQUFDLDRCQUE0QixDQUFDLENBQUM7U0FDbEU7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLGVBQWUsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQU0sR0FBZCxVQUFlLEdBQVcsRUFBRSxNQUFjO1FBQ3hDLE9BQU8sQ0FDTCxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztZQUM5RCxJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssK0JBQVcsR0FBbkIsVUFBb0IsR0FBVztRQUM3QixJQUFNLE1BQU0sR0FBVyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBRWxDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNoQixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsSUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVB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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export default class HashTableNode<T> {
|
|
2
|
+
private readonly _key;
|
|
3
|
+
private _data;
|
|
4
|
+
private _isDeleted;
|
|
5
|
+
constructor(key: string, data: T);
|
|
6
|
+
get data(): T;
|
|
7
|
+
set data(value: T);
|
|
8
|
+
get key(): string;
|
|
9
|
+
get isDeleted(): boolean;
|
|
10
|
+
set isDeleted(value: boolean);
|
|
11
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
var HashTableNode = /** @class */ (function () {
|
|
4
|
+
function HashTableNode(key, data) {
|
|
5
|
+
this._key = key;
|
|
6
|
+
this._data = data;
|
|
7
|
+
this._isDeleted = false;
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(HashTableNode.prototype, "data", {
|
|
10
|
+
get: function () {
|
|
11
|
+
return this._data;
|
|
12
|
+
},
|
|
13
|
+
set: function (value) {
|
|
14
|
+
this._data = value;
|
|
15
|
+
},
|
|
16
|
+
enumerable: false,
|
|
17
|
+
configurable: true
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(HashTableNode.prototype, "key", {
|
|
20
|
+
get: function () {
|
|
21
|
+
return this._key;
|
|
22
|
+
},
|
|
23
|
+
enumerable: false,
|
|
24
|
+
configurable: true
|
|
25
|
+
});
|
|
26
|
+
Object.defineProperty(HashTableNode.prototype, "isDeleted", {
|
|
27
|
+
get: function () {
|
|
28
|
+
return this._isDeleted;
|
|
29
|
+
},
|
|
30
|
+
set: function (value) {
|
|
31
|
+
this._isDeleted = value;
|
|
32
|
+
},
|
|
33
|
+
enumerable: false,
|
|
34
|
+
configurable: true
|
|
35
|
+
});
|
|
36
|
+
return HashTableNode;
|
|
37
|
+
}());
|
|
38
|
+
exports.default = HashTableNode;
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGFzaFRhYmxlTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1zdHJ1Y3R1cmVzL0hhc2hUYWJsZS9IYXNoVGFibGVOb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7SUFLRSx1QkFBbUIsR0FBVyxFQUFFLElBQU87UUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDaEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUVELHNCQUFJLCtCQUFJO2FBQVI7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzthQUVELFVBQVMsS0FBUTtZQUNmLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLENBQUM7OztPQUpBO0lBTUQsc0JBQUksOEJBQUc7YUFBUDtZQUNFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztRQUNuQixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLG9DQUFTO2FBQWI7WUFDRSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsQ0FBQzthQUVELFVBQWMsS0FBYztZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDOzs7T0FKQTtJQUtILG9CQUFDO0FBQUQsQ0FBQyxBQTlCRCxJQThCQyJ9
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import AbstractLinkedNode from "./AbstractLinkedNode";
|
|
2
|
+
import ILinkedList from "../../../types/ILinkedList";
|
|
3
|
+
export default abstract class AbstractLinkedList<T> implements ILinkedList<T> {
|
|
4
|
+
protected readonly _capacity: number;
|
|
5
|
+
protected _length: number;
|
|
6
|
+
protected _head: AbstractLinkedNode<T> | null;
|
|
7
|
+
protected _tail: AbstractLinkedNode<T> | null;
|
|
8
|
+
/**
|
|
9
|
+
* Create empty instance
|
|
10
|
+
*/
|
|
11
|
+
protected constructor(capacity?: number);
|
|
12
|
+
/**
|
|
13
|
+
* Will calculate real capacity value
|
|
14
|
+
* @throws when capacity <= 0
|
|
15
|
+
*/
|
|
16
|
+
private static calculateCapacity;
|
|
17
|
+
/**
|
|
18
|
+
* Will insert node between nodeLeft and nodeRight
|
|
19
|
+
* @throws when list is full
|
|
20
|
+
*/
|
|
21
|
+
private insertNodeBetweenTwoNodes;
|
|
22
|
+
/**
|
|
23
|
+
* Will remove the node from its neighbors nodes links
|
|
24
|
+
* @throws when node does not exist
|
|
25
|
+
*/
|
|
26
|
+
private deleteNode;
|
|
27
|
+
/**
|
|
28
|
+
* Will find node by its index
|
|
29
|
+
* @throws when node was not found
|
|
30
|
+
*/
|
|
31
|
+
protected getNodeByIndex(index: number): AbstractLinkedNode<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Will set links between target, left and right siblings
|
|
34
|
+
*/
|
|
35
|
+
protected abstract insertNodeBetweenTwoNodesImpl(nodeToPush: AbstractLinkedNode<T>, nodeLeft: AbstractLinkedNode<T>, nodeRight: AbstractLinkedNode<T>): void;
|
|
36
|
+
/**
|
|
37
|
+
* Will unset itself links and its neighbors links
|
|
38
|
+
*/
|
|
39
|
+
protected abstract deleteNodeImpl(node: AbstractLinkedNode<T>): void;
|
|
40
|
+
/**
|
|
41
|
+
* Update head link
|
|
42
|
+
*/
|
|
43
|
+
protected abstract popImpl(): void;
|
|
44
|
+
/**
|
|
45
|
+
* Update tail link
|
|
46
|
+
*/
|
|
47
|
+
protected abstract shiftImpl(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Will create empty node instance
|
|
50
|
+
*/
|
|
51
|
+
protected abstract createNode(value: T): AbstractLinkedNode<T>;
|
|
52
|
+
/**
|
|
53
|
+
* Push into start
|
|
54
|
+
*/
|
|
55
|
+
unshift(value: T): void;
|
|
56
|
+
/**
|
|
57
|
+
* Push into end
|
|
58
|
+
*/
|
|
59
|
+
push(value: T): void;
|
|
60
|
+
/**
|
|
61
|
+
* Push from index
|
|
62
|
+
*/
|
|
63
|
+
pushFromIndex(value: T, fromIndex: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* Delete node from list's end
|
|
66
|
+
*/
|
|
67
|
+
pop(): T;
|
|
68
|
+
/**
|
|
69
|
+
* Delete node from list's start and get its data
|
|
70
|
+
*/
|
|
71
|
+
shift(): T;
|
|
72
|
+
/**
|
|
73
|
+
* Delete node from list by index from start
|
|
74
|
+
*/
|
|
75
|
+
deleteFromIndex(fromIndex: number): T;
|
|
76
|
+
/**
|
|
77
|
+
* List length
|
|
78
|
+
*/
|
|
79
|
+
length(): number;
|
|
80
|
+
/**
|
|
81
|
+
* Is list empty
|
|
82
|
+
*/
|
|
83
|
+
isEmpty(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Is list full
|
|
86
|
+
*/
|
|
87
|
+
isFull(): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Check if element exists in list
|
|
90
|
+
*/
|
|
91
|
+
has(item: T): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Get head element data
|
|
94
|
+
* @throws when head does not exist
|
|
95
|
+
*/
|
|
96
|
+
peek(): T;
|
|
97
|
+
/**
|
|
98
|
+
* Get tail element data
|
|
99
|
+
* @throws when tail does not exists
|
|
100
|
+
*/
|
|
101
|
+
peekFromStart(): T;
|
|
102
|
+
/**
|
|
103
|
+
* Get list element by index from start
|
|
104
|
+
* @throws when element does not exist
|
|
105
|
+
*/
|
|
106
|
+
peekByIndex(index: number): T;
|
|
107
|
+
/**
|
|
108
|
+
* Remove all elements from list
|
|
109
|
+
*/
|
|
110
|
+
clear(): void;
|
|
111
|
+
/**
|
|
112
|
+
* Get elements as an array
|
|
113
|
+
*/
|
|
114
|
+
getAsArray(): Array<T>;
|
|
115
|
+
/**
|
|
116
|
+
* Add elements to list from array
|
|
117
|
+
* @throws when list is full
|
|
118
|
+
* */
|
|
119
|
+
pushFromArray(elements: Array<T>): void;
|
|
120
|
+
/**
|
|
121
|
+
* Reverse list nodes links and swap head with tail
|
|
122
|
+
* @example "4>7>10" will be reversed to "10>7>4"
|
|
123
|
+
*/
|
|
124
|
+
abstract reverse(): void;
|
|
125
|
+
}
|