heap-typed 2.2.2 → 2.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -60
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs.map +1 -1
- package/dist/types/data-structures/binary-tree/avl-tree-counter.d.ts +2 -2
- package/dist/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +5 -5
- package/dist/types/data-structures/binary-tree/avl-tree.d.ts +98 -5
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +103 -7
- package/dist/types/data-structures/binary-tree/bst.d.ts +202 -39
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +86 -37
- package/dist/types/data-structures/binary-tree/tree-counter.d.ts +4 -5
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +7 -7
- package/dist/types/data-structures/graph/directed-graph.d.ts +126 -1
- package/dist/types/data-structures/graph/undirected-graph.d.ts +160 -1
- package/dist/types/data-structures/hash/hash-map.d.ts +110 -27
- package/dist/types/data-structures/heap/heap.d.ts +107 -58
- package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +72 -404
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +121 -5
- package/dist/types/data-structures/queue/deque.d.ts +95 -67
- package/dist/types/data-structures/queue/queue.d.ts +90 -34
- package/dist/types/data-structures/stack/stack.d.ts +58 -40
- package/dist/types/data-structures/trie/trie.d.ts +109 -47
- package/dist/types/interfaces/binary-tree.d.ts +1 -0
- package/dist/types/types/data-structures/binary-tree/bst.d.ts +5 -5
- package/dist/umd/heap-typed.js.map +1 -1
- package/dist/umd/heap-typed.min.js.map +1 -1
- package/package.json +2 -2
- package/src/data-structures/binary-tree/avl-tree-counter.ts +1 -2
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +7 -8
- package/src/data-structures/binary-tree/avl-tree.ts +100 -7
- package/src/data-structures/binary-tree/binary-tree.ts +117 -7
- package/src/data-structures/binary-tree/bst.ts +431 -93
- package/src/data-structures/binary-tree/red-black-tree.ts +85 -37
- package/src/data-structures/binary-tree/tree-counter.ts +5 -7
- package/src/data-structures/binary-tree/tree-multi-map.ts +9 -10
- package/src/data-structures/graph/directed-graph.ts +126 -1
- package/src/data-structures/graph/undirected-graph.ts +160 -1
- package/src/data-structures/hash/hash-map.ts +110 -27
- package/src/data-structures/heap/heap.ts +107 -58
- package/src/data-structures/linked-list/doubly-linked-list.ts +72 -404
- package/src/data-structures/linked-list/singly-linked-list.ts +121 -5
- package/src/data-structures/queue/deque.ts +95 -67
- package/src/data-structures/queue/queue.ts +90 -34
- package/src/data-structures/stack/stack.ts +58 -40
- package/src/data-structures/trie/trie.ts +109 -47
- package/src/interfaces/binary-tree.ts +2 -0
- package/src/types/data-structures/binary-tree/bst.ts +5 -5
package/README.md
CHANGED
|
@@ -34,24 +34,114 @@ yarn add heap-typed
|
|
|
34
34
|
|
|
35
35
|
[//]: # (No deletion!!! Start of Example Replace Section)
|
|
36
36
|
|
|
37
|
-
###
|
|
37
|
+
### basic Heap creation and add operation
|
|
38
38
|
```typescript
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
// Create a min heap (default)
|
|
40
|
+
const minHeap = new Heap([5, 3, 7, 1, 9, 2]);
|
|
41
|
+
|
|
42
|
+
// Verify size
|
|
43
|
+
console.log(minHeap.size); // 6;
|
|
44
|
+
|
|
45
|
+
// Add new element
|
|
46
|
+
minHeap.add(4);
|
|
47
|
+
console.log(minHeap.size); // 7;
|
|
48
|
+
|
|
49
|
+
// Min heap property: smallest element at root
|
|
50
|
+
const min = minHeap.peek();
|
|
51
|
+
console.log(min); // 1;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Heap with custom comparator (MaxHeap behavior)
|
|
55
|
+
```typescript
|
|
56
|
+
interface Task {
|
|
57
|
+
id: number;
|
|
58
|
+
priority: number;
|
|
59
|
+
name: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Custom comparator for max heap behavior (higher priority first)
|
|
63
|
+
const tasks: Task[] = [
|
|
64
|
+
{ id: 1, priority: 5, name: 'Email' },
|
|
65
|
+
{ id: 2, priority: 3, name: 'Chat' },
|
|
66
|
+
{ id: 3, priority: 8, name: 'Alert' }
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
const maxHeap = new Heap(tasks, {
|
|
70
|
+
comparator: (a: Task, b: Task) => b.priority - a.priority
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
console.log(maxHeap.size); // 3;
|
|
74
|
+
|
|
75
|
+
// Peek returns highest priority task
|
|
76
|
+
const topTask = maxHeap.peek();
|
|
77
|
+
console.log(topTask?.priority); // 8;
|
|
78
|
+
console.log(topTask?.name); // 'Alert';
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Heap for event processing with priority
|
|
82
|
+
```typescript
|
|
83
|
+
interface Event {
|
|
84
|
+
id: number;
|
|
85
|
+
type: 'critical' | 'warning' | 'info';
|
|
86
|
+
timestamp: number;
|
|
87
|
+
message: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Custom priority: critical > warning > info
|
|
91
|
+
const priorityMap = { critical: 3, warning: 2, info: 1 };
|
|
92
|
+
|
|
93
|
+
const eventHeap = new Heap<Event>([], {
|
|
94
|
+
comparator: (a: Event, b: Event) => {
|
|
95
|
+
const priorityA = priorityMap[a.type];
|
|
96
|
+
const priorityB = priorityMap[b.type];
|
|
97
|
+
return priorityB - priorityA; // Higher priority first
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Add events in random order
|
|
102
|
+
eventHeap.add({ id: 1, type: 'info', timestamp: 100, message: 'User logged in' });
|
|
103
|
+
eventHeap.add({ id: 2, type: 'critical', timestamp: 101, message: 'Server down' });
|
|
104
|
+
eventHeap.add({ id: 3, type: 'warning', timestamp: 102, message: 'High memory' });
|
|
105
|
+
eventHeap.add({ id: 4, type: 'info', timestamp: 103, message: 'Cache cleared' });
|
|
106
|
+
eventHeap.add({ id: 5, type: 'critical', timestamp: 104, message: 'Database error' });
|
|
107
|
+
|
|
108
|
+
console.log(eventHeap.size); // 5;
|
|
109
|
+
|
|
110
|
+
// Process events by priority (critical first)
|
|
111
|
+
const processedOrder: Event[] = [];
|
|
112
|
+
while (eventHeap.size > 0) {
|
|
113
|
+
const event = eventHeap.poll();
|
|
114
|
+
if (event) {
|
|
115
|
+
processedOrder.push(event);
|
|
44
116
|
}
|
|
45
|
-
return sorted;
|
|
46
117
|
}
|
|
47
118
|
|
|
48
|
-
|
|
49
|
-
console.log(
|
|
119
|
+
// Verify critical events came first
|
|
120
|
+
console.log(processedOrder[0].type); // 'critical';
|
|
121
|
+
console.log(processedOrder[1].type); // 'critical';
|
|
122
|
+
console.log(processedOrder[2].type); // 'warning';
|
|
123
|
+
console.log(processedOrder[3].type); // 'info';
|
|
124
|
+
console.log(processedOrder[4].type); // 'info';
|
|
125
|
+
|
|
126
|
+
// Verify O(log n) operations
|
|
127
|
+
const newHeap = new Heap<number>([5, 3, 7, 1]);
|
|
128
|
+
|
|
129
|
+
// Add - O(log n)
|
|
130
|
+
newHeap.add(2);
|
|
131
|
+
console.log(newHeap.size); // 5;
|
|
132
|
+
|
|
133
|
+
// Poll - O(log n)
|
|
134
|
+
const removed = newHeap.poll();
|
|
135
|
+
console.log(removed); // 1;
|
|
136
|
+
|
|
137
|
+
// Peek - O(1)
|
|
138
|
+
const top = newHeap.peek();
|
|
139
|
+
console.log(top); // 2;
|
|
50
140
|
```
|
|
51
141
|
|
|
52
142
|
### Use Heap to solve top k problems
|
|
53
143
|
```typescript
|
|
54
|
-
|
|
144
|
+
function topKElements(arr: number[], k: number): number[] {
|
|
55
145
|
const heap = new Heap<number>([], { comparator: (a, b) => b - a }); // Max heap
|
|
56
146
|
arr.forEach(num => {
|
|
57
147
|
heap.add(num);
|
|
@@ -61,51 +151,12 @@ yarn add heap-typed
|
|
|
61
151
|
}
|
|
62
152
|
|
|
63
153
|
const numbers = [10, 30, 20, 5, 15, 25];
|
|
64
|
-
console.log(topKElements(numbers, 3)); // [15, 10, 5]
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Use Heap to merge sorted sequences
|
|
68
|
-
```typescript
|
|
69
|
-
function mergeSortedSequences(sequences: number[][]): number[] {
|
|
70
|
-
const heap = new Heap<{ value: number; seqIndex: number; itemIndex: number }>([], {
|
|
71
|
-
comparator: (a, b) => a.value - b.value // Min heap
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
// Initialize heap
|
|
75
|
-
sequences.forEach((seq, seqIndex) => {
|
|
76
|
-
if (seq.length) {
|
|
77
|
-
heap.add({ value: seq[0], seqIndex, itemIndex: 0 });
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
const merged: number[] = [];
|
|
82
|
-
while (!heap.isEmpty()) {
|
|
83
|
-
const { value, seqIndex, itemIndex } = heap.poll()!;
|
|
84
|
-
merged.push(value);
|
|
85
|
-
|
|
86
|
-
if (itemIndex + 1 < sequences[seqIndex].length) {
|
|
87
|
-
heap.add({
|
|
88
|
-
value: sequences[seqIndex][itemIndex + 1],
|
|
89
|
-
seqIndex,
|
|
90
|
-
itemIndex: itemIndex + 1
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
return merged;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const sequences = [
|
|
99
|
-
[1, 4, 7],
|
|
100
|
-
[2, 5, 8],
|
|
101
|
-
[3, 6, 9]
|
|
102
|
-
];
|
|
103
|
-
console.log(mergeSortedSequences(sequences)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
154
|
+
console.log(topKElements(numbers, 3)); // [15, 10, 5];
|
|
104
155
|
```
|
|
105
156
|
|
|
106
157
|
### Use Heap to dynamically maintain the median
|
|
107
158
|
```typescript
|
|
108
|
-
|
|
159
|
+
class MedianFinder {
|
|
109
160
|
private low: MaxHeap<number>; // Max heap, stores the smaller half
|
|
110
161
|
private high: MinHeap<number>; // Min heap, stores the larger half
|
|
111
162
|
|
|
@@ -131,20 +182,20 @@ yarn add heap-typed
|
|
|
131
182
|
|
|
132
183
|
const medianFinder = new MedianFinder();
|
|
133
184
|
medianFinder.addNum(10);
|
|
134
|
-
console.log(medianFinder.findMedian()); // 10
|
|
185
|
+
console.log(medianFinder.findMedian()); // 10;
|
|
135
186
|
medianFinder.addNum(20);
|
|
136
|
-
console.log(medianFinder.findMedian()); // 15
|
|
187
|
+
console.log(medianFinder.findMedian()); // 15;
|
|
137
188
|
medianFinder.addNum(30);
|
|
138
|
-
console.log(medianFinder.findMedian()); // 20
|
|
189
|
+
console.log(medianFinder.findMedian()); // 20;
|
|
139
190
|
medianFinder.addNum(40);
|
|
140
|
-
console.log(medianFinder.findMedian()); // 25
|
|
191
|
+
console.log(medianFinder.findMedian()); // 25;
|
|
141
192
|
medianFinder.addNum(50);
|
|
142
|
-
console.log(medianFinder.findMedian()); // 30
|
|
193
|
+
console.log(medianFinder.findMedian()); // 30;
|
|
143
194
|
```
|
|
144
195
|
|
|
145
196
|
### Use Heap for load balancing
|
|
146
197
|
```typescript
|
|
147
|
-
|
|
198
|
+
function loadBalance(requests: number[], servers: number): number[] {
|
|
148
199
|
const serverHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // min heap
|
|
149
200
|
const serverLoads = new Array(servers).fill(0);
|
|
150
201
|
|
|
@@ -163,12 +214,12 @@ yarn add heap-typed
|
|
|
163
214
|
}
|
|
164
215
|
|
|
165
216
|
const requests = [5, 2, 8, 3, 7];
|
|
166
|
-
console.log(loadBalance(requests, 3)); // [12, 8, 5]
|
|
217
|
+
console.log(loadBalance(requests, 3)); // [12, 8, 5];
|
|
167
218
|
```
|
|
168
219
|
|
|
169
220
|
### Use Heap to schedule tasks
|
|
170
221
|
```typescript
|
|
171
|
-
|
|
222
|
+
type Task = [string, number];
|
|
172
223
|
|
|
173
224
|
function scheduleTasks(tasks: Task[], machines: number): Map<number, Task[]> {
|
|
174
225
|
const machineHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // Min heap
|
|
@@ -208,7 +259,7 @@ yarn add heap-typed
|
|
|
208
259
|
['Task3', 2],
|
|
209
260
|
['Task5', 4]
|
|
210
261
|
]);
|
|
211
|
-
console.log(scheduleTasks(tasks, 2)); // expectedMap
|
|
262
|
+
console.log(scheduleTasks(tasks, 2)); // expectedMap;
|
|
212
263
|
```
|
|
213
264
|
|
|
214
265
|
[//]: # (No deletion!!! End of Example Replace Section)
|