data-structure-typed 2.0.5 → 2.1.0
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/CHANGELOG.md +1 -1
- package/COMMANDS.md +17 -0
- package/benchmark/report.html +13 -77
- package/benchmark/report.json +145 -177
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +186 -83
- package/dist/cjs/data-structures/base/iterable-element-base.js +149 -107
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/cjs/data-structures/base/iterable-entry-base.d.ts +95 -119
- package/dist/cjs/data-structures/base/iterable-entry-base.js +59 -116
- package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/cjs/data-structures/base/linear-base.d.ts +250 -192
- package/dist/cjs/data-structures/base/linear-base.js +137 -274
- package/dist/cjs/data-structures/base/linear-base.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.d.ts +126 -158
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js +171 -205
- package/dist/cjs/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +100 -69
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +135 -87
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +138 -149
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +208 -195
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +476 -632
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +594 -865
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +258 -306
- package/dist/cjs/data-structures/binary-tree/bst.js +505 -481
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +107 -179
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js +114 -209
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-counter.d.ts +132 -154
- package/dist/cjs/data-structures/binary-tree/tree-counter.js +172 -203
- package/dist/cjs/data-structures/binary-tree/tree-counter.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +72 -69
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -85
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +238 -233
- package/dist/cjs/data-structures/graph/abstract-graph.js +267 -237
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +108 -224
- package/dist/cjs/data-structures/graph/directed-graph.js +146 -233
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +49 -55
- package/dist/cjs/data-structures/graph/map-graph.js +56 -59
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +103 -146
- package/dist/cjs/data-structures/graph/undirected-graph.js +129 -149
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +164 -338
- package/dist/cjs/data-structures/hash/hash-map.js +270 -457
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +214 -289
- package/dist/cjs/data-structures/heap/heap.js +340 -349
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.d.ts +11 -47
- package/dist/cjs/data-structures/heap/max-heap.js +11 -66
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.d.ts +12 -47
- package/dist/cjs/data-structures/heap/min-heap.js +11 -66
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +231 -347
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +368 -494
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.d.ts +261 -310
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +447 -466
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/skip-linked-list.d.ts +0 -107
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js +0 -100
- package/dist/cjs/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +12 -56
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +11 -78
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +11 -57
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +10 -79
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +2 -61
- package/dist/cjs/data-structures/priority-queue/priority-queue.js +8 -83
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +227 -254
- package/dist/cjs/data-structures/queue/deque.js +309 -348
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +180 -201
- package/dist/cjs/data-structures/queue/queue.js +265 -248
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +124 -102
- package/dist/cjs/data-structures/stack/stack.js +181 -125
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +164 -165
- package/dist/cjs/data-structures/trie/trie.js +189 -172
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +56 -6
- package/dist/cjs/interfaces/graph.d.ts +16 -0
- package/dist/cjs/types/data-structures/base/base.d.ts +1 -1
- package/dist/cjs/types/data-structures/graph/abstract-graph.d.ts +4 -0
- package/dist/cjs/types/utils/utils.d.ts +1 -0
- package/dist/cjs/utils/utils.d.ts +1 -1
- package/dist/cjs/utils/utils.js +2 -1
- package/dist/cjs/utils/utils.js.map +1 -1
- package/dist/esm/data-structures/base/iterable-element-base.d.ts +186 -83
- package/dist/esm/data-structures/base/iterable-element-base.js +155 -107
- package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/esm/data-structures/base/iterable-entry-base.d.ts +95 -119
- package/dist/esm/data-structures/base/iterable-entry-base.js +59 -116
- package/dist/esm/data-structures/base/iterable-entry-base.js.map +1 -1
- package/dist/esm/data-structures/base/linear-base.d.ts +250 -192
- package/dist/esm/data-structures/base/linear-base.js +137 -274
- package/dist/esm/data-structures/base/linear-base.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.d.ts +126 -158
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.js +171 -212
- package/dist/esm/data-structures/binary-tree/avl-tree-counter.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +100 -69
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +133 -94
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +138 -149
- package/dist/esm/data-structures/binary-tree/avl-tree.js +206 -200
- package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +476 -632
- package/dist/esm/data-structures/binary-tree/binary-tree.js +598 -874
- package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/bst.d.ts +258 -306
- package/dist/esm/data-structures/binary-tree/bst.js +507 -487
- package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +107 -179
- package/dist/esm/data-structures/binary-tree/red-black-tree.js +114 -215
- package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/tree-counter.d.ts +132 -154
- package/dist/esm/data-structures/binary-tree/tree-counter.js +175 -209
- package/dist/esm/data-structures/binary-tree/tree-counter.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +72 -69
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js +103 -92
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/graph/abstract-graph.d.ts +238 -233
- package/dist/esm/data-structures/graph/abstract-graph.js +267 -237
- package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/esm/data-structures/graph/directed-graph.d.ts +108 -224
- package/dist/esm/data-structures/graph/directed-graph.js +145 -233
- package/dist/esm/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/esm/data-structures/graph/map-graph.d.ts +49 -55
- package/dist/esm/data-structures/graph/map-graph.js +56 -59
- package/dist/esm/data-structures/graph/map-graph.js.map +1 -1
- package/dist/esm/data-structures/graph/undirected-graph.d.ts +103 -146
- package/dist/esm/data-structures/graph/undirected-graph.js +128 -149
- package/dist/esm/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/esm/data-structures/hash/hash-map.d.ts +164 -338
- package/dist/esm/data-structures/hash/hash-map.js +270 -457
- package/dist/esm/data-structures/hash/hash-map.js.map +1 -1
- package/dist/esm/data-structures/heap/heap.d.ts +214 -289
- package/dist/esm/data-structures/heap/heap.js +329 -349
- package/dist/esm/data-structures/heap/heap.js.map +1 -1
- package/dist/esm/data-structures/heap/max-heap.d.ts +11 -47
- package/dist/esm/data-structures/heap/max-heap.js +11 -66
- package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
- package/dist/esm/data-structures/heap/min-heap.d.ts +12 -47
- package/dist/esm/data-structures/heap/min-heap.js +11 -66
- package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
- package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +231 -347
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js +368 -495
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +261 -310
- package/dist/esm/data-structures/linked-list/singly-linked-list.js +448 -467
- package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/linked-list/skip-linked-list.d.ts +0 -107
- package/dist/esm/data-structures/linked-list/skip-linked-list.js +0 -100
- package/dist/esm/data-structures/linked-list/skip-linked-list.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +12 -56
- package/dist/esm/data-structures/priority-queue/max-priority-queue.js +11 -78
- package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +11 -57
- package/dist/esm/data-structures/priority-queue/min-priority-queue.js +10 -79
- package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -61
- package/dist/esm/data-structures/priority-queue/priority-queue.js +8 -83
- package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/esm/data-structures/queue/deque.d.ts +227 -254
- package/dist/esm/data-structures/queue/deque.js +313 -348
- package/dist/esm/data-structures/queue/deque.js.map +1 -1
- package/dist/esm/data-structures/queue/queue.d.ts +180 -201
- package/dist/esm/data-structures/queue/queue.js +263 -248
- package/dist/esm/data-structures/queue/queue.js.map +1 -1
- package/dist/esm/data-structures/stack/stack.d.ts +124 -102
- package/dist/esm/data-structures/stack/stack.js +181 -125
- package/dist/esm/data-structures/stack/stack.js.map +1 -1
- package/dist/esm/data-structures/trie/trie.d.ts +164 -165
- package/dist/esm/data-structures/trie/trie.js +193 -172
- package/dist/esm/data-structures/trie/trie.js.map +1 -1
- package/dist/esm/interfaces/binary-tree.d.ts +56 -6
- package/dist/esm/interfaces/graph.d.ts +16 -0
- package/dist/esm/types/data-structures/base/base.d.ts +1 -1
- package/dist/esm/types/data-structures/graph/abstract-graph.d.ts +4 -0
- package/dist/esm/types/utils/utils.d.ts +1 -0
- package/dist/esm/utils/utils.d.ts +1 -1
- package/dist/esm/utils/utils.js +2 -1
- package/dist/esm/utils/utils.js.map +1 -1
- package/dist/umd/data-structure-typed.js +4685 -6477
- package/dist/umd/data-structure-typed.min.js +8 -6
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +3 -4
- package/src/data-structures/base/iterable-element-base.ts +238 -115
- package/src/data-structures/base/iterable-entry-base.ts +96 -120
- package/src/data-structures/base/linear-base.ts +271 -277
- package/src/data-structures/binary-tree/avl-tree-counter.ts +198 -216
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +192 -101
- package/src/data-structures/binary-tree/avl-tree.ts +239 -206
- package/src/data-structures/binary-tree/binary-tree.ts +660 -889
- package/src/data-structures/binary-tree/bst.ts +568 -570
- package/src/data-structures/binary-tree/red-black-tree.ts +161 -222
- package/src/data-structures/binary-tree/tree-counter.ts +199 -218
- package/src/data-structures/binary-tree/tree-multi-map.ts +131 -97
- package/src/data-structures/graph/abstract-graph.ts +339 -264
- package/src/data-structures/graph/directed-graph.ts +146 -236
- package/src/data-structures/graph/map-graph.ts +63 -60
- package/src/data-structures/graph/undirected-graph.ts +129 -152
- package/src/data-structures/hash/hash-map.ts +274 -496
- package/src/data-structures/heap/heap.ts +389 -402
- package/src/data-structures/heap/max-heap.ts +12 -76
- package/src/data-structures/heap/min-heap.ts +13 -76
- package/src/data-structures/linked-list/doubly-linked-list.ts +426 -530
- package/src/data-structures/linked-list/singly-linked-list.ts +495 -517
- package/src/data-structures/linked-list/skip-linked-list.ts +1 -108
- package/src/data-structures/priority-queue/max-priority-queue.ts +12 -87
- package/src/data-structures/priority-queue/min-priority-queue.ts +11 -88
- package/src/data-structures/priority-queue/priority-queue.ts +3 -92
- package/src/data-structures/queue/deque.ts +381 -357
- package/src/data-structures/queue/queue.ts +310 -264
- package/src/data-structures/stack/stack.ts +217 -131
- package/src/data-structures/trie/trie.ts +240 -175
- package/src/interfaces/binary-tree.ts +240 -6
- package/src/interfaces/graph.ts +37 -0
- package/src/types/data-structures/base/base.ts +5 -5
- package/src/types/data-structures/graph/abstract-graph.ts +5 -0
- package/src/types/utils/utils.ts +2 -0
- package/src/utils/utils.ts +9 -14
- package/test/integration/index.html +1 -1
- package/test/performance/benchmark-runner.ts +528 -0
- package/test/performance/reportor.mjs +43 -43
- package/test/performance/runner-config.json +39 -0
- package/test/performance/single-suite-runner.ts +69 -0
- package/test/unit/data-structures/binary-tree/avl-tree-counter.test.ts +3 -3
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +5 -5
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +4 -4
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +350 -90
- package/test/unit/data-structures/binary-tree/bst.test.ts +12 -9
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/tree-counter.test.ts +25 -24
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +3 -3
- package/test/unit/data-structures/graph/abstract-graph.test.ts +0 -4
- package/test/unit/data-structures/graph/directed-graph.test.ts +1 -1
- package/test/unit/data-structures/heap/heap.test.ts +14 -21
- package/test/unit/data-structures/heap/max-heap.test.ts +5 -9
- package/test/unit/data-structures/heap/min-heap.test.ts +1 -4
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +14 -14
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +0 -7
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +8 -11
- package/test/unit/data-structures/priority-queue/min-priority-queue.test.ts +1 -4
- package/test/unit/data-structures/priority-queue/priority-queue.test.ts +1 -4
- package/test/unit/data-structures/queue/queue.test.ts +4 -5
- package/test/unit/utils/utils.test.ts +0 -1
- package/test/performance/data-structures/binary-tree/avl-tree.test.mjs +0 -71
- package/test/performance/data-structures/binary-tree/red-black-tree.test.mjs +0 -81
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BST, BSTNode, Range } from '../../../../src';
|
|
1
|
+
import { BinaryTreeNode, BST, BSTNode, IBinaryTree, Range } from '../../../../src';
|
|
2
2
|
import { isDebugTest, isTestStackOverflow, SYSTEM_MAX_CALL_STACK } from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
@@ -331,8 +331,7 @@ describe('BST operations test', () => {
|
|
|
331
331
|
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
332
332
|
|
|
333
333
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
334
|
-
|
|
335
|
-
expect(node15 && objBST.getHeight(node15)).toBe(2);
|
|
334
|
+
expect(node15 && objBST.getHeight(node15)).toBe(1);
|
|
336
335
|
|
|
337
336
|
const removed1 = objBST.delete(1);
|
|
338
337
|
expect(removed1).toBeInstanceOf(Array);
|
|
@@ -775,7 +774,7 @@ describe('BST operations test recursively', () => {
|
|
|
775
774
|
|
|
776
775
|
expect(objBST.isAVLBalanced()).toBe(true);
|
|
777
776
|
|
|
778
|
-
expect(node15 && objBST.getHeight(node15)).toBe(
|
|
777
|
+
expect(node15 && objBST.getHeight(node15)).toBe(1);
|
|
779
778
|
|
|
780
779
|
const removed1 = objBST.delete(1);
|
|
781
780
|
expect(removed1).toBeInstanceOf(Array);
|
|
@@ -932,7 +931,7 @@ describe('BST operations test recursively', () => {
|
|
|
932
931
|
});
|
|
933
932
|
|
|
934
933
|
it('should the clone method', () => {
|
|
935
|
-
function checkTreeStructure(bst:
|
|
934
|
+
function checkTreeStructure(bst: IBinaryTree<string, number>) {
|
|
936
935
|
expect(bst.size).toBe(4);
|
|
937
936
|
expect(bst.root?.key).toBe('2');
|
|
938
937
|
expect(bst.root?.left?.key).toBe('1');
|
|
@@ -1540,13 +1539,13 @@ describe('BST iterative methods not map mode test', () => {
|
|
|
1540
1539
|
describe('BST constructor and comparator edge cases', () => {
|
|
1541
1540
|
it('should support specifyComparable and isReverse', () => {
|
|
1542
1541
|
const bst = new BST<number>([], {
|
|
1543
|
-
specifyComparable:
|
|
1542
|
+
specifyComparable: k => -k,
|
|
1544
1543
|
isReverse: true
|
|
1545
1544
|
});
|
|
1546
1545
|
bst.add(1);
|
|
1547
1546
|
bst.add(2);
|
|
1548
1547
|
expect(bst.isReverse).toBe(true);
|
|
1549
|
-
expect(bst[
|
|
1548
|
+
expect(bst['_specifyComparable']).toBeDefined();
|
|
1550
1549
|
expect([...bst.keys()]).toEqual([2, 1]);
|
|
1551
1550
|
});
|
|
1552
1551
|
|
|
@@ -1563,7 +1562,11 @@ describe('BST addMany edge cases', () => {
|
|
|
1563
1562
|
const values = ['a', 'b', 'c'];
|
|
1564
1563
|
const result = bst.addMany(keys, values);
|
|
1565
1564
|
expect(result).toEqual([true, true, true]);
|
|
1566
|
-
expect([...bst]).toEqual([
|
|
1565
|
+
expect([...bst]).toEqual([
|
|
1566
|
+
[1, 'a'],
|
|
1567
|
+
[2, 'b'],
|
|
1568
|
+
[3, 'c']
|
|
1569
|
+
]);
|
|
1567
1570
|
});
|
|
1568
1571
|
|
|
1569
1572
|
it('should addMany with isBalanceAdd=false', () => {
|
|
@@ -1608,7 +1611,7 @@ describe('BST _keyValueNodeOrEntryToNodeAndValue edge', () => {
|
|
|
1608
1611
|
it('should return [undefined, undefined] for null', () => {
|
|
1609
1612
|
const bst = new BST<number>();
|
|
1610
1613
|
// @ts-ignore
|
|
1611
|
-
const result = bst[
|
|
1614
|
+
const result = bst['_keyValueNodeOrEntryToNodeAndValue'](null);
|
|
1612
1615
|
expect(result).toEqual([undefined, undefined]);
|
|
1613
1616
|
});
|
|
1614
1617
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BSTNode, RedBlackTree, RedBlackTreeNode } from '../../../../src';
|
|
1
|
+
import { BinaryTreeNode, BSTNode, IBinaryTree, RedBlackTree, RedBlackTreeNode } from '../../../../src';
|
|
2
2
|
import { getRandomInt, getRandomIntArray, magnitude } from '../../../utils';
|
|
3
3
|
import { OrderedMap } from 'js-sdsl';
|
|
4
4
|
|
|
@@ -148,7 +148,7 @@ describe('RedBlackTree 1', () => {
|
|
|
148
148
|
});
|
|
149
149
|
|
|
150
150
|
it('should the clone method', () => {
|
|
151
|
-
function checkTreeStructure(rbTree:
|
|
151
|
+
function checkTreeStructure(rbTree: IBinaryTree<string, number>) {
|
|
152
152
|
expect(rbTree.size).toBe(4);
|
|
153
153
|
expect(rbTree.root?.key).toBe('2');
|
|
154
154
|
expect(rbTree.root?.left?.key).toBe('1');
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BSTNode, RedBlackTreeNode, TreeCounter, TreeCounterNode } from '../../../../src';
|
|
1
|
+
import { BinaryTreeNode, BSTNode, IBinaryTree, RedBlackTreeNode, TreeCounter, TreeCounterNode } from '../../../../src';
|
|
2
2
|
import { isDebugTest } from '../../../config';
|
|
3
3
|
import { getRandomInt } from '../../../utils';
|
|
4
4
|
|
|
@@ -172,12 +172,12 @@ describe('TreeCounter operations test1', () => {
|
|
|
172
172
|
expect(dfsInorderNodes[dfsInorderNodes.length - 1].key).toBe(16);
|
|
173
173
|
expect(treeCounter.isPerfectlyBalanced()).toBe(false);
|
|
174
174
|
treeCounter.perfectlyBalance();
|
|
175
|
-
expect(treeCounter.isPerfectlyBalanced()).toBe(
|
|
175
|
+
expect(treeCounter.isPerfectlyBalanced()).toBe(true);
|
|
176
176
|
|
|
177
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
177
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
178
178
|
|
|
179
179
|
const bfsNodesAfterBalanced = treeCounter.bfs(node => node);
|
|
180
|
-
expect(bfsNodesAfterBalanced[0].key).toBe(
|
|
180
|
+
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
181
181
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
182
182
|
|
|
183
183
|
const removed11 = treeCounter.delete(11, true);
|
|
@@ -187,7 +187,7 @@ describe('TreeCounter operations test1', () => {
|
|
|
187
187
|
|
|
188
188
|
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
189
189
|
|
|
190
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
190
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
191
191
|
|
|
192
192
|
expect(treeCounter.getHeight(15)).toBe(1);
|
|
193
193
|
|
|
@@ -197,9 +197,9 @@ describe('TreeCounter operations test1', () => {
|
|
|
197
197
|
expect(removed1[0].deleted);
|
|
198
198
|
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
199
199
|
|
|
200
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
200
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
201
201
|
|
|
202
|
-
expect(treeCounter.getHeight()).toBe(
|
|
202
|
+
expect(treeCounter.getHeight()).toBe(4);
|
|
203
203
|
|
|
204
204
|
const removed4 = treeCounter.delete(4, true);
|
|
205
205
|
expect(removed4 instanceof Array);
|
|
@@ -207,8 +207,8 @@ describe('TreeCounter operations test1', () => {
|
|
|
207
207
|
expect(removed4[0].deleted);
|
|
208
208
|
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
209
209
|
|
|
210
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
211
|
-
expect(treeCounter.getHeight()).toBe(
|
|
210
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
211
|
+
expect(treeCounter.getHeight()).toBe(4);
|
|
212
212
|
|
|
213
213
|
const removed10 = treeCounter.delete(10, true);
|
|
214
214
|
expect(removed10 instanceof Array);
|
|
@@ -225,7 +225,7 @@ describe('TreeCounter operations test1', () => {
|
|
|
225
225
|
expect(removed15[0].deleted);
|
|
226
226
|
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
227
227
|
|
|
228
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
228
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
229
229
|
expect(treeCounter.getHeight()).toBe(3);
|
|
230
230
|
|
|
231
231
|
const removed5 = treeCounter.delete(5, true);
|
|
@@ -250,7 +250,7 @@ describe('TreeCounter operations test1', () => {
|
|
|
250
250
|
expect(removed3[0]);
|
|
251
251
|
expect(removed3[0].deleted);
|
|
252
252
|
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
253
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
253
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
254
254
|
expect(treeCounter.getHeight()).toBe(3);
|
|
255
255
|
|
|
256
256
|
const removed8 = treeCounter.delete(8, true);
|
|
@@ -440,11 +440,11 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
440
440
|
|
|
441
441
|
treeCounter.perfectlyBalance();
|
|
442
442
|
|
|
443
|
-
expect(treeCounter.isPerfectlyBalanced()).toBe(
|
|
444
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
443
|
+
expect(treeCounter.isPerfectlyBalanced()).toBe(true);
|
|
444
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
445
445
|
|
|
446
446
|
const bfsNodesAfterBalanced = treeCounter.bfs(node => node);
|
|
447
|
-
expect(bfsNodesAfterBalanced[0].key).toBe(
|
|
447
|
+
expect(bfsNodesAfterBalanced[0].key).toBe(8);
|
|
448
448
|
expect(bfsNodesAfterBalanced[bfsNodesAfterBalanced.length - 1].key).toBe(16);
|
|
449
449
|
|
|
450
450
|
const removed11 = treeCounter.delete(11, true);
|
|
@@ -454,7 +454,7 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
454
454
|
|
|
455
455
|
if (removed11[0].deleted) expect(removed11[0].deleted.key).toBe(11);
|
|
456
456
|
|
|
457
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
457
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
458
458
|
|
|
459
459
|
expect(treeCounter.getHeight(15)).toBe(1);
|
|
460
460
|
|
|
@@ -463,10 +463,9 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
463
463
|
expect(removed1[0]);
|
|
464
464
|
expect(removed1[0].deleted);
|
|
465
465
|
if (removed1[0].deleted) expect(removed1[0].deleted.key).toBe(1);
|
|
466
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
466
467
|
|
|
467
|
-
expect(treeCounter.
|
|
468
|
-
|
|
469
|
-
expect(treeCounter.getHeight()).toBe(5);
|
|
468
|
+
expect(treeCounter.getHeight()).toBe(4);
|
|
470
469
|
|
|
471
470
|
const removed4 = treeCounter.delete(4, true);
|
|
472
471
|
expect(removed4 instanceof Array);
|
|
@@ -474,8 +473,8 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
474
473
|
expect(removed4[0].deleted);
|
|
475
474
|
if (removed4[0].deleted) expect(removed4[0].deleted.key).toBe(4);
|
|
476
475
|
|
|
477
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
478
|
-
expect(treeCounter.getHeight()).toBe(
|
|
476
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
477
|
+
expect(treeCounter.getHeight()).toBe(4);
|
|
479
478
|
|
|
480
479
|
const removed10 = treeCounter.delete(10, true);
|
|
481
480
|
expect(removed10 instanceof Array);
|
|
@@ -492,7 +491,7 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
492
491
|
expect(removed15[0].deleted);
|
|
493
492
|
if (removed15[0].deleted) expect(removed15[0].deleted.key).toBe(15);
|
|
494
493
|
|
|
495
|
-
expect(treeCounter.isAVLBalanced()).toBe(
|
|
494
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
496
495
|
expect(treeCounter.getHeight()).toBe(3);
|
|
497
496
|
|
|
498
497
|
const removed5 = treeCounter.delete(5, true);
|
|
@@ -517,7 +516,8 @@ describe('TreeCounter operations test recursively1', () => {
|
|
|
517
516
|
expect(removed3[0]);
|
|
518
517
|
expect(removed3[0].deleted);
|
|
519
518
|
if (removed3[0].deleted) expect(removed3[0].deleted.key).toBe(3);
|
|
520
|
-
|
|
519
|
+
|
|
520
|
+
expect(treeCounter.isAVLBalanced()).toBe(true);
|
|
521
521
|
expect(treeCounter.getHeight()).toBe(3);
|
|
522
522
|
|
|
523
523
|
const removed8 = treeCounter.delete(8, true);
|
|
@@ -709,7 +709,7 @@ describe('TreeCounter delete test', function () {
|
|
|
709
709
|
});
|
|
710
710
|
|
|
711
711
|
it('should the clone method', () => {
|
|
712
|
-
function checkTreeStructure(treeCounter:
|
|
712
|
+
function checkTreeStructure(treeCounter: IBinaryTree<string, number>) {
|
|
713
713
|
expect(treeCounter.size).toBe(4);
|
|
714
714
|
expect(treeCounter.root?.key).toBe('2');
|
|
715
715
|
expect(treeCounter.root?.left?.key).toBe('1');
|
|
@@ -969,7 +969,8 @@ describe('TreeCounter iterative methods test not map mode', () => {
|
|
|
969
969
|
expect(treeCounter.count).toBe(21);
|
|
970
970
|
expect(treeCounter.getComputedCount()).toBe(21);
|
|
971
971
|
const cloned = treeCounter.clone();
|
|
972
|
+
expect(cloned instanceof TreeCounter).toBe(true);
|
|
972
973
|
expect(cloned.root?.left?.key).toBe(1);
|
|
973
|
-
expect(cloned.get(cloned.root?.right)).toBe(
|
|
974
|
+
expect(cloned.get(cloned.root?.right)).toBe('c');
|
|
974
975
|
});
|
|
975
976
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BSTNode, TreeMultiMap, TreeMultiMapNode } from '../../../../src';
|
|
1
|
+
import { BinaryTreeNode, BSTNode, IBinaryTree, TreeMultiMap, TreeMultiMapNode } from '../../../../src';
|
|
2
2
|
import { getRandomInt } from '../../../utils';
|
|
3
3
|
|
|
4
4
|
import { isDebugTest } from '../../../config';
|
|
@@ -163,7 +163,7 @@ describe('TreeMultiMap 1', () => {
|
|
|
163
163
|
});
|
|
164
164
|
|
|
165
165
|
it('should the clone method', () => {
|
|
166
|
-
function checkTreeStructure(tmm:
|
|
166
|
+
function checkTreeStructure(tmm: IBinaryTree<string, number[]>) {
|
|
167
167
|
expect(tmm.size).toBe(4);
|
|
168
168
|
expect(tmm.root?.key).toBe('2');
|
|
169
169
|
expect(tmm.root?.left?.key).toBe('1');
|
|
@@ -627,7 +627,7 @@ describe('TreeMultiMap 2', () => {
|
|
|
627
627
|
});
|
|
628
628
|
|
|
629
629
|
describe('TreeMultiMap iterative methods test', () => {
|
|
630
|
-
let tmm: TreeMultiMap<number, string, object
|
|
630
|
+
let tmm: TreeMultiMap<number, string, object>;
|
|
631
631
|
beforeEach(() => {
|
|
632
632
|
tmm = new TreeMultiMap();
|
|
633
633
|
tmm.add([1, ['a']]);
|
|
@@ -685,7 +685,7 @@ describe('DirectedGraph iterative Methods', () => {
|
|
|
685
685
|
});
|
|
686
686
|
|
|
687
687
|
it('filter should return vertexMap that satisfy the condition', () => {
|
|
688
|
-
const filtered = graph.
|
|
688
|
+
const filtered = graph.filterEntries(key => key === 'A' || key === 'B');
|
|
689
689
|
expect(filtered).toEqual([
|
|
690
690
|
['A', undefined],
|
|
691
691
|
['B', undefined]
|
|
@@ -155,18 +155,14 @@ describe('Heap Operation Test', () => {
|
|
|
155
155
|
}
|
|
156
156
|
);
|
|
157
157
|
|
|
158
|
-
const mappedMinHeap = minHeap.map(
|
|
159
|
-
item => item.key,
|
|
160
|
-
(a, b) => a - b
|
|
161
|
-
);
|
|
158
|
+
const mappedMinHeap = minHeap.map(item => item.key, { comparator: (a, b) => a - b });
|
|
162
159
|
expect(mappedMinHeap.peek()).toBe(0);
|
|
163
160
|
expect(mappedMinHeap.sort()).toEqual([0, 1, 2, 3, 4, 5, 6]);
|
|
164
161
|
|
|
165
|
-
const mappedToElementFnMinHeap = minHeap.map<string, { id: string }>(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
);
|
|
162
|
+
const mappedToElementFnMinHeap = minHeap.map<string, { id: string }>(item => item.key.toString(), {
|
|
163
|
+
comparator: (a, b) => Number(a) - Number(b),
|
|
164
|
+
toElementFn: rawElement => rawElement.id
|
|
165
|
+
});
|
|
170
166
|
expect(mappedToElementFnMinHeap.peek()).toBe('0');
|
|
171
167
|
expect(mappedToElementFnMinHeap.sort()).toEqual(['0', '1', '2', '3', '4', '5', '6']);
|
|
172
168
|
|
|
@@ -234,17 +230,17 @@ describe('Heap Operation Test', () => {
|
|
|
234
230
|
expect(hp.leaf).toBe(1);
|
|
235
231
|
});
|
|
236
232
|
|
|
237
|
-
it('should error', function () {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
});
|
|
233
|
+
// it('should error', function () {
|
|
234
|
+
// expect(() => {
|
|
235
|
+
// new Heap([{ key: 1 }, { key: 2 }, { key: 3 }]);
|
|
236
|
+
// }).toThrow(
|
|
237
|
+
// "When comparing object types, a custom comparator must be defined in the constructor's options parameter."
|
|
238
|
+
// );
|
|
239
|
+
// });
|
|
244
240
|
});
|
|
245
241
|
|
|
246
242
|
describe('Heap HOF', () => {
|
|
247
|
-
let hp: Heap
|
|
243
|
+
let hp: Heap<{ key: number }, { key: number }>;
|
|
248
244
|
|
|
249
245
|
beforeEach(() => {
|
|
250
246
|
hp = new Heap([{ key: 1 }, { key: 2 }, { key: 3 }], { comparator: (a, b) => a.key - b.key });
|
|
@@ -256,10 +252,7 @@ describe('Heap HOF', () => {
|
|
|
256
252
|
});
|
|
257
253
|
|
|
258
254
|
it('should map', () => {
|
|
259
|
-
const mapped = hp.map(
|
|
260
|
-
({ key }) => [key, key],
|
|
261
|
-
(a, b) => a[0] - b[0]
|
|
262
|
-
);
|
|
255
|
+
const mapped = hp.map(({ key }) => [key, key], { comparator: (a, b) => a[0] - b[0] });
|
|
263
256
|
expect([...mapped]).toEqual([
|
|
264
257
|
[1, 1],
|
|
265
258
|
[2, 2],
|
|
@@ -71,10 +71,7 @@ describe('MaxHeap', () => {
|
|
|
71
71
|
}
|
|
72
72
|
);
|
|
73
73
|
|
|
74
|
-
const mappedMaxHeap = maxHeap.map(
|
|
75
|
-
item => item.key,
|
|
76
|
-
(a, b) => b - a
|
|
77
|
-
);
|
|
74
|
+
const mappedMaxHeap = maxHeap.map(item => item.key, { comparator: (a, b) => b - a });
|
|
78
75
|
expect(mappedMaxHeap.peek()).toBe(6);
|
|
79
76
|
expect(mappedMaxHeap.sort()).toEqual([6, 5, 4, 3, 2, 1, 0]);
|
|
80
77
|
|
|
@@ -83,11 +80,10 @@ describe('MaxHeap', () => {
|
|
|
83
80
|
{
|
|
84
81
|
id: string;
|
|
85
82
|
}
|
|
86
|
-
>(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
);
|
|
83
|
+
>(item => item.key.toString(), {
|
|
84
|
+
comparator: (a, b) => Number(b) - Number(a),
|
|
85
|
+
toElementFn: rawElement => rawElement.id
|
|
86
|
+
});
|
|
91
87
|
expect(mappedToElementFnMaxHeap.peek()).toBe('6');
|
|
92
88
|
expect(mappedToElementFnMaxHeap.sort()).toEqual(['6', '5', '4', '3', '2', '1', '0']);
|
|
93
89
|
|
|
@@ -106,10 +106,7 @@ describe('Heap iterative methods', () => {
|
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
it('map method correctly maps elements', () => {
|
|
109
|
-
const result = heap.map(
|
|
110
|
-
x => x / 10,
|
|
111
|
-
(a: number, b: number) => a - b
|
|
112
|
-
);
|
|
109
|
+
const result = heap.map(x => x / 10, { comparator: (a: number, b: number) => a - b });
|
|
113
110
|
expect([...result]).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
114
111
|
});
|
|
115
112
|
|
|
@@ -783,6 +783,16 @@ describe('classic use', () => {
|
|
|
783
783
|
this.map = new Map<K, DoublyLinkedListNode<CacheEntry<K, V>>>();
|
|
784
784
|
}
|
|
785
785
|
|
|
786
|
+
// Get the current cache length
|
|
787
|
+
get length(): number {
|
|
788
|
+
return this.list.length;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
// Check if it is empty
|
|
792
|
+
get isEmpty(): boolean {
|
|
793
|
+
return this.list.isEmpty();
|
|
794
|
+
}
|
|
795
|
+
|
|
786
796
|
// Get cached value
|
|
787
797
|
get(key: K): V | undefined {
|
|
788
798
|
const node = this.map.get(key);
|
|
@@ -828,12 +838,6 @@ describe('classic use', () => {
|
|
|
828
838
|
}
|
|
829
839
|
}
|
|
830
840
|
|
|
831
|
-
// Move the node to the head of the linked list
|
|
832
|
-
private moveToFront(node: DoublyLinkedListNode<CacheEntry<K, V>>): void {
|
|
833
|
-
this.list.delete(node);
|
|
834
|
-
this.list.unshift(node.value);
|
|
835
|
-
}
|
|
836
|
-
|
|
837
841
|
// Delete specific key
|
|
838
842
|
delete(key: K): boolean {
|
|
839
843
|
const node = this.map.get(key);
|
|
@@ -853,14 +857,10 @@ describe('classic use', () => {
|
|
|
853
857
|
this.map.clear();
|
|
854
858
|
}
|
|
855
859
|
|
|
856
|
-
//
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
// Check if it is empty
|
|
862
|
-
get isEmpty(): boolean {
|
|
863
|
-
return this.list.isEmpty();
|
|
860
|
+
// Move the node to the head of the linked list
|
|
861
|
+
private moveToFront(node: DoublyLinkedListNode<CacheEntry<K, V>>): void {
|
|
862
|
+
this.list.delete(node);
|
|
863
|
+
this.list.unshift(node.value);
|
|
864
864
|
}
|
|
865
865
|
}
|
|
866
866
|
|
|
@@ -618,11 +618,6 @@ describe('SinglyLinkedList', () => {
|
|
|
618
618
|
list.push(3);
|
|
619
619
|
expect(list.map(value => value * 2).toArray()).toEqual([2, 4, 6]);
|
|
620
620
|
});
|
|
621
|
-
|
|
622
|
-
it('should reduce the list', () => {
|
|
623
|
-
const list1 = SinglyLinkedList.fromArray([1, 2, 3]);
|
|
624
|
-
expect(list1.reduce((acc, value) => acc + value, 0)).toEqual(6);
|
|
625
|
-
});
|
|
626
621
|
});
|
|
627
622
|
|
|
628
623
|
describe('iterable methods', () => {
|
|
@@ -651,9 +646,7 @@ describe('iterable methods', () => {
|
|
|
651
646
|
});
|
|
652
647
|
|
|
653
648
|
describe('classic uses', () => {
|
|
654
|
-
|
|
655
649
|
it('@example implementation of a basic text editor', () => {
|
|
656
|
-
|
|
657
650
|
class TextEditor {
|
|
658
651
|
private content: SinglyLinkedList<string>;
|
|
659
652
|
private cursorIndex: number;
|
|
@@ -139,21 +139,18 @@ describe('MaxPriorityQueue Operation Test', () => {
|
|
|
139
139
|
expect(filtered instanceof MaxPriorityQueue).toBe(true);
|
|
140
140
|
expect([...filtered]).toEqual([7, 1, 5]);
|
|
141
141
|
|
|
142
|
-
const mapped = filtered.map(
|
|
143
|
-
item => ({ key: item }),
|
|
144
|
-
(a, b) => b.key - a.key
|
|
145
|
-
);
|
|
142
|
+
const mapped = filtered.map(item => ({ key: item }), { comparator: (a, b) => b.key - a.key });
|
|
146
143
|
expect(mapped instanceof MaxPriorityQueue).toBe(true);
|
|
147
144
|
expect([...mapped]).toEqual([{ key: 7 }, { key: 1 }, { key: 5 }]);
|
|
148
145
|
});
|
|
149
146
|
|
|
150
|
-
it('should MaxPriorityQueue throw an error while initialed with object data', function () {
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
});
|
|
147
|
+
// it('should MaxPriorityQueue throw an error while initialed with object data', function () {
|
|
148
|
+
// expect(() => {
|
|
149
|
+
// new MaxPriorityQueue<{ key: number }>([{ key: 7 }, { key: 1 }, { key: 7 }]);
|
|
150
|
+
// }).toThrow(
|
|
151
|
+
// "When comparing object types, a custom comparator must be defined in the constructor's options parameter."
|
|
152
|
+
// );
|
|
153
|
+
// });
|
|
157
154
|
|
|
158
155
|
it('should MaxPriorityQueue comparator return 0 when equal values are added', function () {
|
|
159
156
|
const duplicated = new MaxPriorityQueue<number>([7, 1, 7, 7]);
|
|
@@ -70,10 +70,7 @@ describe('MinPriorityQueue Operation Test', () => {
|
|
|
70
70
|
expect(filtered instanceof MinPriorityQueue).toBe(true);
|
|
71
71
|
expect([...filtered]).toEqual([1, 5, 7]);
|
|
72
72
|
|
|
73
|
-
const mapped = filtered.map(
|
|
74
|
-
item => ({ key: item }),
|
|
75
|
-
(a, b) => a.key - b.key
|
|
76
|
-
);
|
|
73
|
+
const mapped = filtered.map(item => ({ key: item }), { comparator: (a, b) => a.key - b.key });
|
|
77
74
|
expect(mapped instanceof MinPriorityQueue).toBe(true);
|
|
78
75
|
expect([...mapped]).toEqual([{ key: 1 }, { key: 5 }, { key: 7 }]);
|
|
79
76
|
expect(mapped.toVisual()).toEqual([{ key: 1 }, { key: 5 }, { key: 7 }]);
|
|
@@ -62,10 +62,7 @@ describe('PriorityQueue Operation Test', () => {
|
|
|
62
62
|
expect(filtered instanceof PriorityQueue).toBe(true);
|
|
63
63
|
expect([...filtered]).toEqual([1, 3, 5, 7]);
|
|
64
64
|
|
|
65
|
-
const mapped = filtered.map(
|
|
66
|
-
item => ({ key: item }),
|
|
67
|
-
(a, b) => a.key - b.key
|
|
68
|
-
);
|
|
65
|
+
const mapped = filtered.map(item => ({ key: item }), { comparator: (a, b) => a.key - b.key });
|
|
69
66
|
expect(mapped instanceof PriorityQueue).toBe(true);
|
|
70
67
|
expect([...mapped]).toEqual([{ key: 1 }, { key: 3 }, { key: 5 }, { key: 7 }]);
|
|
71
68
|
});
|
|
@@ -153,10 +153,9 @@ describe('Queue', () => {
|
|
|
153
153
|
expect(mappedQueue.at(0)).toBe(1);
|
|
154
154
|
expect([...mappedQueue]).toEqual([1, 6, 5, 3, 2, 4, 0]);
|
|
155
155
|
|
|
156
|
-
const mappedToElementFnQueue = queue.map<string, { id: string }>(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
);
|
|
156
|
+
const mappedToElementFnQueue = queue.map<string, { id: string }>(item => item.key.toString(), {
|
|
157
|
+
toElementFn: rawElement => rawElement.id
|
|
158
|
+
});
|
|
160
159
|
expect(mappedToElementFnQueue.at(0)).toBe('1');
|
|
161
160
|
expect([...mappedToElementFnQueue]).toEqual(['1', '6', '5', '3', '2', '4', '0']);
|
|
162
161
|
|
|
@@ -603,7 +602,7 @@ describe('classic uses', () => {
|
|
|
603
602
|
let maxSum = 0;
|
|
604
603
|
let currentSum = 0;
|
|
605
604
|
|
|
606
|
-
nums.forEach(
|
|
605
|
+
nums.forEach(num => {
|
|
607
606
|
queue.push(num);
|
|
608
607
|
currentSum += num;
|
|
609
608
|
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { AVLTree } from 'data-structure-typed';
|
|
2
|
-
import Benchmark from 'benchmark';
|
|
3
|
-
|
|
4
|
-
const magnitude = {
|
|
5
|
-
THOUSAND: 1000,
|
|
6
|
-
TEN_THOUSAND: 10000,
|
|
7
|
-
HUNDRED_THOUSAND: 100000,
|
|
8
|
-
MILLION: 1000000,
|
|
9
|
-
TEN_MILLION: 10000000,
|
|
10
|
-
BILLION: 100000000
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
function getRandomIntArray(length = 1000, min = -1000, max = 1000, unique = true) {
|
|
14
|
-
if (unique) {
|
|
15
|
-
if (max - min + 1 < length) {
|
|
16
|
-
throw new Error('Range too small for unique values with the specified length');
|
|
17
|
-
}
|
|
18
|
-
const allNumbers = Array.from({ length: max - min + 1 }, (_, i) => i + min);
|
|
19
|
-
for (let i = allNumbers.length - 1; i > 0; i--) {
|
|
20
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
21
|
-
[allNumbers[i], allNumbers[j]] = [allNumbers[j], allNumbers[i]];
|
|
22
|
-
}
|
|
23
|
-
return allNumbers.slice(0, length);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
return Array.from({ length }, () => Math.floor(Math.random() * (max - min + 1)) + min);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const suite = new Benchmark.Suite();
|
|
31
|
-
const avlTree = new AVLTree();
|
|
32
|
-
const { HUNDRED_THOUSAND } = magnitude;
|
|
33
|
-
const randomArray = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND - 1, true);
|
|
34
|
-
suite
|
|
35
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add randomly`, () => {
|
|
36
|
-
avlTree.clear();
|
|
37
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
38
|
-
avlTree.add(randomArray[i]);
|
|
39
|
-
})
|
|
40
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
|
|
41
|
-
avlTree.clear();
|
|
42
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
43
|
-
avlTree.add(i);
|
|
44
|
-
})
|
|
45
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} get`, () => {
|
|
46
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
47
|
-
avlTree.get(randomArray[i]);
|
|
48
|
-
})
|
|
49
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} getNode`, () => {
|
|
50
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
51
|
-
avlTree.getNode(randomArray[i]);
|
|
52
|
-
})
|
|
53
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} iterator`, () => {
|
|
54
|
-
const entries = [...avlTree];
|
|
55
|
-
return entries.length === HUNDRED_THOUSAND;
|
|
56
|
-
})
|
|
57
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete orderly`, () => {
|
|
58
|
-
avlTree.clear();
|
|
59
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
60
|
-
avlTree.add(i);
|
|
61
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
62
|
-
avlTree.delete(i);
|
|
63
|
-
})
|
|
64
|
-
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete randomly`, () => {
|
|
65
|
-
avlTree.clear();
|
|
66
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
67
|
-
avlTree.add(randomArray[i]);
|
|
68
|
-
for (let i = 0; i < randomArray.length; i++)
|
|
69
|
-
avlTree.delete(randomArray[i]);
|
|
70
|
-
});
|
|
71
|
-
export { suite };
|