@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.
Files changed (184) hide show
  1. package/README.md +71 -88
  2. package/lib/app/algorithms/binary-search.d.ts +5 -0
  3. package/lib/app/algorithms/binary-search.js +27 -0
  4. package/lib/app/algorithms/factorial.d.ts +9 -0
  5. package/lib/app/algorithms/factorial.js +17 -0
  6. package/lib/app/algorithms/fibonacci.d.ts +9 -0
  7. package/lib/app/algorithms/fibonacci.js +17 -0
  8. package/lib/app/algorithms/graph/iterator/AbstractGraphIterator.d.ts +35 -0
  9. package/lib/app/algorithms/graph/iterator/AbstractGraphIterator.js +83 -0
  10. package/lib/app/algorithms/graph/iterator/GraphIteratorBFS.d.ts +28 -0
  11. package/lib/app/algorithms/graph/iterator/GraphIteratorBFS.js +70 -0
  12. package/lib/app/algorithms/graph/iterator/GraphIteratorDFS.d.ts +28 -0
  13. package/lib/app/algorithms/graph/iterator/GraphIteratorDFS.js +70 -0
  14. package/lib/app/algorithms/graph/iterator/GraphIteratorDijkstra.d.ts +32 -0
  15. package/lib/app/algorithms/graph/iterator/GraphIteratorDijkstra.js +97 -0
  16. package/lib/app/algorithms/graph/iterator-strategy/BFSIterationStrategy.d.ts +6 -0
  17. package/lib/app/algorithms/graph/iterator-strategy/BFSIterationStrategy.js +13 -0
  18. package/lib/app/algorithms/graph/iterator-strategy/DFSIterationStrategy.d.ts +6 -0
  19. package/lib/app/algorithms/graph/iterator-strategy/DFSIterationStrategy.js +13 -0
  20. package/lib/app/algorithms/graph/iterator-strategy/DijkstraIterationStrategy.d.ts +6 -0
  21. package/lib/app/algorithms/graph/iterator-strategy/DijkstraIterationStrategy.js +13 -0
  22. package/lib/app/algorithms/graph/presenter/presenterAdjacencyLists.d.ts +19 -0
  23. package/lib/app/algorithms/graph/presenter/presenterAdjacencyLists.js +28 -0
  24. package/lib/app/algorithms/graph/presenter/presenterAdjacencyMatrix.d.ts +32 -0
  25. package/lib/app/algorithms/graph/presenter/presenterAdjacencyMatrix.js +48 -0
  26. package/lib/app/algorithms/graph/searching/hasPath.d.ts +9 -0
  27. package/lib/app/algorithms/graph/searching/hasPath.js +30 -0
  28. package/lib/app/algorithms/graph/searching/shortestPath.d.ts +9 -0
  29. package/lib/app/algorithms/graph/searching/shortestPath.js +30 -0
  30. package/lib/app/algorithms/graph/transposing/transposeDirectedGraph.d.ts +2 -0
  31. package/lib/app/algorithms/graph/transposing/transposeDirectedGraph.js +14 -0
  32. package/lib/app/algorithms/memoize.d.ts +5 -0
  33. package/lib/app/algorithms/memoize.js +22 -0
  34. package/lib/app/algorithms/sorts/bubble-sort.d.ts +9 -0
  35. package/lib/app/algorithms/sorts/bubble-sort.js +23 -0
  36. package/lib/app/algorithms/sorts/insertion-sort.d.ts +9 -0
  37. package/lib/app/algorithms/sorts/insertion-sort.js +25 -0
  38. package/lib/app/algorithms/sorts/merge-sort.d.ts +9 -0
  39. package/lib/app/algorithms/sorts/merge-sort.js +61 -0
  40. package/lib/app/algorithms/sorts/quick-sort.d.ts +9 -0
  41. package/lib/app/algorithms/sorts/quick-sort.js +45 -0
  42. package/lib/app/algorithms/sorts/select-sort.d.ts +9 -0
  43. package/lib/app/algorithms/sorts/select-sort.js +20 -0
  44. package/lib/app/algorithms/transpose-matrix.d.ts +5 -0
  45. package/lib/app/algorithms/transpose-matrix.js +18 -0
  46. package/lib/app/constants.d.ts +2 -0
  47. package/lib/app/constants.js +6 -0
  48. package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.d.ts +15 -0
  49. package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryNode.js +53 -0
  50. package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.d.ts +60 -0
  51. package/lib/app/data-structures/BinaryTree/AbstractBinaryTree/AbstractBinaryTree.js +36 -0
  52. package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.d.ts +13 -0
  53. package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchNode.js +59 -0
  54. package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.d.ts +70 -0
  55. package/lib/app/data-structures/BinaryTree/BinarySearchTree/BinarySearchTree.js +271 -0
  56. package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.d.ts +16 -0
  57. package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchNode.js +70 -0
  58. package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.d.ts +57 -0
  59. package/lib/app/data-structures/BinaryTree/RandBinarySearchTree/RandBinarySearchTree.js +235 -0
  60. package/lib/app/data-structures/BinaryTree/_helpers/createBinaryTree.d.ts +6 -0
  61. package/lib/app/data-structures/BinaryTree/_helpers/createBinaryTree.js +22 -0
  62. package/lib/app/data-structures/Graph/AbstractGraph.d.ts +84 -0
  63. package/lib/app/data-structures/Graph/AbstractGraph.js +143 -0
  64. package/lib/app/data-structures/Graph/DirectedGraph.d.ts +24 -0
  65. package/lib/app/data-structures/Graph/DirectedGraph.js +86 -0
  66. package/lib/app/data-structures/Graph/GraphEdge.d.ts +16 -0
  67. package/lib/app/data-structures/Graph/GraphEdge.js +43 -0
  68. package/lib/app/data-structures/Graph/UndirectedGraph.d.ts +28 -0
  69. package/lib/app/data-structures/Graph/UndirectedGraph.js +103 -0
  70. package/lib/app/data-structures/Graph/_helpers/createGraph.d.ts +6 -0
  71. package/lib/app/data-structures/Graph/_helpers/createGraph.js +22 -0
  72. package/lib/app/data-structures/Graph/_helpers/createGraphFromMatrix.d.ts +7 -0
  73. package/lib/app/data-structures/Graph/_helpers/createGraphFromMatrix.js +42 -0
  74. package/lib/app/data-structures/Graph/_helpers/generateRandomGraph.d.ts +4 -0
  75. package/lib/app/data-structures/Graph/_helpers/generateRandomGraph.js +67 -0
  76. package/lib/app/data-structures/HashTable/HashTable.d.ts +73 -0
  77. package/lib/app/data-structures/HashTable/HashTable.js +171 -0
  78. package/lib/app/data-structures/HashTable/HashTableNode.d.ts +11 -0
  79. package/lib/app/data-structures/HashTable/HashTableNode.js +39 -0
  80. package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.d.ts +125 -0
  81. package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedList.js +241 -0
  82. package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.d.ts +20 -0
  83. package/lib/app/data-structures/LinkedList/AbstractLinkedList/AbstractLinkedNode.js +41 -0
  84. package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.d.ts +48 -0
  85. package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedList.js +151 -0
  86. package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.d.ts +25 -0
  87. package/lib/app/data-structures/LinkedList/DoubleLinkedList/DoubleLinkedNode.js +65 -0
  88. package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.d.ts +52 -0
  89. package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedList.js +138 -0
  90. package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.d.ts +7 -0
  91. package/lib/app/data-structures/LinkedList/SingleLinkedList/SingleLinkedNode.js +29 -0
  92. package/lib/app/data-structures/LinkedList/_helpers/createLinkedList.d.ts +3 -0
  93. package/lib/app/data-structures/LinkedList/_helpers/createLinkedList.js +19 -0
  94. package/lib/app/data-structures/LoopedArray/LoopedArray.d.ts +83 -0
  95. package/lib/app/data-structures/LoopedArray/LoopedArray.js +169 -0
  96. package/lib/app/data-structures/Queue/Queue.d.ts +50 -0
  97. package/lib/app/data-structures/Queue/Queue.js +85 -0
  98. package/lib/app/data-structures/Stack/Stack.d.ts +50 -0
  99. package/lib/app/data-structures/Stack/Stack.js +85 -0
  100. package/lib/app/exceptions/CollectionIsEmptyException.d.ts +4 -0
  101. package/lib/app/exceptions/CollectionIsEmptyException.js +28 -0
  102. package/lib/app/exceptions/CollectionIsFullException.d.ts +4 -0
  103. package/lib/app/exceptions/CollectionIsFullException.js +28 -0
  104. package/lib/app/exceptions/IndexOutOfBoundsException.d.ts +4 -0
  105. package/lib/app/exceptions/IndexOutOfBoundsException.js +28 -0
  106. package/lib/app/exceptions/IsAlreadyExistsException.d.ts +4 -0
  107. package/lib/app/exceptions/IsAlreadyExistsException.js +28 -0
  108. package/lib/app/exceptions/IsNotFoundException.d.ts +4 -0
  109. package/lib/app/exceptions/IsNotFoundException.js +28 -0
  110. package/lib/app/exceptions/ValueOutOfRangeException.d.ts +4 -0
  111. package/lib/app/exceptions/ValueOutOfRangeException.js +28 -0
  112. package/lib/app/exceptions/base/IllegalArgumentException.d.ts +3 -0
  113. package/lib/app/exceptions/base/IllegalArgumentException.js +27 -0
  114. package/lib/app/exceptions/base/IllegalStateException.d.ts +3 -0
  115. package/lib/app/exceptions/base/IllegalStateException.js +27 -0
  116. package/lib/app/types/EnumBinarySearchTreeType.d.ts +4 -0
  117. package/lib/app/types/EnumBinarySearchTreeType.js +9 -0
  118. package/lib/app/types/EnumGraphTraversalType.d.ts +5 -0
  119. package/lib/app/types/EnumGraphTraversalType.js +10 -0
  120. package/lib/app/types/EnumGraphType.d.ts +4 -0
  121. package/lib/app/types/EnumGraphType.js +9 -0
  122. package/lib/app/types/EnumLinkedListType.d.ts +4 -0
  123. package/lib/app/types/EnumLinkedListType.js +9 -0
  124. package/lib/app/types/EnumRandomGenerationFormat.d.ts +4 -0
  125. package/lib/app/types/EnumRandomGenerationFormat.js +9 -0
  126. package/lib/app/types/EnumSortType.d.ts +7 -0
  127. package/lib/app/types/EnumSortType.js +12 -0
  128. package/lib/app/types/EnumTreeTraversalType.d.ts +5 -0
  129. package/lib/app/types/EnumTreeTraversalType.js +10 -0
  130. package/lib/app/types/FnCompareTwo.d.ts +1 -0
  131. package/lib/app/types/FnCompareTwo.js +3 -0
  132. package/lib/app/types/FnToMemoize.d.ts +1 -0
  133. package/lib/app/types/FnToMemoize.js +3 -0
  134. package/lib/app/types/IArrayFacade.d.ts +4 -0
  135. package/lib/app/types/IArrayFacade.js +3 -0
  136. package/lib/app/types/IBiDirectIterable.d.ts +5 -0
  137. package/lib/app/types/IBiDirectIterable.js +3 -0
  138. package/lib/app/types/IBiDirectIterator.d.ts +11 -0
  139. package/lib/app/types/IBiDirectIterator.js +3 -0
  140. package/lib/app/types/IBinaryTree.d.ts +12 -0
  141. package/lib/app/types/IBinaryTree.js +3 -0
  142. package/lib/app/types/IConvertableToArray.d.ts +4 -0
  143. package/lib/app/types/IConvertableToArray.js +3 -0
  144. package/lib/app/types/IGraph.d.ts +14 -0
  145. package/lib/app/types/IGraph.js +3 -0
  146. package/lib/app/types/IGraphIterationStrategy.d.ts +5 -0
  147. package/lib/app/types/IGraphIterationStrategy.js +3 -0
  148. package/lib/app/types/IGraphIterator.d.ts +11 -0
  149. package/lib/app/types/IGraphIterator.js +3 -0
  150. package/lib/app/types/IIterable.d.ts +4 -0
  151. package/lib/app/types/IIterable.js +3 -0
  152. package/lib/app/types/IIterator.d.ts +14 -0
  153. package/lib/app/types/IIterator.js +3 -0
  154. package/lib/app/types/IKeyValueStorage.d.ts +8 -0
  155. package/lib/app/types/IKeyValueStorage.js +3 -0
  156. package/lib/app/types/ILinearStorage.d.ts +11 -0
  157. package/lib/app/types/ILinearStorage.js +3 -0
  158. package/lib/app/types/ILinearStorageRA.d.ts +13 -0
  159. package/lib/app/types/ILinearStorageRA.js +3 -0
  160. package/lib/app/types/ILinkedList.d.ts +4 -0
  161. package/lib/app/types/ILinkedList.js +3 -0
  162. package/lib/app/types/TypeArrayMatrix.d.ts +1 -0
  163. package/lib/app/types/TypeArrayMatrix.js +3 -0
  164. package/lib/app/utils.d.ts +37 -0
  165. package/lib/app/utils.js +114 -0
  166. package/lib/exports/algorithms.d.ts +16 -0
  167. package/lib/exports/algorithms.js +36 -0
  168. package/lib/exports/constants.d.ts +2 -0
  169. package/lib/exports/constants.js +7 -0
  170. package/lib/exports/data-structures.d.ts +11 -0
  171. package/lib/exports/data-structures.js +24 -0
  172. package/lib/exports/helpers.d.ts +6 -0
  173. package/lib/exports/helpers.js +14 -0
  174. package/lib/exports/sorts.d.ts +6 -0
  175. package/lib/exports/sorts.js +14 -0
  176. package/lib/exports/types.d.ts +16 -0
  177. package/lib/exports/types.js +34 -0
  178. package/lib/exports/utils.d.ts +3 -0
  179. package/lib/exports/utils.js +14 -0
  180. package/lib/exports.d.ts +53 -0
  181. package/lib/exports.js +105 -0
  182. package/lib/index.d.ts +3 -0
  183. package/lib/index.js +5 -0
  184. 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
+ }