red-black-tree-typed 2.2.2 → 2.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +92 -37
  2. package/dist/cjs/index.cjs +163 -0
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs-legacy/index.cjs +164 -0
  5. package/dist/cjs-legacy/index.cjs.map +1 -1
  6. package/dist/esm/index.mjs +163 -0
  7. package/dist/esm/index.mjs.map +1 -1
  8. package/dist/esm-legacy/index.mjs +164 -0
  9. package/dist/esm-legacy/index.mjs.map +1 -1
  10. package/dist/types/data-structures/binary-tree/avl-tree.d.ts +96 -2
  11. package/dist/types/data-structures/binary-tree/binary-tree.d.ts +103 -7
  12. package/dist/types/data-structures/binary-tree/bst.d.ts +156 -13
  13. package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +84 -35
  14. package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +2 -2
  15. package/dist/types/data-structures/graph/directed-graph.d.ts +126 -1
  16. package/dist/types/data-structures/graph/undirected-graph.d.ts +160 -1
  17. package/dist/types/data-structures/hash/hash-map.d.ts +110 -27
  18. package/dist/types/data-structures/heap/heap.d.ts +107 -58
  19. package/dist/types/data-structures/linked-list/doubly-linked-list.d.ts +72 -404
  20. package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +121 -5
  21. package/dist/types/data-structures/queue/deque.d.ts +95 -67
  22. package/dist/types/data-structures/queue/queue.d.ts +90 -34
  23. package/dist/types/data-structures/stack/stack.d.ts +58 -40
  24. package/dist/types/data-structures/trie/trie.d.ts +109 -47
  25. package/dist/types/interfaces/binary-tree.d.ts +1 -0
  26. package/dist/umd/red-black-tree-typed.js +164 -0
  27. package/dist/umd/red-black-tree-typed.js.map +1 -1
  28. package/dist/umd/red-black-tree-typed.min.js +3 -3
  29. package/dist/umd/red-black-tree-typed.min.js.map +1 -1
  30. package/package.json +2 -2
  31. package/src/data-structures/binary-tree/avl-tree.ts +96 -2
  32. package/src/data-structures/binary-tree/binary-tree.ts +117 -7
  33. package/src/data-structures/binary-tree/bst.ts +322 -13
  34. package/src/data-structures/binary-tree/red-black-tree.ts +84 -35
  35. package/src/data-structures/binary-tree/tree-multi-map.ts +2 -2
  36. package/src/data-structures/graph/directed-graph.ts +126 -1
  37. package/src/data-structures/graph/undirected-graph.ts +160 -1
  38. package/src/data-structures/hash/hash-map.ts +110 -27
  39. package/src/data-structures/heap/heap.ts +107 -58
  40. package/src/data-structures/linked-list/doubly-linked-list.ts +72 -404
  41. package/src/data-structures/linked-list/singly-linked-list.ts +121 -5
  42. package/src/data-structures/queue/deque.ts +95 -67
  43. package/src/data-structures/queue/queue.ts +90 -34
  44. package/src/data-structures/stack/stack.ts +58 -40
  45. package/src/data-structures/trie/trie.ts +109 -47
  46. package/src/interfaces/binary-tree.ts +2 -0
@@ -25,21 +25,107 @@ import { IterableElementBase } from '../base';
25
25
  * 7. Efficient Sorting Algorithms: For example, heap sort. Heap sort uses the properties of a heap to sort elements.
26
26
  * 8. Graph Algorithms: Such as Dijkstra's shortest path algorithm and Prime's minimum-spanning tree algorithm, which use heaps to improve performance.
27
27
  * @example
