data-structure-typed 2.4.5 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vitepress/cache/deps_temp_51f5f1b0/chunk-7OIKW5WK.js +12984 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/package.json +3 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vue_devtools-api.js +4505 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vitepress___@vueuse_core.js +9731 -0
- package/.vitepress/cache/deps_temp_51f5f1b0/vue.js +347 -0
- package/CHANGELOG.md +3 -1
- package/README.md +78 -31
- package/dist/cjs/binary-tree.cjs +23698 -0
- package/dist/cjs/graph.cjs +5236 -0
- package/dist/cjs/hash.cjs +1262 -0
- package/dist/cjs/heap.cjs +1540 -0
- package/dist/cjs/index.cjs +24509 -2899
- package/dist/cjs/linked-list.cjs +4370 -0
- package/dist/cjs/matrix.cjs +1042 -0
- package/dist/cjs/priority-queue.cjs +1314 -0
- package/dist/cjs/queue.cjs +4090 -0
- package/dist/cjs/stack.cjs +861 -0
- package/dist/cjs/trie.cjs +1173 -0
- package/dist/cjs-legacy/binary-tree.cjs +23730 -0
- package/dist/cjs-legacy/graph.cjs +5234 -0
- package/dist/cjs-legacy/hash.cjs +1262 -0
- package/dist/cjs-legacy/heap.cjs +1537 -0
- package/dist/cjs-legacy/index.cjs +32555 -10936
- package/dist/cjs-legacy/linked-list.cjs +4376 -0
- package/dist/cjs-legacy/matrix.cjs +1045 -0
- package/dist/cjs-legacy/priority-queue.cjs +1312 -0
- package/dist/cjs-legacy/queue.cjs +4088 -0
- package/dist/cjs-legacy/stack.cjs +861 -0
- package/dist/cjs-legacy/trie.cjs +1172 -0
- package/dist/esm/binary-tree.mjs +23683 -0
- package/dist/esm/graph.mjs +5223 -0
- package/dist/esm/hash.mjs +1259 -0
- package/dist/esm/heap.mjs +1534 -0
- package/dist/esm/index.mjs +24507 -2898
- package/dist/esm/linked-list.mjs +4363 -0
- package/dist/esm/matrix.mjs +1038 -0
- package/dist/esm/priority-queue.mjs +1310 -0
- package/dist/esm/queue.mjs +4086 -0
- package/dist/esm/stack.mjs +859 -0
- package/dist/esm/trie.mjs +1170 -0
- package/dist/esm-legacy/binary-tree.mjs +23715 -0
- package/dist/esm-legacy/graph.mjs +5221 -0
- package/dist/esm-legacy/hash.mjs +1259 -0
- package/dist/esm-legacy/heap.mjs +1531 -0
- package/dist/esm-legacy/index.mjs +32553 -10935
- package/dist/esm-legacy/linked-list.mjs +4369 -0
- package/dist/esm-legacy/matrix.mjs +1041 -0
- package/dist/esm-legacy/priority-queue.mjs +1308 -0
- package/dist/esm-legacy/queue.mjs +4084 -0
- package/dist/esm-legacy/stack.mjs +859 -0
- package/dist/esm-legacy/trie.mjs +1169 -0
- package/dist/types/data-structures/base/index.d.ts +1 -0
- package/dist/types/data-structures/base/iterable-element-base.d.ts +1 -1
- package/dist/types/data-structures/base/iterable-entry-base.d.ts +8 -8
- package/dist/types/data-structures/base/linear-base.d.ts +3 -3
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +368 -51
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +473 -147
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +931 -80
- package/dist/types/data-structures/binary-tree/bst.d.ts +792 -29
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +592 -32
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +320 -135
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +3662 -6
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3487 -201
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2778 -65
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +3414 -6
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +419 -47
- package/dist/types/data-structures/graph/map-graph.d.ts +59 -1
- package/dist/types/data-structures/graph/undirected-graph.d.ts +384 -59
- package/dist/types/data-structures/hash/hash-map.d.ts +462 -89
- package/dist/types/data-structures/heap/heap.d.ts +567 -99
- package/dist/types/data-structures/heap/max-heap.d.ts +46 -0
- package/dist/types/data-structures/heap/min-heap.d.ts +59 -0
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +631 -49
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +581 -68
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +775 -12
- package/dist/types/data-structures/matrix/matrix.d.ts +491 -0
- package/dist/types/data-structures/priority-queue/max-priority-queue.d.ts +57 -0
- package/dist/types/data-structures/priority-queue/min-priority-queue.d.ts +60 -0
- package/dist/types/data-structures/priority-queue/priority-queue.d.ts +60 -0
- package/dist/types/data-structures/queue/deque.d.ts +578 -71
- package/dist/types/data-structures/queue/queue.d.ts +451 -42
- package/dist/types/data-structures/stack/stack.d.ts +374 -32
- package/dist/types/data-structures/trie/trie.d.ts +458 -48
- package/dist/types/interfaces/graph.d.ts +1 -1
- package/dist/types/types/common.d.ts +2 -2
- package/dist/types/types/data-structures/binary-tree/segment-tree.d.ts +1 -1
- package/dist/types/types/data-structures/heap/heap.d.ts +1 -0
- package/dist/types/types/data-structures/linked-list/skip-linked-list.d.ts +1 -4
- package/dist/types/types/data-structures/priority-queue/priority-queue.d.ts +1 -0
- package/dist/types/types/utils/validate-type.d.ts +4 -4
- package/dist/umd/data-structure-typed.js +32432 -10808
- package/dist/umd/data-structure-typed.min.js +10 -4
- package/docs-site-docusaurus/README.md +41 -0
- package/docs-site-docusaurus/docs/api/README.md +52 -0
- package/docs-site-docusaurus/docs/api/classes/AVLTree.md +6130 -0
- package/docs-site-docusaurus/docs/api/classes/AVLTreeNode.md +282 -0
- package/docs-site-docusaurus/docs/api/classes/AbstractGraph.md +2266 -0
- package/docs-site-docusaurus/docs/api/classes/BST.md +5831 -0
- package/docs-site-docusaurus/docs/api/classes/BSTNode.md +333 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryIndexedTree.md +455 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryTree.md +4647 -0
- package/docs-site-docusaurus/docs/api/classes/BinaryTreeNode.md +331 -0
- package/docs-site-docusaurus/docs/api/classes/Deque.md +2767 -0
- package/docs-site-docusaurus/docs/api/classes/DirectedGraph.md +2999 -0
- package/docs-site-docusaurus/docs/api/classes/DoublyLinkedList.md +2685 -0
- package/docs-site-docusaurus/docs/api/classes/DoublyLinkedListNode.md +221 -0
- package/docs-site-docusaurus/docs/api/classes/FibonacciHeap.md +253 -0
- package/docs-site-docusaurus/docs/api/classes/FibonacciHeapNode.md +21 -0
- package/docs-site-docusaurus/docs/api/classes/HashMap.md +1333 -0
- package/docs-site-docusaurus/docs/api/classes/Heap.md +1881 -0
- package/docs-site-docusaurus/docs/api/classes/IterableElementBase.md +800 -0
- package/docs-site-docusaurus/docs/api/classes/IterableEntryBase.md +644 -0
- package/docs-site-docusaurus/docs/api/classes/LinearBase.md +1632 -0
- package/docs-site-docusaurus/docs/api/classes/LinearLinkedBase.md +1853 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedHashMap.md +1108 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedListNode.md +156 -0
- package/docs-site-docusaurus/docs/api/classes/LinkedListQueue.md +2824 -0
- package/docs-site-docusaurus/docs/api/classes/MapGraph.md +2929 -0
- package/docs-site-docusaurus/docs/api/classes/Matrix.md +1026 -0
- package/docs-site-docusaurus/docs/api/classes/MaxHeap.md +1866 -0
- package/docs-site-docusaurus/docs/api/classes/MaxPriorityQueue.md +1883 -0
- package/docs-site-docusaurus/docs/api/classes/MinHeap.md +1879 -0
- package/docs-site-docusaurus/docs/api/classes/MinPriorityQueue.md +1882 -0
- package/docs-site-docusaurus/docs/api/classes/Navigator.md +109 -0
- package/docs-site-docusaurus/docs/api/classes/PriorityQueue.md +1839 -0
- package/docs-site-docusaurus/docs/api/classes/Queue.md +2244 -0
- package/docs-site-docusaurus/docs/api/classes/RedBlackTree.md +6374 -0
- package/docs-site-docusaurus/docs/api/classes/SegmentTree.md +372 -0
- package/docs-site-docusaurus/docs/api/classes/SinglyLinkedList.md +2897 -0
- package/docs-site-docusaurus/docs/api/classes/SinglyLinkedListNode.md +169 -0
- package/docs-site-docusaurus/docs/api/classes/SkipList.md +1229 -0
- package/docs-site-docusaurus/docs/api/classes/Stack.md +1573 -0
- package/docs-site-docusaurus/docs/api/classes/TreeMap.md +1257 -0
- package/docs-site-docusaurus/docs/api/classes/TreeMultiMap.md +1475 -0
- package/docs-site-docusaurus/docs/api/classes/TreeSet.md +1117 -0
- package/docs-site-docusaurus/docs/api/classes/Trie.md +1708 -0
- package/docs-site-docusaurus/docs/api/classes/TrieNode.md +199 -0
- package/docs-site-docusaurus/docs/api/classes/UndirectedGraph.md +2979 -0
- package/docs-site-docusaurus/docs/guide/_category_.json +6 -0
- package/docs-site-docusaurus/docs/guide/architecture.md +613 -0
- package/docs-site-docusaurus/docs/guide/concepts.md +420 -0
- package/docs-site-docusaurus/docs/guide/guides.md +611 -0
- package/docs-site-docusaurus/docs/guide/installation.md +60 -0
- package/docs-site-docusaurus/docs/guide/integrations.md +823 -0
- package/docs-site-docusaurus/docs/guide/overview.md +638 -0
- package/docs-site-docusaurus/docs/guide/performance.md +833 -0
- package/docs-site-docusaurus/docs/guide/quick-start.md +73 -0
- package/docs-site-docusaurus/docusaurus.config.ts +159 -0
- package/docs-site-docusaurus/fix-mdx-generics.mjs +75 -0
- package/docs-site-docusaurus/package-lock.json +18667 -0
- package/docs-site-docusaurus/package.json +50 -0
- package/docs-site-docusaurus/prefix-class-to-methods.mjs +48 -0
- package/docs-site-docusaurus/sidebars.ts +23 -0
- package/docs-site-docusaurus/sort-protected.mjs +87 -0
- package/docs-site-docusaurus/src/css/custom.css +96 -0
- package/docs-site-docusaurus/src/pages/index.module.css +13 -0
- package/docs-site-docusaurus/src/pages/index.tsx +71 -0
- package/docs-site-docusaurus/src/pages/markdown-page.md +7 -0
- package/docs-site-docusaurus/src/theme/TOCItems/index.tsx +34 -0
- package/docs-site-docusaurus/static/.nojekyll +0 -0
- package/docs-site-docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docs-site-docusaurus/static/img/docusaurus.png +0 -0
- package/docs-site-docusaurus/static/img/favicon.ico +0 -0
- package/docs-site-docusaurus/static/img/favicon.png +0 -0
- package/docs-site-docusaurus/static/img/logo-180.png +0 -0
- package/docs-site-docusaurus/static/img/logo.jpg +0 -0
- package/docs-site-docusaurus/static/img/logo.png +0 -0
- package/docs-site-docusaurus/static/img/logo.svg +1 -0
- package/docs-site-docusaurus/static/img/og-image.png +0 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
- package/docs-site-docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docs-site-docusaurus/static/robots.txt +4 -0
- package/docs-site-docusaurus/typedoc.json +23 -0
- package/package.json +109 -12
- package/src/data-structures/base/index.ts +1 -0
- package/src/data-structures/base/iterable-element-base.ts +4 -5
- package/src/data-structures/base/iterable-entry-base.ts +8 -8
- package/src/data-structures/base/linear-base.ts +3 -3
- package/src/data-structures/binary-tree/avl-tree.ts +386 -51
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +596 -247
- package/src/data-structures/binary-tree/binary-tree.ts +956 -81
- package/src/data-structures/binary-tree/bst.ts +840 -35
- package/src/data-structures/binary-tree/red-black-tree.ts +689 -97
- package/src/data-structures/binary-tree/segment-tree.ts +498 -249
- package/src/data-structures/binary-tree/tree-map.ts +3784 -7
- package/src/data-structures/binary-tree/tree-multi-map.ts +3614 -211
- package/src/data-structures/binary-tree/tree-multi-set.ts +2874 -65
- package/src/data-structures/binary-tree/tree-set.ts +3531 -10
- package/src/data-structures/graph/abstract-graph.ts +4 -4
- package/src/data-structures/graph/directed-graph.ts +429 -47
- package/src/data-structures/graph/map-graph.ts +59 -1
- package/src/data-structures/graph/undirected-graph.ts +393 -59
- package/src/data-structures/hash/hash-map.ts +476 -92
- package/src/data-structures/heap/heap.ts +581 -99
- package/src/data-structures/heap/max-heap.ts +46 -0
- package/src/data-structures/heap/min-heap.ts +59 -0
- package/src/data-structures/linked-list/doubly-linked-list.ts +646 -47
- package/src/data-structures/linked-list/singly-linked-list.ts +596 -68
- package/src/data-structures/linked-list/skip-linked-list.ts +1067 -90
- package/src/data-structures/matrix/matrix.ts +584 -12
- package/src/data-structures/priority-queue/max-priority-queue.ts +57 -0
- package/src/data-structures/priority-queue/min-priority-queue.ts +60 -0
- package/src/data-structures/priority-queue/priority-queue.ts +60 -0
- package/src/data-structures/queue/deque.ts +592 -70
- package/src/data-structures/queue/queue.ts +463 -42
- package/src/data-structures/stack/stack.ts +384 -32
- package/src/data-structures/trie/trie.ts +470 -48
- package/src/interfaces/graph.ts +1 -1
- package/src/types/common.ts +2 -2
- package/src/types/data-structures/binary-tree/segment-tree.ts +1 -1
- package/src/types/data-structures/heap/heap.ts +1 -0
- package/src/types/data-structures/linked-list/skip-linked-list.ts +2 -1
- package/src/types/data-structures/priority-queue/priority-queue.ts +1 -0
- package/src/types/utils/validate-type.ts +4 -4
- package/vercel.json +6 -0
- package/dist/leetcode/avl-tree-counter.mjs +0 -2957
- package/dist/leetcode/avl-tree-multi-map.mjs +0 -2889
- package/dist/leetcode/avl-tree.mjs +0 -2720
- package/dist/leetcode/binary-tree.mjs +0 -1594
- package/dist/leetcode/bst.mjs +0 -2398
- package/dist/leetcode/deque.mjs +0 -683
- package/dist/leetcode/directed-graph.mjs +0 -1733
- package/dist/leetcode/doubly-linked-list.mjs +0 -709
- package/dist/leetcode/hash-map.mjs +0 -493
- package/dist/leetcode/heap.mjs +0 -542
- package/dist/leetcode/max-heap.mjs +0 -375
- package/dist/leetcode/max-priority-queue.mjs +0 -383
- package/dist/leetcode/min-heap.mjs +0 -363
- package/dist/leetcode/min-priority-queue.mjs +0 -371
- package/dist/leetcode/priority-queue.mjs +0 -363
- package/dist/leetcode/queue.mjs +0 -943
- package/dist/leetcode/red-black-tree.mjs +0 -2765
- package/dist/leetcode/singly-linked-list.mjs +0 -754
- package/dist/leetcode/stack.mjs +0 -217
- package/dist/leetcode/tree-counter.mjs +0 -3039
- package/dist/leetcode/tree-multi-map.mjs +0 -2913
- package/dist/leetcode/trie.mjs +0 -413
- package/dist/leetcode/undirected-graph.mjs +0 -1650
|
@@ -23,105 +23,6 @@ import { IterableElementBase } from '../base';
|
|
|
23
23
|
* 7. Efficient Sorting Algorithms: For example, heap sort. Heap sort uses the properties of a heap to sort elements.
|
|
24
24
|
* 8. Graph Algorithms: Such as Dijkstra's shortest path algorithm and Prime's minimum-spanning tree algorithm, which use heaps to improve performance.
|
|
25
25
|
* @example
|
|
26
|
-
* // basic Heap creation and add operation
|
|
27
|
-
* // Create a min heap (default)
|
|
28
|
-
* const minHeap = new Heap([5, 3, 7, 1, 9, 2]);
|
|
29
|
-
*
|
|
30
|
-
* // Verify size
|
|
31
|
-
* console.log(minHeap.size); // 6;
|
|
32
|
-
*
|
|
33
|
-
* // Add new element
|
|
34
|
-
* minHeap.add(4);
|
|
35
|
-
* console.log(minHeap.size); // 7;
|
|
36
|
-
*
|
|
37
|
-
* // Min heap property: smallest element at root
|
|
38
|
-
* const min = minHeap.peek();
|
|
39
|
-
* console.log(min); // 1;
|
|
40
|
-
* @example
|
|
41
|
-
* // Heap with custom comparator (MaxHeap behavior)
|
|
42
|
-
* interface Task {
|
|
43
|
-
* id: number;
|
|
44
|
-
* priority: number;
|
|
45
|
-
* name: string;
|
|
46
|
-
* }
|
|
47
|
-
*
|
|
48
|
-
* // Custom comparator for max heap behavior (higher priority first)
|
|
49
|
-
* const tasks: Task[] = [
|
|
50
|
-
* { id: 1, priority: 5, name: 'Email' },
|
|
51
|
-
* { id: 2, priority: 3, name: 'Chat' },
|
|
52
|
-
* { id: 3, priority: 8, name: 'Alert' }
|
|
53
|
-
* ];
|
|
54
|
-
*
|
|
55
|
-
* const maxHeap = new Heap(tasks, {
|
|
56
|
-
* comparator: (a: Task, b: Task) => b.priority - a.priority
|
|
57
|
-
* });
|
|
58
|
-
*
|
|
59
|
-
* console.log(maxHeap.size); // 3;
|
|
60
|
-
*
|
|
61
|
-
* // Peek returns highest priority task
|
|
62
|
-
* const topTask = maxHeap.peek();
|
|
63
|
-
* console.log(topTask?.priority); // 8;
|
|
64
|
-
* console.log(topTask?.name); // 'Alert';
|
|
65
|
-
* @example
|
|
66
|
-
* // Heap for event processing with priority
|
|
67
|
-
* interface Event {
|
|
68
|
-
* id: number;
|
|
69
|
-
* type: 'critical' | 'warning' | 'info';
|
|
70
|
-
* timestamp: number;
|
|
71
|
-
* message: string;
|
|
72
|
-
* }
|
|
73
|
-
*
|
|
74
|
-
* // Custom priority: critical > warning > info
|
|
75
|
-
* const priorityMap = { critical: 3, warning: 2, info: 1 };
|
|
76
|
-
*
|
|
77
|
-
* const eventHeap = new Heap<Event>([], {
|
|
78
|
-
* comparator: (a: Event, b: Event) => {
|
|
79
|
-
* const priorityA = priorityMap[a.type];
|
|
80
|
-
* const priorityB = priorityMap[b.type];
|
|
81
|
-
* return priorityB - priorityA; // Higher priority first
|
|
82
|
-
* }
|
|
83
|
-
* });
|
|
84
|
-
*
|
|
85
|
-
* // Add events in random order
|
|
86
|
-
* eventHeap.add({ id: 1, type: 'info', timestamp: 100, message: 'User logged in' });
|
|
87
|
-
* eventHeap.add({ id: 2, type: 'critical', timestamp: 101, message: 'Server down' });
|
|
88
|
-
* eventHeap.add({ id: 3, type: 'warning', timestamp: 102, message: 'High memory' });
|
|
89
|
-
* eventHeap.add({ id: 4, type: 'info', timestamp: 103, message: 'Cache cleared' });
|
|
90
|
-
* eventHeap.add({ id: 5, type: 'critical', timestamp: 104, message: 'Database error' });
|
|
91
|
-
*
|
|
92
|
-
* console.log(eventHeap.size); // 5;
|
|
93
|
-
*
|
|
94
|
-
* // Process events by priority (critical first)
|
|
95
|
-
* const processedOrder: Event[] = [];
|
|
96
|
-
* while (eventHeap.size > 0) {
|
|
97
|
-
* const event = eventHeap.poll();
|
|
98
|
-
* if (event) {
|
|
99
|
-
* processedOrder.push(event);
|
|
100
|
-
* }
|
|
101
|
-
* }
|
|
102
|
-
*
|
|
103
|
-
* // Verify critical events came first
|
|
104
|
-
* console.log(processedOrder[0].type); // 'critical';
|
|
105
|
-
* console.log(processedOrder[1].type); // 'critical';
|
|
106
|
-
* console.log(processedOrder[2].type); // 'warning';
|
|
107
|
-
* console.log(processedOrder[3].type); // 'info';
|
|
108
|
-
* console.log(processedOrder[4].type); // 'info';
|
|
109
|
-
*
|
|
110
|
-
* // Verify O(log n) operations
|
|
111
|
-
* const newHeap = new Heap<number>([5, 3, 7, 1]);
|
|
112
|
-
*
|
|
113
|
-
* // Add - O(log n)
|
|
114
|
-
* newHeap.add(2);
|
|
115
|
-
* console.log(newHeap.size); // 5;
|
|
116
|
-
*
|
|
117
|
-
* // Poll - O(log n)
|
|
118
|
-
* const removed = newHeap.poll();
|
|
119
|
-
* console.log(removed); // 1;
|
|
120
|
-
*
|
|
121
|
-
* // Peek - O(1)
|
|
122
|
-
* const top = newHeap.peek();
|
|
123
|
-
* console.log(top); // 2;
|
|
124
|
-
* @example
|
|
125
26
|
* // Use Heap to solve top k problems
|
|
126
27
|
* function topKElements(arr: number[], k: number): number[] {
|
|
127
28
|
* const heap = new Heap<number>([], { comparator: (a, b) => b - a }); // Max heap
|
|
@@ -236,6 +137,12 @@ import { IterableElementBase } from '../base';
|
|
|
236
137
|
* ['Task5', 4]
|
|
237
138
|
* ]);
|
|
238
139
|
* console.log(scheduleTasks(tasks, 2)); // expectedMap;
|
|
140
|
+
* @example
|
|
141
|
+
* // Get all elements as array
|
|
142
|
+
* const heap = new Heap<number>([5, 1, 3, 2, 4]);
|
|
143
|
+
* const arr = heap.toArray();
|
|
144
|
+
* console.log(arr.length); // 5;
|
|
145
|
+
* console.log(arr.sort()); // [1, 2, 3, 4, 5];
|
|
239
146
|
*/
|
|
240
147
|
export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
241
148
|
protected _equals: (a: E, b: E) => boolean;
|
|
@@ -258,6 +165,46 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
258
165
|
* Get the number of elements.
|
|
259
166
|
* @remarks Time O(1), Space O(1)
|
|
260
167
|
* @returns Heap size.
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
* @example
|
|
200
|
+
* // Track heap capacity
|
|
201
|
+
* const heap = new Heap<number>();
|
|
202
|
+
* console.log(heap.size); // 0;
|
|
203
|
+
* heap.add(10);
|
|
204
|
+
* heap.add(20);
|
|
205
|
+
* console.log(heap.size); // 2;
|
|
206
|
+
* heap.poll();
|
|
207
|
+
* console.log(heap.size); // 1;
|
|
261
208
|
*/
|
|
262
209
|
get size(): number;
|
|
263
210
|
/**
|
|
@@ -292,6 +239,52 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
292
239
|
* @remarks Time O(1) amortized, Space O(1)
|
|
293
240
|
* @param element - Element to insert.
|
|
294
241
|
* @returns True.
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
* @example
|
|
274
|
+
* // basic Heap creation and add operation
|
|
275
|
+
* // Create a min heap (default)
|
|
276
|
+
* const minHeap = new Heap([5, 3, 7, 1, 9, 2]);
|
|
277
|
+
*
|
|
278
|
+
* // Verify size
|
|
279
|
+
* console.log(minHeap.size); // 6;
|
|
280
|
+
*
|
|
281
|
+
* // Add new element
|
|
282
|
+
* minHeap.add(4);
|
|
283
|
+
* console.log(minHeap.size); // 7;
|
|
284
|
+
*
|
|
285
|
+
* // Min heap property: smallest element at root
|
|
286
|
+
* const min = minHeap.peek();
|
|
287
|
+
* console.log(min); // 1;
|
|
295
288
|
*/
|
|
296
289
|
add(element: E): boolean;
|
|
297
290
|
/**
|
|
@@ -299,30 +292,279 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
299
292
|
* @remarks Time O(N log N), Space O(1)
|
|
300
293
|
* @param elements - Iterable of elements or raw values.
|
|
301
294
|
* @returns Array of per-element success flags.
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
* @example
|
|
324
|
+
* // Add multiple elements
|
|
325
|
+
* const heap = new Heap<number>([], { comparator: (a, b) => a - b });
|
|
326
|
+
* heap.addMany([5, 3, 7, 1]);
|
|
327
|
+
* console.log(heap.peek()); // 1;
|
|
328
|
+
* console.log(heap.size); // 4;
|
|
302
329
|
*/
|
|
303
330
|
addMany(elements: Iterable<E | R>): boolean[];
|
|
304
331
|
/**
|
|
305
332
|
* Remove and return the top element.
|
|
306
333
|
* @remarks Time O(log N), Space O(1)
|
|
307
334
|
* @returns Top element or undefined.
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
* @example
|
|
367
|
+
* // Heap with custom comparator (MaxHeap behavior)
|
|
368
|
+
* interface Task {
|
|
369
|
+
* id: number;
|
|
370
|
+
* priority: number;
|
|
371
|
+
* name: string;
|
|
372
|
+
* }
|
|
373
|
+
*
|
|
374
|
+
* // Custom comparator for max heap behavior (higher priority first)
|
|
375
|
+
* const tasks: Task[] = [
|
|
376
|
+
* { id: 1, priority: 5, name: 'Email' },
|
|
377
|
+
* { id: 2, priority: 3, name: 'Chat' },
|
|
378
|
+
* { id: 3, priority: 8, name: 'Alert' }
|
|
379
|
+
* ];
|
|
380
|
+
*
|
|
381
|
+
* const maxHeap = new Heap(tasks, {
|
|
382
|
+
* comparator: (a: Task, b: Task) => b.priority - a.priority
|
|
383
|
+
* });
|
|
384
|
+
*
|
|
385
|
+
* console.log(maxHeap.size); // 3;
|
|
386
|
+
*
|
|
387
|
+
* // Peek returns highest priority task
|
|
388
|
+
* const topTask = maxHeap.peek();
|
|
389
|
+
* console.log(topTask?.priority); // 8;
|
|
390
|
+
* console.log(topTask?.name); // 'Alert';
|
|
308
391
|
*/
|
|
309
392
|
poll(): E | undefined;
|
|
310
393
|
/**
|
|
311
394
|
* Get the current top element without removing it.
|
|
312
395
|
* @remarks Time O(1), Space O(1)
|
|
313
396
|
* @returns Top element or undefined.
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
* @example
|
|
429
|
+
* // Heap for event processing with priority
|
|
430
|
+
* interface Event {
|
|
431
|
+
* id: number;
|
|
432
|
+
* type: 'critical' | 'warning' | 'info';
|
|
433
|
+
* timestamp: number;
|
|
434
|
+
* message: string;
|
|
435
|
+
* }
|
|
436
|
+
*
|
|
437
|
+
* // Custom priority: critical > warning > info
|
|
438
|
+
* const priorityMap = { critical: 3, warning: 2, info: 1 };
|
|
439
|
+
*
|
|
440
|
+
* const eventHeap = new Heap<Event>([], {
|
|
441
|
+
* comparator: (a: Event, b: Event) => {
|
|
442
|
+
* const priorityA = priorityMap[a.type];
|
|
443
|
+
* const priorityB = priorityMap[b.type];
|
|
444
|
+
* return priorityB - priorityA; // Higher priority first
|
|
445
|
+
* }
|
|
446
|
+
* });
|
|
447
|
+
*
|
|
448
|
+
* // Add events in random order
|
|
449
|
+
* eventHeap.add({ id: 1, type: 'info', timestamp: 100, message: 'User logged in' });
|
|
450
|
+
* eventHeap.add({ id: 2, type: 'critical', timestamp: 101, message: 'Server down' });
|
|
451
|
+
* eventHeap.add({ id: 3, type: 'warning', timestamp: 102, message: 'High memory' });
|
|
452
|
+
* eventHeap.add({ id: 4, type: 'info', timestamp: 103, message: 'Cache cleared' });
|
|
453
|
+
* eventHeap.add({ id: 5, type: 'critical', timestamp: 104, message: 'Database error' });
|
|
454
|
+
*
|
|
455
|
+
* console.log(eventHeap.size); // 5;
|
|
456
|
+
*
|
|
457
|
+
* // Process events by priority (critical first)
|
|
458
|
+
* const processedOrder: Event[] = [];
|
|
459
|
+
* while (eventHeap.size > 0) {
|
|
460
|
+
* const event = eventHeap.poll();
|
|
461
|
+
* if (event) {
|
|
462
|
+
* processedOrder.push(event);
|
|
463
|
+
* }
|
|
464
|
+
* }
|
|
465
|
+
*
|
|
466
|
+
* // Verify critical events came first
|
|
467
|
+
* console.log(processedOrder[0].type); // 'critical';
|
|
468
|
+
* console.log(processedOrder[1].type); // 'critical';
|
|
469
|
+
* console.log(processedOrder[2].type); // 'warning';
|
|
470
|
+
* console.log(processedOrder[3].type); // 'info';
|
|
471
|
+
* console.log(processedOrder[4].type); // 'info';
|
|
472
|
+
*
|
|
473
|
+
* // Verify O(log n) operations
|
|
474
|
+
* const newHeap = new Heap<number>([5, 3, 7, 1]);
|
|
475
|
+
*
|
|
476
|
+
* // Add - O(log n)
|
|
477
|
+
* newHeap.add(2);
|
|
478
|
+
* console.log(newHeap.size); // 5;
|
|
479
|
+
*
|
|
480
|
+
* // Poll - O(log n)
|
|
481
|
+
* const removed = newHeap.poll();
|
|
482
|
+
* console.log(removed); // 1;
|
|
483
|
+
*
|
|
484
|
+
* // Peek - O(1)
|
|
485
|
+
* const top = newHeap.peek();
|
|
486
|
+
* console.log(top); // 2;
|
|
314
487
|
*/
|
|
315
488
|
peek(): E | undefined;
|
|
316
489
|
/**
|
|
317
490
|
* Check whether the heap is empty.
|
|
318
491
|
* @remarks Time O(1), Space O(1)
|
|
319
492
|
* @returns True if size is 0.
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
|
|
505
|
+
|
|
506
|
+
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
* @example
|
|
523
|
+
* // Check if heap is empty
|
|
524
|
+
* const heap = new Heap<number>([], { comparator: (a, b) => a - b });
|
|
525
|
+
* console.log(heap.isEmpty()); // true;
|
|
526
|
+
* heap.add(1);
|
|
527
|
+
* console.log(heap.isEmpty()); // false;
|
|
320
528
|
*/
|
|
321
529
|
isEmpty(): boolean;
|
|
322
530
|
/**
|
|
323
531
|
* Remove all elements.
|
|
324
532
|
* @remarks Time O(1), Space O(1)
|
|
325
533
|
* @returns void
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
|
|
551
|
+
|
|
552
|
+
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
* @example
|
|
564
|
+
* // Remove all elements
|
|
565
|
+
* const heap = new Heap<number>([1, 2, 3], { comparator: (a, b) => a - b });
|
|
566
|
+
* heap.clear();
|
|
567
|
+
* console.log(heap.isEmpty()); // true;
|
|
326
568
|
*/
|
|
327
569
|
clear(): void;
|
|
328
570
|
/**
|
|
@@ -337,6 +579,33 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
337
579
|
* @remarks Time O(N), Space O(1)
|
|
338
580
|
* @param element - Element to search for.
|
|
339
581
|
* @returns True if found.
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
|
|
587
|
+
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
|
|
598
|
+
|
|
599
|
+
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
* @example
|
|
605
|
+
* // Check element existence
|
|
606
|
+
* const heap = new Heap<number>([3, 1, 2], { comparator: (a, b) => a - b });
|
|
607
|
+
* console.log(heap.has(1)); // true;
|
|
608
|
+
* console.log(heap.has(99)); // false;
|
|
340
609
|
*/
|
|
341
610
|
has(element: E): boolean;
|
|
342
611
|
/**
|
|
@@ -344,6 +613,39 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
344
613
|
* @remarks Time O(N), Space O(1)
|
|
345
614
|
* @param element - Element to delete.
|
|
346
615
|
* @returns True if an element was removed.
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
|
|
630
|
+
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
* @example
|
|
645
|
+
* // Remove specific element
|
|
646
|
+
* const heap = new Heap<number>([3, 1, 4, 1, 5], { comparator: (a, b) => a - b });
|
|
647
|
+
* heap.delete(4);
|
|
648
|
+
* console.log(heap.toArray().includes(4)); // false;
|
|
347
649
|
*/
|
|
348
650
|
delete(element: E): boolean;
|
|
349
651
|
/**
|
|
@@ -365,6 +667,33 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
365
667
|
* @remarks Time O(N), Space O(H)
|
|
366
668
|
* @param [order] - Traversal order: 'PRE' | 'IN' | 'POST'.
|
|
367
669
|
* @returns Array of visited elements.
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
|
|
673
|
+
|
|
674
|
+
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
|
|
679
|
+
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
|
|
686
|
+
|
|
687
|
+
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
* @example
|
|
693
|
+
* // Depth-first traversal
|
|
694
|
+
* const heap = new Heap<number>([3, 1, 2], { comparator: (a, b) => a - b });
|
|
695
|
+
* const result = heap.dfs('IN');
|
|
696
|
+
* console.log(result.length); // 3;
|
|
368
697
|
*/
|
|
369
698
|
dfs(order?: DFSOrderPattern): E[];
|
|
370
699
|
/**
|
|
@@ -377,12 +706,84 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
377
706
|
* Return all elements in ascending order by repeatedly polling.
|
|
378
707
|
* @remarks Time O(N log N), Space O(N)
|
|
379
708
|
* @returns Sorted array of elements.
|
|
709
|
+
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
|
|
714
|
+
|
|
715
|
+
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
|
|
719
|
+
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
|
|
727
|
+
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
|
|
739
|
+
|
|
740
|
+
* @example
|
|
741
|
+
* // Sort elements using heap
|
|
742
|
+
* const heap = new Heap<number>([5, 1, 3, 2, 4]);
|
|
743
|
+
* const sorted = heap.sort();
|
|
744
|
+
* console.log(sorted); // [1, 2, 3, 4, 5];
|
|
380
745
|
*/
|
|
381
746
|
sort(): E[];
|
|
382
747
|
/**
|
|
383
748
|
* Deep clone this heap.
|
|
384
749
|
* @remarks Time O(N), Space O(N)
|
|
385
750
|
* @returns A new heap with the same elements.
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
|
|
755
|
+
|
|
756
|
+
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
|
|
765
|
+
|
|
766
|
+
|
|
767
|
+
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
|
|
775
|
+
|
|
776
|
+
|
|
777
|
+
|
|
778
|
+
|
|
779
|
+
|
|
780
|
+
* @example
|
|
781
|
+
* // Create independent copy
|
|
782
|
+
* const heap = new Heap<number>([3, 1, 4], { comparator: (a, b) => a - b });
|
|
783
|
+
* const copy = heap.clone();
|
|
784
|
+
* copy.poll();
|
|
785
|
+
* console.log(heap.size); // 3;
|
|
786
|
+
* console.log(copy.size); // 2;
|
|
386
787
|
*/
|
|
387
788
|
clone(): this;
|
|
388
789
|
/**
|
|
@@ -391,6 +792,40 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
391
792
|
* @param callback - Predicate (element, index, heap) → boolean to keep element.
|
|
392
793
|
* @param [thisArg] - Value for `this` inside the callback.
|
|
393
794
|
* @returns A new heap with the kept elements.
|
|
795
|
+
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
|
|
799
|
+
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
|
|
818
|
+
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
|
|
822
|
+
|
|
823
|
+
|
|
824
|
+
* @example
|
|
825
|
+
* // Filter elements
|
|
826
|
+
* const heap = new Heap<number>([1, 2, 3, 4, 5], { comparator: (a, b) => a - b });
|
|
827
|
+
* const evens = heap.filter(x => x % 2 === 0);
|
|
828
|
+
* console.log(evens.size); // 2;
|
|
394
829
|
*/
|
|
395
830
|
filter(callback: ElementCallback<E, R, boolean>, thisArg?: unknown): this;
|
|
396
831
|
/**
|
|
@@ -402,6 +837,39 @@ export declare class Heap<E = any, R = any> extends IterableElementBase<E, R> {
|
|
|
402
837
|
* @param options - Options for the output heap, including comparator for EM.
|
|
403
838
|
* @param [thisArg] - Value for `this` inside the callback.
|
|
404
839
|
* @returns A new heap with mapped elements.
|
|
840
|
+
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
|
|
852
|
+
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
|
|
862
|
+
|
|
863
|
+
|
|
864
|
+
|
|
865
|
+
|
|
866
|
+
|
|
867
|
+
|
|
868
|
+
* @example
|
|
869
|
+
* // Transform elements
|
|
870
|
+
* const heap = new Heap<number>([1, 2, 3], { comparator: (a, b) => a - b });
|
|
871
|
+
* const doubled = heap.map(x => x * 2, { comparator: (a, b) => a - b });
|
|
872
|
+
* console.log(doubled.peek()); // 2;
|
|
405
873
|
*/
|
|
406
874
|
map<EM, RM>(callback: ElementCallback<E, R, EM>, options: HeapOptions<EM, RM> & {
|
|
407
875
|
comparator: Comparator<EM>;
|