data-structure-typed 1.51.8 → 1.52.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/README.md +13 -13
- package/benchmark/report.html +13 -13
- package/benchmark/report.json +152 -152
- package/dist/cjs/data-structures/base/index.d.ts +2 -1
- package/dist/cjs/data-structures/base/index.js +2 -1
- package/dist/cjs/data-structures/base/index.js.map +1 -1
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +171 -0
- package/dist/cjs/data-structures/base/iterable-element-base.js +226 -0
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -0
- package/dist/cjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
- package/dist/cjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +13 -190
- package/dist/cjs/data-structures/base/iterable-entry-base.js.map +1 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -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 +82 -62
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +78 -59
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +475 -363
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +192 -202
- package/dist/cjs/data-structures/binary-tree/bst.js +207 -249
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +107 -98
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +105 -93
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +10 -15
- package/dist/cjs/data-structures/graph/abstract-graph.js +10 -15
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +33 -40
- package/dist/cjs/data-structures/hash/hash-map.js +40 -55
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +43 -114
- package/dist/cjs/data-structures/heap/heap.js +59 -127
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.d.ts +50 -4
- package/dist/cjs/data-structures/heap/max-heap.js +76 -10
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.d.ts +51 -5
- package/dist/cjs/data-structures/heap/min-heap.js +68 -11
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +26 -28
- 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 +22 -25
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +29 -26
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +79 -10
- 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 +51 -5
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +71 -11
- 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 +50 -4
- package/dist/cjs/data-structures/priority-queue/priority-queue.js +70 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +21 -20
- package/dist/cjs/data-structures/queue/deque.js +29 -23
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +8 -28
- package/dist/cjs/data-structures/queue/queue.js +15 -31
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +17 -22
- package/dist/cjs/data-structures/stack/stack.js +25 -24
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +19 -14
- package/dist/cjs/data-structures/trie/trie.js +27 -16
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +7 -7
- package/dist/cjs/types/common.d.ts +1 -2
- package/dist/cjs/types/data-structures/base/base.d.ts +5 -2
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
- package/dist/cjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
- package/dist/cjs/types/data-structures/binary-tree/bst.d.ts +4 -5
- package/dist/cjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
- package/dist/cjs/types/data-structures/heap/heap.d.ts +3 -2
- package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
- package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
- package/dist/cjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
- package/dist/cjs/types/data-structures/queue/deque.d.ts +3 -2
- package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -1
- package/dist/cjs/types/data-structures/stack/stack.d.ts +2 -1
- package/dist/cjs/types/data-structures/trie/trie.d.ts +3 -2
- package/dist/cjs/utils/utils.js +3 -5
- package/dist/cjs/utils/utils.js.map +1 -1
- package/dist/mjs/data-structures/base/index.d.ts +2 -1
- package/dist/mjs/data-structures/base/index.js +2 -1
- package/dist/mjs/data-structures/base/iterable-element-base.d.ts +171 -0
- package/dist/mjs/data-structures/base/iterable-element-base.js +222 -0
- package/dist/mjs/data-structures/base/{iterable-base.d.ts → iterable-entry-base.d.ts} +4 -147
- package/dist/mjs/data-structures/base/{iterable-base.js → iterable-entry-base.js} +10 -186
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +106 -68
- package/dist/mjs/data-structures/binary-tree/avl-tree-multi-map.js +119 -87
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +82 -62
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +78 -59
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +318 -226
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +476 -364
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +192 -202
- package/dist/mjs/data-structures/binary-tree/bst.js +211 -255
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +73 -74
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +107 -98
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.d.ts +92 -75
- package/dist/mjs/data-structures/binary-tree/tree-multi-map.js +105 -93
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +10 -15
- package/dist/mjs/data-structures/graph/abstract-graph.js +10 -15
- package/dist/mjs/data-structures/hash/hash-map.d.ts +33 -40
- package/dist/mjs/data-structures/hash/hash-map.js +41 -55
- package/dist/mjs/data-structures/heap/heap.d.ts +43 -114
- package/dist/mjs/data-structures/heap/heap.js +60 -128
- package/dist/mjs/data-structures/heap/max-heap.d.ts +50 -4
- package/dist/mjs/data-structures/heap/max-heap.js +79 -10
- package/dist/mjs/data-structures/heap/min-heap.d.ts +51 -5
- package/dist/mjs/data-structures/heap/min-heap.js +68 -11
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.d.ts +22 -28
- package/dist/mjs/data-structures/linked-list/doubly-linked-list.js +26 -28
- package/dist/mjs/data-structures/linked-list/singly-linked-list.d.ts +22 -25
- package/dist/mjs/data-structures/linked-list/singly-linked-list.js +29 -26
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +50 -4
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +82 -10
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +51 -5
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +71 -11
- package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +50 -4
- package/dist/mjs/data-structures/priority-queue/priority-queue.js +70 -1
- package/dist/mjs/data-structures/queue/deque.d.ts +21 -20
- package/dist/mjs/data-structures/queue/deque.js +29 -23
- package/dist/mjs/data-structures/queue/queue.d.ts +8 -28
- package/dist/mjs/data-structures/queue/queue.js +15 -31
- package/dist/mjs/data-structures/stack/stack.d.ts +17 -22
- package/dist/mjs/data-structures/stack/stack.js +25 -24
- package/dist/mjs/data-structures/trie/trie.d.ts +19 -14
- package/dist/mjs/data-structures/trie/trie.js +27 -16
- package/dist/mjs/interfaces/binary-tree.d.ts +7 -7
- package/dist/mjs/types/common.d.ts +1 -2
- package/dist/mjs/types/data-structures/base/base.d.ts +5 -2
- package/dist/mjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +3 -4
- package/dist/mjs/types/data-structures/binary-tree/avl-tree.d.ts +3 -4
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +5 -5
- package/dist/mjs/types/data-structures/binary-tree/bst.d.ts +4 -5
- package/dist/mjs/types/data-structures/binary-tree/rb-tree.d.ts +3 -4
- package/dist/mjs/types/data-structures/binary-tree/tree-multi-map.d.ts +3 -4
- package/dist/mjs/types/data-structures/heap/heap.d.ts +3 -2
- package/dist/mjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -1
- package/dist/mjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -1
- package/dist/mjs/types/data-structures/priority-queue/priority-queue.d.ts +1 -1
- package/dist/mjs/types/data-structures/queue/deque.d.ts +3 -2
- package/dist/mjs/types/data-structures/queue/queue.d.ts +2 -1
- package/dist/mjs/types/data-structures/stack/stack.d.ts +2 -1
- package/dist/mjs/types/data-structures/trie/trie.d.ts +3 -2
- package/dist/mjs/utils/utils.js +3 -5
- package/dist/umd/data-structure-typed.js +1949 -1481
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +6 -6
- package/src/data-structures/base/index.ts +2 -1
- package/src/data-structures/base/iterable-element-base.ts +250 -0
- package/src/data-structures/base/{iterable-base.ts → iterable-entry-base.ts} +22 -213
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +144 -95
- package/src/data-structures/binary-tree/avl-tree.ts +96 -69
- package/src/data-structures/binary-tree/binary-tree.ts +535 -403
- package/src/data-structures/binary-tree/bst.ts +247 -277
- package/src/data-structures/binary-tree/rb-tree.ts +123 -103
- package/src/data-structures/binary-tree/tree-multi-map.ts +127 -102
- package/src/data-structures/graph/abstract-graph.ts +10 -10
- package/src/data-structures/hash/hash-map.ts +46 -53
- package/src/data-structures/heap/heap.ts +71 -152
- package/src/data-structures/heap/max-heap.ts +88 -13
- package/src/data-structures/heap/min-heap.ts +78 -15
- package/src/data-structures/linked-list/doubly-linked-list.ts +32 -32
- package/src/data-structures/linked-list/singly-linked-list.ts +37 -29
- package/src/data-structures/priority-queue/max-priority-queue.ts +94 -13
- package/src/data-structures/priority-queue/min-priority-queue.ts +84 -15
- package/src/data-structures/priority-queue/priority-queue.ts +81 -4
- package/src/data-structures/queue/deque.ts +37 -26
- package/src/data-structures/queue/queue.ts +23 -36
- package/src/data-structures/stack/stack.ts +31 -26
- package/src/data-structures/trie/trie.ts +35 -20
- package/src/interfaces/binary-tree.ts +9 -9
- package/src/types/common.ts +1 -2
- package/src/types/data-structures/base/base.ts +14 -6
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +3 -4
- package/src/types/data-structures/binary-tree/avl-tree.ts +3 -4
- package/src/types/data-structures/binary-tree/binary-tree.ts +6 -6
- package/src/types/data-structures/binary-tree/bst.ts +4 -5
- package/src/types/data-structures/binary-tree/rb-tree.ts +3 -4
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +3 -4
- package/src/types/data-structures/heap/heap.ts +4 -1
- package/src/types/data-structures/linked-list/doubly-linked-list.ts +3 -1
- package/src/types/data-structures/linked-list/singly-linked-list.ts +3 -1
- package/src/types/data-structures/priority-queue/priority-queue.ts +1 -1
- package/src/types/data-structures/queue/deque.ts +3 -1
- package/src/types/data-structures/queue/queue.ts +3 -1
- package/src/types/data-structures/stack/stack.ts +3 -1
- package/src/types/data-structures/trie/trie.ts +3 -1
- package/src/utils/utils.ts +3 -3
- package/test/integration/avl-tree.test.ts +2 -2
- package/test/integration/bst.test.ts +3 -3
- package/test/integration/index.html +25 -11
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +68 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +56 -0
- package/test/unit/data-structures/graph/directed-graph.test.ts +2 -2
- package/test/unit/data-structures/heap/heap.test.ts +80 -0
- package/test/unit/data-structures/heap/max-heap.test.ts +44 -1
- package/test/unit/data-structures/heap/min-heap.test.ts +18 -1
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +42 -0
- package/test/unit/data-structures/queue/deque.test.ts +30 -0
- package/test/unit/data-structures/queue/queue.test.ts +56 -0
- package/test/utils/big-o.ts +12 -6
- package/tsconfig-base.json +1 -0
- package/dist/cjs/data-structures/base/iterable-base.js.map +0 -1
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { BST, BSTNode } from '../../../data-structures';
|
|
2
2
|
import type { BinaryTreeOptions } from './binary-tree';
|
|
3
|
-
import { Comparator } from
|
|
4
|
-
import { Comparable } from "../../utils";
|
|
3
|
+
import { Comparator } from '../../common';
|
|
5
4
|
|
|
6
|
-
export type BSTNodeNested<K
|
|
5
|
+
export type BSTNodeNested<K, V> = BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, BSTNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
7
6
|
|
|
8
|
-
export type BSTNested<K
|
|
7
|
+
export type BSTNested<K, V, R, NODE extends BSTNode<K, V, NODE>> = BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, BST<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
9
8
|
|
|
10
|
-
export type BSTOptions<K> = BinaryTreeOptions & {
|
|
9
|
+
export type BSTOptions<K, V, R> = BinaryTreeOptions<K, V, R> & {
|
|
11
10
|
comparator?: Comparator<K>
|
|
12
11
|
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { RedBlackTree, RedBlackTreeNode } from '../../../data-structures';
|
|
2
2
|
import type { BSTOptions } from "./bst";
|
|
3
|
-
import { Comparable } from "../../utils";
|
|
4
3
|
|
|
5
4
|
export type RBTNColor = 'RED' | 'BLACK';
|
|
6
5
|
|
|
7
|
-
export type RedBlackTreeNodeNested<K
|
|
6
|
+
export type RedBlackTreeNodeNested<K, V> = RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, RedBlackTreeNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
8
7
|
|
|
9
|
-
export type RedBlackTreeNested<K
|
|
8
|
+
export type RedBlackTreeNested<K, V, R, NODE extends RedBlackTreeNode<K, V, NODE>> = RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, RedBlackTree<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
10
9
|
|
|
11
|
-
export type RBTreeOptions<K> = BSTOptions<K> & {};
|
|
10
|
+
export type RBTreeOptions<K, V, R> = BSTOptions<K, V, R> & {};
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { TreeMultiMap, TreeMultiMapNode } from '../../../data-structures';
|
|
2
2
|
import type { RBTreeOptions } from './rb-tree';
|
|
3
|
-
import { Comparable } from "../../utils";
|
|
4
3
|
|
|
5
|
-
export type TreeMultiMapNodeNested<K
|
|
4
|
+
export type TreeMultiMapNodeNested<K, V> = TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, TreeMultiMapNode<K, V, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
6
5
|
|
|
7
|
-
export type TreeMultiMapNested<K
|
|
6
|
+
export type TreeMultiMapNested<K, V, R, NODE extends TreeMultiMapNode<K, V, NODE>> = TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, TreeMultiMap<K, V, R, NODE, any>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
|
|
8
7
|
|
|
9
|
-
export type TreeMultiMapOptions<K> = RBTreeOptions<K> & {}
|
|
8
|
+
export type TreeMultiMapOptions<K, V, R> = RBTreeOptions<K, V, R> & {}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { Comparator } from '../../common';
|
|
2
|
+
import { IterableElementBaseOptions } from '../base';
|
|
2
3
|
|
|
3
|
-
export type HeapOptions<
|
|
4
|
+
export type HeapOptions<E, R> = IterableElementBaseOptions<E, R> & {
|
|
5
|
+
comparator?: Comparator<E>;
|
|
6
|
+
};
|
package/src/utils/utils.ts
CHANGED
|
@@ -108,7 +108,7 @@ export const roundFixed = (num: number, digit: number = 10) => {
|
|
|
108
108
|
|
|
109
109
|
export function isComparable(key: any): key is Comparable {
|
|
110
110
|
const keyType = typeof key;
|
|
111
|
-
if (keyType === 'number') return isNaN(key);
|
|
111
|
+
if (keyType === 'number') return !isNaN(key);
|
|
112
112
|
if (keyType === 'string') return true;
|
|
113
113
|
if (keyType === 'bigint') return true;
|
|
114
114
|
if (keyType === 'boolean') return true;
|
|
@@ -117,8 +117,8 @@ export function isComparable(key: any): key is Comparable {
|
|
|
117
117
|
if (keyType === 'function') return isComparable(key());
|
|
118
118
|
if (keyType === 'object') {
|
|
119
119
|
if (key === null) return true;
|
|
120
|
-
if (typeof key.valueOf === 'function') return isComparable(key.valueOf());
|
|
121
|
-
if (typeof key.toString === 'function') return isComparable(key.toString());
|
|
120
|
+
// if (typeof key.valueOf === 'function') return isComparable(key.valueOf()); // This will keep recursing because every object has a valueOf method.
|
|
121
|
+
// if (typeof key.toString === 'function') return isComparable(key.toString()); // This will also keep recursing because every string type has a toString method.
|
|
122
122
|
return false;
|
|
123
123
|
}
|
|
124
124
|
|
|
@@ -20,7 +20,7 @@ describe('AVL Tree Test', () => {
|
|
|
20
20
|
[10, 10],
|
|
21
21
|
[5, 5]
|
|
22
22
|
];
|
|
23
|
-
const tree = new AVLTree();
|
|
23
|
+
const tree = new AVLTree<number, number>();
|
|
24
24
|
|
|
25
25
|
for (const i of arr) tree.add(i);
|
|
26
26
|
|
|
@@ -44,7 +44,7 @@ describe('AVL Tree Test', () => {
|
|
|
44
44
|
expect(subTreeSum).toBe(70);
|
|
45
45
|
|
|
46
46
|
let lesserSum = 0;
|
|
47
|
-
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
47
|
+
tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
48
48
|
expect(lesserSum).toBe(45);
|
|
49
49
|
|
|
50
50
|
// node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class.
|
|
@@ -2,7 +2,7 @@ import { BST, BSTNode } from 'bst-typed';
|
|
|
2
2
|
|
|
3
3
|
describe('Individual package BST operations test', () => {
|
|
4
4
|
it('should perform various operations on a Binary Search Tree with numeric values', () => {
|
|
5
|
-
const bst = new BST();
|
|
5
|
+
const bst = new BST<number>();
|
|
6
6
|
expect(bst).toBeInstanceOf(BST);
|
|
7
7
|
bst.add([11, 11]);
|
|
8
8
|
bst.add([3, 3]);
|
|
@@ -38,7 +38,7 @@ describe('Individual package BST operations test', () => {
|
|
|
38
38
|
expect(subTreeSum).toBe(70);
|
|
39
39
|
|
|
40
40
|
let lesserSum = 0;
|
|
41
|
-
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
41
|
+
bst.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
42
42
|
expect(lesserSum).toBe(45);
|
|
43
43
|
|
|
44
44
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -235,7 +235,7 @@ describe('Individual package BST operations test', () => {
|
|
|
235
235
|
expect(subTreeSum).toBe(70);
|
|
236
236
|
|
|
237
237
|
let lesserSum = 0;
|
|
238
|
-
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key),
|
|
238
|
+
objBST.lesserOrGreaterTraverse(node => (lesserSum += node.key), -1, 10);
|
|
239
239
|
expect(lesserSum).toBe(45);
|
|
240
240
|
|
|
241
241
|
expect(node15).toBeInstanceOf(BSTNode);
|
|
@@ -11,6 +11,20 @@
|
|
|
11
11
|
<!-- <script src='https://cdn.jsdelivr.net/npm/data-structure-typed@1.44.0/dist/umd/data-structure-typed.min.js'></script>-->
|
|
12
12
|
|
|
13
13
|
<script src='https://unpkg.com/js-sdsl@4.4.2/dist/umd/js-sdsl.js'></script>
|
|
14
|
+
<script>
|
|
15
|
+
const logPerf = function (label = 'function running cost', fn, args, thisArg) {
|
|
16
|
+
const start = performance.now();
|
|
17
|
+
let result;
|
|
18
|
+
if (thisArg) {
|
|
19
|
+
if (args && args.length > 0) result = fn.apply(thisArg, args);
|
|
20
|
+
else result = fn.apply(thisArg);
|
|
21
|
+
} else {
|
|
22
|
+
if (args && args.length > 0) result = fn(...args);
|
|
23
|
+
else result = fn();
|
|
24
|
+
}
|
|
25
|
+
console.log(`${(performance.now() - start).toFixed(2)} ms, ${label}, ${result}`);
|
|
26
|
+
}
|
|
27
|
+
</script>
|
|
14
28
|
</head>
|
|
15
29
|
<body>
|
|
16
30
|
<div id='app'>
|
|
@@ -26,19 +40,19 @@
|
|
|
26
40
|
const { Queue } = dataStructureTyped;
|
|
27
41
|
const queue = new Queue();
|
|
28
42
|
const n = 1000000;
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
let last = 0;
|
|
35
|
-
const startTime = performance.now();
|
|
43
|
+
logPerf(`Queue ${n.toLocaleString()} enqueue`, () => {
|
|
44
|
+
for (let i = 0; i < n; i++) {
|
|
45
|
+
queue.push(i);
|
|
46
|
+
}
|
|
47
|
+
})
|
|
36
48
|
|
|
37
|
-
|
|
38
|
-
last = queue.shift();
|
|
39
|
-
}
|
|
49
|
+
let last = 0;
|
|
40
50
|
|
|
41
|
-
|
|
51
|
+
logPerf(`Queue ${n.toLocaleString()} dequeue `, () => {
|
|
52
|
+
for (let i = 0; i < n; i++) {
|
|
53
|
+
last = queue.shift();
|
|
54
|
+
}
|
|
55
|
+
})
|
|
42
56
|
|
|
43
57
|
} catch (e) {
|
|
44
58
|
console.error(e);
|
|
@@ -689,3 +689,71 @@ describe('AVLTreeMultiMap iterative methods test', () => {
|
|
|
689
689
|
expect([...values]).toEqual(['a', 'b', 'c']);
|
|
690
690
|
});
|
|
691
691
|
});
|
|
692
|
+
|
|
693
|
+
describe('AVLTree toEntryFn', () => {
|
|
694
|
+
it('should toEntryFn 1', () => {
|
|
695
|
+
const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>([], {
|
|
696
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
697
|
+
});
|
|
698
|
+
tree.add({ obj: { id: 1 } });
|
|
699
|
+
tree.add({ obj: { id: 2 } });
|
|
700
|
+
tree.add({ obj: { id: 3 } });
|
|
701
|
+
tree.add({ obj: { id: 4 } });
|
|
702
|
+
tree.add({ obj: { id: 5 } });
|
|
703
|
+
|
|
704
|
+
const expected = [1, 2, 3, 4, 5];
|
|
705
|
+
|
|
706
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
707
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
708
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
709
|
+
});
|
|
710
|
+
|
|
711
|
+
it('should toEntryFn 2', () => {
|
|
712
|
+
const tree = new AVLTreeMultiMap<number, number, { obj: { id: number } }>(
|
|
713
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
714
|
+
{
|
|
715
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
716
|
+
}
|
|
717
|
+
);
|
|
718
|
+
|
|
719
|
+
const expected = [1, 2, 3, 4, 5];
|
|
720
|
+
|
|
721
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
722
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
723
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
it('should toEntryFn throw error', () => {
|
|
727
|
+
expect(
|
|
728
|
+
() =>
|
|
729
|
+
new AVLTreeMultiMap<{ obj: { id: number } }, number>([
|
|
730
|
+
{ obj: { id: 1 } },
|
|
731
|
+
{ obj: { id: 2 } },
|
|
732
|
+
{ obj: { id: 3 } },
|
|
733
|
+
{ obj: { id: 4 } },
|
|
734
|
+
{ obj: { id: 5 } }
|
|
735
|
+
])
|
|
736
|
+
).toThrowError(
|
|
737
|
+
`When comparing object types, a custom comparator must be defined in the constructor's options parameter.`
|
|
738
|
+
);
|
|
739
|
+
});
|
|
740
|
+
|
|
741
|
+
it('should toEntryFn 3', () => {
|
|
742
|
+
const tree = new AVLTreeMultiMap<{ obj: { id: number } }, number>(
|
|
743
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
744
|
+
{ comparator: (a, b) => a.obj.id - b.obj.id }
|
|
745
|
+
);
|
|
746
|
+
|
|
747
|
+
const expected = [
|
|
748
|
+
{ obj: { id: 1 } },
|
|
749
|
+
{ obj: { id: 2 } },
|
|
750
|
+
{ obj: { id: 3 } },
|
|
751
|
+
{ obj: { id: 4 } },
|
|
752
|
+
{ obj: { id: 5 } }
|
|
753
|
+
];
|
|
754
|
+
|
|
755
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
756
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
757
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
758
|
+
});
|
|
759
|
+
});
|
|
@@ -403,6 +403,62 @@ describe('BinaryTree Morris Traversal', () => {
|
|
|
403
403
|
});
|
|
404
404
|
});
|
|
405
405
|
|
|
406
|
+
describe('BinaryTree toEntryFn', () => {
|
|
407
|
+
it('should toEntryFn 1', () => {
|
|
408
|
+
const tree = new BinaryTree<number, number, { obj: { id: number } }>([], {
|
|
409
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
410
|
+
});
|
|
411
|
+
tree.add({ obj: { id: 1 } });
|
|
412
|
+
tree.add({ obj: { id: 2 } });
|
|
413
|
+
tree.add({ obj: { id: 3 } });
|
|
414
|
+
tree.add({ obj: { id: 4 } });
|
|
415
|
+
tree.add({ obj: { id: 5 } });
|
|
416
|
+
|
|
417
|
+
const expected = [4, 2, 5, 1, 3];
|
|
418
|
+
|
|
419
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
420
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
421
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
it('should toEntryFn 2', () => {
|
|
425
|
+
const tree = new BinaryTree<number, number, { obj: { id: number } }>(
|
|
426
|
+
[{ obj: { id: 1 } }, { obj: { id: 2 } }, { obj: { id: 3 } }, { obj: { id: 4 } }, { obj: { id: 5 } }],
|
|
427
|
+
{
|
|
428
|
+
toEntryFn: ele => [ele.obj.id, ele.obj.id]
|
|
429
|
+
}
|
|
430
|
+
);
|
|
431
|
+
|
|
432
|
+
const expected = [4, 2, 5, 1, 3];
|
|
433
|
+
|
|
434
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
435
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
436
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it('should toEntryFn 3', () => {
|
|
440
|
+
const tree = new BinaryTree<{ obj: { id: number } }, number>([
|
|
441
|
+
{ obj: { id: 1 } },
|
|
442
|
+
{ obj: { id: 2 } },
|
|
443
|
+
{ obj: { id: 3 } },
|
|
444
|
+
{ obj: { id: 4 } },
|
|
445
|
+
{ obj: { id: 5 } }
|
|
446
|
+
]);
|
|
447
|
+
|
|
448
|
+
const expected = [
|
|
449
|
+
{ obj: { id: 4 } },
|
|
450
|
+
{ obj: { id: 2 } },
|
|
451
|
+
{ obj: { id: 5 } },
|
|
452
|
+
{ obj: { id: 1 } },
|
|
453
|
+
{ obj: { id: 3 } }
|
|
454
|
+
];
|
|
455
|
+
|
|
456
|
+
expect(tree.morris(node => node.key, 'IN')).toEqual(expected);
|
|
457
|
+
expect(tree.dfs(node => node.key, 'IN')).toEqual(expected);
|
|
458
|
+
expect(tree.dfs(node => node.key, 'IN', tree.root, 'RECURSIVE')).toEqual(expected);
|
|
459
|
+
});
|
|
460
|
+
});
|
|
461
|
+
|
|
406
462
|
describe('BinaryTree traversals', () => {
|
|
407
463
|
const tree = new BinaryTree<number>();
|
|
408
464
|
|
|
@@ -132,11 +132,11 @@ class MyDirectedGraph<
|
|
|
132
132
|
VO extends MyVertex<V> = MyVertex<V>,
|
|
133
133
|
EO extends MyEdge<E> = MyEdge<E>
|
|
134
134
|
> extends DirectedGraph<V, E, VO, EO> {
|
|
135
|
-
createVertex(key: VertexKey, value: V): VO {
|
|
135
|
+
override createVertex(key: VertexKey, value: V): VO {
|
|
136
136
|
return new MyVertex(key, value) as VO;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
|
|
139
|
+
override createEdge(src: VertexKey, dest: VertexKey, weight?: number, value?: E): EO {
|
|
140
140
|
return new MyEdge(src, dest, weight ?? 1, value) as EO;
|
|
141
141
|
}
|
|
142
142
|
|
|
@@ -87,6 +87,86 @@ describe('Heap Operation Test', () => {
|
|
|
87
87
|
maxI++;
|
|
88
88
|
}
|
|
89
89
|
});
|
|
90
|
+
|
|
91
|
+
it('should object heap map & filter', function () {
|
|
92
|
+
const minHeap = new MinHeap<{ a: string; key: number }>(
|
|
93
|
+
[
|
|
94
|
+
{ key: 1, a: 'a1' },
|
|
95
|
+
{ key: 6, a: 'a6' },
|
|
96
|
+
{ key: 5, a: 'a5' },
|
|
97
|
+
{ key: 3, a: 'a3' },
|
|
98
|
+
{ key: 2, a: 'a2' },
|
|
99
|
+
{ key: 4, a: 'a4' },
|
|
100
|
+
{ key: 0, a: 'a0' }
|
|
101
|
+
],
|
|
102
|
+
{ comparator: (a, b) => a.key - b.key }
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const mappedMinHeap = minHeap.map(
|
|
106
|
+
item => item.key,
|
|
107
|
+
(a, b) => a - b
|
|
108
|
+
);
|
|
109
|
+
expect(mappedMinHeap.peek()).toBe(0);
|
|
110
|
+
expect(mappedMinHeap.sort()).toEqual([0, 1, 2, 3, 4, 5, 6]);
|
|
111
|
+
|
|
112
|
+
const mappedToElementFnMinHeap = minHeap.map<string, { id: string }>(
|
|
113
|
+
item => item.key.toString(),
|
|
114
|
+
(a, b) => Number(a) - Number(b),
|
|
115
|
+
rawElement => rawElement.id
|
|
116
|
+
);
|
|
117
|
+
expect(mappedToElementFnMinHeap.peek()).toBe('0');
|
|
118
|
+
expect(mappedToElementFnMinHeap.sort()).toEqual(['0', '1', '2', '3', '4', '5', '6']);
|
|
119
|
+
|
|
120
|
+
const filteredHeap = minHeap.filter(item => item.key > 3);
|
|
121
|
+
expect(filteredHeap.peek()).toEqual({ a: 'a4', key: 4 });
|
|
122
|
+
expect(filteredHeap.sort()).toEqual([
|
|
123
|
+
{ a: 'a4', key: 4 },
|
|
124
|
+
{ a: 'a5', key: 5 },
|
|
125
|
+
{ a: 'a6', key: 6 }
|
|
126
|
+
]);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('should object heap', () => {
|
|
130
|
+
const heap = new Heap<{ rawItem: { id: number } }>(
|
|
131
|
+
[
|
|
132
|
+
{ rawItem: { id: 4 } },
|
|
133
|
+
{ rawItem: { id: 8 } },
|
|
134
|
+
{ rawItem: { id: 6 } },
|
|
135
|
+
{ rawItem: { id: 7 } },
|
|
136
|
+
{ rawItem: { id: 1 } },
|
|
137
|
+
{ rawItem: { id: 3 } },
|
|
138
|
+
{ rawItem: { id: 5 } }
|
|
139
|
+
],
|
|
140
|
+
{ comparator: (a, b) => a.rawItem.id - b.rawItem.id }
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
expect([...heap.sort()]).toEqual([
|
|
144
|
+
{ rawItem: { id: 1 } },
|
|
145
|
+
{ rawItem: { id: 3 } },
|
|
146
|
+
{ rawItem: { id: 4 } },
|
|
147
|
+
{ rawItem: { id: 5 } },
|
|
148
|
+
{ rawItem: { id: 6 } },
|
|
149
|
+
{ rawItem: { id: 7 } },
|
|
150
|
+
{ rawItem: { id: 8 } }
|
|
151
|
+
]);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should toElementFn', () => {
|
|
155
|
+
const heap = new Heap<number, { rawItem: { id: number } }>(
|
|
156
|
+
[
|
|
157
|
+
{ rawItem: { id: 4 } },
|
|
158
|
+
{ rawItem: { id: 8 } },
|
|
159
|
+
{ rawItem: { id: 6 } },
|
|
160
|
+
{ rawItem: { id: 7 } },
|
|
161
|
+
{ rawItem: { id: 1 } },
|
|
162
|
+
{ rawItem: { id: 3 } },
|
|
163
|
+
{ rawItem: { id: 5 } }
|
|
164
|
+
],
|
|
165
|
+
{ toElementFn: rawElement => rawElement.rawItem.id }
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
expect([...heap.sort()]).toEqual([1, 3, 4, 5, 6, 7, 8]);
|
|
169
|
+
});
|
|
90
170
|
});
|
|
91
171
|
|
|
92
172
|
describe('FibonacciHeap', () => {
|
|
@@ -5,7 +5,7 @@ describe('MaxHeap', () => {
|
|
|
5
5
|
let maxHeap: MaxHeap<number>;
|
|
6
6
|
|
|
7
7
|
beforeEach(() => {
|
|
8
|
-
maxHeap = new MaxHeap([], { comparator: numberComparator });
|
|
8
|
+
maxHeap = new MaxHeap<number>([], { comparator: numberComparator });
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('add and poll elements in descending order', () => {
|
|
@@ -49,4 +49,47 @@ describe('MaxHeap', () => {
|
|
|
49
49
|
maxHeap.poll();
|
|
50
50
|
expect(maxHeap.isEmpty()).toBe(true);
|
|
51
51
|
});
|
|
52
|
+
|
|
53
|
+
it('should object heap map & filter', function () {
|
|
54
|
+
const maxHeap = new MaxHeap<{ a: string; key: number }>(
|
|
55
|
+
[
|
|
56
|
+
{ key: 1, a: 'a1' },
|
|
57
|
+
{ key: 6, a: 'a6' },
|
|
58
|
+
{ key: 5, a: 'a5' },
|
|
59
|
+
{ key: 3, a: 'a3' },
|
|
60
|
+
{ key: 2, a: 'a2' },
|
|
61
|
+
{ key: 4, a: 'a4' },
|
|
62
|
+
{ key: 0, a: 'a0' }
|
|
63
|
+
],
|
|
64
|
+
{ comparator: (a, b) => b.key - a.key }
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const mappedMaxHeap = maxHeap.map(
|
|
68
|
+
item => item.key,
|
|
69
|
+
(a, b) => b - a
|
|
70
|
+
);
|
|
71
|
+
expect(mappedMaxHeap.peek()).toBe(6);
|
|
72
|
+
expect(mappedMaxHeap.sort()).toEqual([6, 5, 4, 3, 2, 1, 0]);
|
|
73
|
+
|
|
74
|
+
const mappedToElementFnMaxHeap = maxHeap.map<
|
|
75
|
+
string,
|
|
76
|
+
{
|
|
77
|
+
id: string;
|
|
78
|
+
}
|
|
79
|
+
>(
|
|
80
|
+
item => item.key.toString(),
|
|
81
|
+
(a, b) => Number(b) - Number(a),
|
|
82
|
+
rawElement => rawElement.id
|
|
83
|
+
);
|
|
84
|
+
expect(mappedToElementFnMaxHeap.peek()).toBe('6');
|
|
85
|
+
expect(mappedToElementFnMaxHeap.sort()).toEqual(['6', '5', '4', '3', '2', '1', '0']);
|
|
86
|
+
|
|
87
|
+
const filteredHeap = maxHeap.filter(item => item.key > 3);
|
|
88
|
+
expect(filteredHeap.peek()).toEqual({ a: 'a6', key: 6 });
|
|
89
|
+
expect(filteredHeap.sort()).toEqual([
|
|
90
|
+
{ a: 'a6', key: 6 },
|
|
91
|
+
{ a: 'a5', key: 5 },
|
|
92
|
+
{ a: 'a4', key: 4 }
|
|
93
|
+
]);
|
|
94
|
+
});
|
|
52
95
|
});
|
|
@@ -5,7 +5,7 @@ describe('MinHeap', () => {
|
|
|
5
5
|
let minHeap: MinHeap<number>;
|
|
6
6
|
|
|
7
7
|
beforeEach(() => {
|
|
8
|
-
minHeap = new MinHeap([], { comparator: numberComparator });
|
|
8
|
+
minHeap = new MinHeap<number>([], { comparator: numberComparator });
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('add and poll elements in ascending order', () => {
|
|
@@ -40,6 +40,23 @@ describe('MinHeap', () => {
|
|
|
40
40
|
expect(sortedArray).toEqual([1, 2, 3, 4]);
|
|
41
41
|
});
|
|
42
42
|
|
|
43
|
+
it('should clone', function () {
|
|
44
|
+
const minHeap = new MinHeap<string>();
|
|
45
|
+
minHeap.add('1');
|
|
46
|
+
minHeap.add('6');
|
|
47
|
+
minHeap.add('2');
|
|
48
|
+
minHeap.add('0');
|
|
49
|
+
minHeap.add('5');
|
|
50
|
+
minHeap.add('9');
|
|
51
|
+
minHeap.delete('2');
|
|
52
|
+
expect([...minHeap]).toEqual(['0', '1', '9', '6', '5']);
|
|
53
|
+
const cloned = minHeap.clone();
|
|
54
|
+
expect([...cloned]).toEqual(['0', '1', '9', '6', '5']);
|
|
55
|
+
minHeap.delete('5');
|
|
56
|
+
expect([...minHeap]).toEqual(['0', '1', '9', '6']);
|
|
57
|
+
expect([...cloned]).toEqual(['0', '1', '9', '6', '5']);
|
|
58
|
+
});
|
|
59
|
+
|
|
43
60
|
it('check if the heap is empty', () => {
|
|
44
61
|
expect(minHeap.isEmpty()).toBe(true);
|
|
45
62
|
|
|
@@ -71,4 +71,46 @@ describe('MaxPriorityQueue Operation Test', () => {
|
|
|
71
71
|
expect(maxPQ.poll()?.keyA).toBe(3);
|
|
72
72
|
expect(maxPQ.poll()?.keyA).toBe(1);
|
|
73
73
|
});
|
|
74
|
+
|
|
75
|
+
it('should object priority queue', () => {
|
|
76
|
+
const maxPQ = new MaxPriorityQueue<{ rawItem: { id: number } }>(
|
|
77
|
+
[
|
|
78
|
+
{ rawItem: { id: 4 } },
|
|
79
|
+
{ rawItem: { id: 8 } },
|
|
80
|
+
{ rawItem: { id: 6 } },
|
|
81
|
+
{ rawItem: { id: 7 } },
|
|
82
|
+
{ rawItem: { id: 1 } },
|
|
83
|
+
{ rawItem: { id: 3 } },
|
|
84
|
+
{ rawItem: { id: 5 } }
|
|
85
|
+
],
|
|
86
|
+
{ comparator: (a, b) => b.rawItem.id - a.rawItem.id }
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
expect([...maxPQ.sort()]).toEqual([
|
|
90
|
+
{ rawItem: { id: 8 } },
|
|
91
|
+
{ rawItem: { id: 7 } },
|
|
92
|
+
{ rawItem: { id: 6 } },
|
|
93
|
+
{ rawItem: { id: 5 } },
|
|
94
|
+
{ rawItem: { id: 4 } },
|
|
95
|
+
{ rawItem: { id: 3 } },
|
|
96
|
+
{ rawItem: { id: 1 } }
|
|
97
|
+
]);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should toElementFn', () => {
|
|
101
|
+
const maxPQ = new MaxPriorityQueue<number, { rawItem: { id: number } }>(
|
|
102
|
+
[
|
|
103
|
+
{ rawItem: { id: 4 } },
|
|
104
|
+
{ rawItem: { id: 8 } },
|
|
105
|
+
{ rawItem: { id: 6 } },
|
|
106
|
+
{ rawItem: { id: 7 } },
|
|
107
|
+
{ rawItem: { id: 1 } },
|
|
108
|
+
{ rawItem: { id: 3 } },
|
|
109
|
+
{ rawItem: { id: 5 } }
|
|
110
|
+
],
|
|
111
|
+
{ toElementFn: rawElement => rawElement.rawItem.id }
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
expect([...maxPQ.sort()]).toEqual([8, 7, 6, 5, 4, 3, 1]);
|
|
115
|
+
});
|
|
74
116
|
});
|