28
- * // Use Heap to sort an array
29
- * function heapSort(arr: number[]): number[] {
30
- * const heap = new Heap<number>(arr, { comparator: (a, b) => a - b });
31
- * const sorted: number[] = [];
32
- * while (!heap.isEmpty()) {
33
- * sorted.push(heap.poll()!); // Poll minimum element
28
+ * // basic Heap creation and add operation
29
+ * // Create a min heap (default)
30
+ * const minHeap = new Heap([5, 3, 7, 1, 9, 2]);
31
+ *
32
+ * // Verify size
33
+ * console.log(minHeap.size); // 6;
34
+ *
35
+ * // Add new element
36
+ * minHeap.add(4);
37
+ * console.log(minHeap.size); // 7;
38
+ *
39
+ * // Min heap property: smallest element at root
40
+ * const min = minHeap.peek();
41
+ * console.log(min); // 1;
42
+ * @example
43
+ * // Heap with custom comparator (MaxHeap behavior)
44
+ * interface Task {
45
+ * id: number;
46
+ * priority: number;
47
+ * name: string;
48
+ * }
49
+ *
50
+ * // Custom comparator for max heap behavior (higher priority first)
51
+ * const tasks: Task[] = [
52
+ * { id: 1, priority: 5, name: 'Email' },
53
+ * { id: 2, priority: 3, name: 'Chat' },
54
+ * { id: 3, priority: 8, name: 'Alert' }
55
+ * ];
56
+ *
57
+ * const maxHeap = new Heap(tasks, {
58
+ * comparator: (a: Task, b: Task) => b.priority - a.priority
59
+ * });
60
+ *
61
+ * console.log(maxHeap.size); // 3;
62
+ *
63
+ * // Peek returns highest priority task
64
+ * const topTask = maxHeap.peek();
65
+ * console.log(topTask?.priority); // 8;
66
+ * console.log(topTask?.name); // 'Alert';
67
+ * @example
68
+ * // Heap for event processing with priority
69
+ * interface Event {
70
+ * id: number;
71
+ * type: 'critical' | 'warning' | 'info';
72
+ * timestamp: number;
73
+ * message: string;
74
+ * }
75
+ *
76
+ * // Custom priority: critical > warning > info
77
+ * const priorityMap = { critical: 3, warning: 2, info: 1 };
78
+ *
79
+ * const eventHeap = new Heap<Event>([], {
80
+ * comparator: (a: Event, b: Event) => {
81
+ * const priorityA = priorityMap[a.type];
82
+ * const priorityB = priorityMap[b.type];
83
+ * return priorityB - priorityA; // Higher priority first
84
+ * }
85
+ * });
86
+ *
87
+ * // Add events in random order
88
+ * eventHeap.add({ id: 1, type: 'info', timestamp: 100, message: 'User logged in' });
89
+ * eventHeap.add({ id: 2, type: 'critical', timestamp: 101, message: 'Server down' });
90
+ * eventHeap.add({ id: 3, type: 'warning', timestamp: 102, message: 'High memory' });
91
+ * eventHeap.add({ id: 4, type: 'info', timestamp: 103, message: 'Cache cleared' });
92
+ * eventHeap.add({ id: 5, type: 'critical', timestamp: 104, message: 'Database error' });
93
+ *
94
+ * console.log(eventHeap.size); // 5;
95
+ *
96
+ * // Process events by priority (critical first)
97
+ * const processedOrder: Event[] = [];
98
+ * while (eventHeap.size > 0) {
99
+ * const event = eventHeap.poll();
100
+ * if (event) {
101
+ * processedOrder.push(event);
34
102
  * }
35
- * return sorted;
36
103
  * }
37
104
  *
38
- * const array = [5, 3, 8, 4, 1, 2];
39
- * console.log(heapSort(array)); // [1, 2, 3, 4, 5, 8]
105
+ * // Verify critical events came first
106
+ * console.log(processedOrder[0].type); // 'critical';
107
+ * console.log(processedOrder[1].type); // 'critical';
108
+ * console.log(processedOrder[2].type); // 'warning';
109
+ * console.log(processedOrder[3].type); // 'info';
110
+ * console.log(processedOrder[4].type); // 'info';
111
+ *
112
+ * // Verify O(log n) operations
113
+ * const newHeap = new Heap<number>([5, 3, 7, 1]);
114
+ *
115
+ * // Add - O(log n)
116
+ * newHeap.add(2);
117
+ * console.log(newHeap.size); // 5;
118
+ *
119
+ * // Poll - O(log n)
120
+ * const removed = newHeap.poll();
121
+ * console.log(removed); // 1;
122
+ *
123
+ * // Peek - O(1)
124
+ * const top = newHeap.peek();
125
+ * console.log(top); // 2;
40
126
  * @example
41
127
  * // Use Heap to solve top k problems
42
- * function topKElements(arr: number[], k: number): number[] {
128
+ * function topKElements(arr: number[], k: number): number[] {
43
129
  * const heap = new Heap<number>([], { comparator: (a, b) => b - a }); // Max heap
44
130
  * arr.forEach(num => {
45
131
  * heap.add(num);
@@ -49,47 +135,10 @@ import { IterableElementBase } from '../base';
49
135
  * }
50
136
  *
51
137
  * const numbers = [10, 30, 20, 5, 15, 25];
52
- * console.log(topKElements(numbers, 3)); // [15, 10, 5]
53
- * @example
54
- * // Use Heap to merge sorted sequences
55
- * function mergeSortedSequences(sequences: number[][]): number[] {
56
- * const heap = new Heap<{ value: number; seqIndex: number; itemIndex: number }>([], {
57
- * comparator: (a, b) => a.value - b.value // Min heap
58
- * });
59
- *
60
- * // Initialize heap
61
- * sequences.forEach((seq, seqIndex) => {
62
- * if (seq.length) {
63
- * heap.add({ value: seq[0], seqIndex, itemIndex: 0 });
64
- * }
65
- * });
66
- *
67
- * const merged: number[] = [];
68
- * while (!heap.isEmpty()) {
69
- * const { value, seqIndex, itemIndex } = heap.poll()!;
70
- * merged.push(value);
71
- *
72
- * if (itemIndex + 1 < sequences[seqIndex].length) {
73
- * heap.add({
74
- * value: sequences[seqIndex][itemIndex + 1],
75
- * seqIndex,
76
- * itemIndex: itemIndex + 1
77
- * });
78
- * }
79
- * }
80
- *
81
- * return merged;
82
- * }
83
- *
84
- * const sequences = [
85
- * [1, 4, 7],
86
- * [2, 5, 8],
87
- * [3, 6, 9]
88
- * ];
89
- * console.log(mergeSortedSequences(sequences)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
138
+ * console.log(topKElements(numbers, 3)); // [15, 10, 5];
90
139
  * @example
91
140
  * // Use Heap to dynamically maintain the median
92
- * class MedianFinder {
141
+ * class MedianFinder {
93
142
  * private low: MaxHeap<number>; // Max heap, stores the smaller half
94
143
  * private high: MinHeap<number>; // Min heap, stores the larger half
95
144
  *
@@ -115,18 +164,18 @@ import { IterableElementBase } from '../base';
115
164
  *
116
165
  * const medianFinder = new MedianFinder();
117
166
  * medianFinder.addNum(10);
118
- * console.log(medianFinder.findMedian()); // 10
167
+ * console.log(medianFinder.findMedian()); // 10;
119
168
  * medianFinder.addNum(20);
120
- * console.log(medianFinder.findMedian()); // 15
169
+ * console.log(medianFinder.findMedian()); // 15;
121
170
  * medianFinder.addNum(30);
122
- * console.log(medianFinder.findMedian()); // 20
171
+ * console.log(medianFinder.findMedian()); // 20;
123
172
  * medianFinder.addNum(40);
124
- * console.log(medianFinder.findMedian()); // 25
173
+ * console.log(medianFinder.findMedian()); // 25;
125
174
  * medianFinder.addNum(50);
126
- * console.log(medianFinder.findMedian()); // 30
175
+ * console.log(medianFinder.findMedian()); // 30;
127
176
  * @example
128
177
  * // Use Heap for load balancing
129
- * function loadBalance(requests: number[], servers: number): number[] {
178
+ * function loadBalance(requests: number[], servers: number): number[] {
130
179
  * const serverHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // min heap
131
180
  * const serverLoads = new Array(servers).fill(0);
132
181
  *
@@ -145,10 +194,10 @@ import { IterableElementBase } from '../base';
145
194
  * }
146
195
  *
147
196
  * const requests = [5, 2, 8, 3, 7];
148
- * console.log(loadBalance(requests, 3)); // [12, 8, 5]
197
+ * console.log(loadBalance(requests, 3)); // [12, 8, 5];
149
198
  * @example
150
199
  * // Use Heap to schedule tasks
151
- * type Task = [string, number];
200
+ * type Task = [string, number];
152
201
  *
153
202
  * function scheduleTasks(tasks: Task[], machines: number): Map<number, Task[]> {
154
203
  * const machineHeap = new Heap<{ id: number; load: number }>([], { comparator: (a, b) => a.load - b.load }); // Min heap
@@ -188,7 +237,7 @@ import { IterableElementBase } from '../base';
188
237
  * ['Task3', 2],
189
238
  * ['Task5', 4]
190
239
  * ]);
191
- * console.log(scheduleTasks(tasks, 2)); // expectedMap
240
+ * console.log(scheduleTasks(tasks, 2)); // expectedMap;
192
241
  */
193
242
  export class Heap<E = any, R = any> extends IterableElementBase<E, R> {
194
243
  protected _equals: (a: E, b: E) => boolean = Object.is;