binary-tree-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/README.md +0 -84
- package/dist/cjs/index.cjs +1476 -404
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs-legacy/index.cjs +1473 -401
- package/dist/cjs-legacy/index.cjs.map +1 -1
- package/dist/esm/index.mjs +1476 -404
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm-legacy/index.mjs +1473 -401
- package/dist/esm-legacy/index.mjs.map +1 -1
- 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 +380 -51
- package/dist/types/data-structures/binary-tree/binary-indexed-tree.d.ts +487 -147
- package/dist/types/data-structures/binary-tree/binary-tree.d.ts +956 -80
- package/dist/types/data-structures/binary-tree/bst.d.ts +816 -29
- package/dist/types/data-structures/binary-tree/red-black-tree.d.ts +610 -31
- package/dist/types/data-structures/binary-tree/segment-tree.d.ts +326 -135
- package/dist/types/data-structures/binary-tree/tree-map.d.ts +3781 -6
- package/dist/types/data-structures/binary-tree/tree-multi-map.d.ts +3607 -201
- package/dist/types/data-structures/binary-tree/tree-multi-set.d.ts +2874 -65
- package/dist/types/data-structures/binary-tree/tree-set.d.ts +3528 -6
- package/dist/types/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/types/data-structures/graph/directed-graph.d.ts +429 -47
- package/dist/types/data-structures/graph/map-graph.d.ts +59 -1
- package/dist/types/data-structures/graph/undirected-graph.d.ts +393 -59
- package/dist/types/data-structures/hash/hash-map.d.ts +473 -89
- package/dist/types/data-structures/heap/heap.d.ts +581 -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 +646 -47
- package/dist/types/data-structures/linked-list/singly-linked-list.d.ts +596 -68
- package/dist/types/data-structures/linked-list/skip-linked-list.d.ts +793 -12
- package/dist/types/data-structures/matrix/matrix.d.ts +499 -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 +593 -71
- package/dist/types/data-structures/queue/queue.d.ts +463 -42
- package/dist/types/data-structures/stack/stack.d.ts +384 -32
- package/dist/types/data-structures/trie/trie.d.ts +470 -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/binary-tree-typed.js +1469 -397
- package/dist/umd/binary-tree-typed.js.map +1 -1
- package/dist/umd/binary-tree-typed.min.js +5 -5
- package/dist/umd/binary-tree-typed.min.js.map +1 -1
- package/package.json +2 -2
- 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
|
@@ -16,6 +16,63 @@ import { ERR } from '../../common';
|
|
|
16
16
|
* @template E Element type stored in the queue.
|
|
17
17
|
* @template R Extra record/metadata associated with each element.
|
|
18
18
|
* @example
|
|
19
|
+
* // Job scheduling by priority
|
|
20
|
+
* const jobs = new MaxPriorityQueue<number>();
|
|
21
|
+
*
|
|
22
|
+
* jobs.add(3); // low priority
|
|
23
|
+
* jobs.add(7); // high priority
|
|
24
|
+
* jobs.add(5); // medium priority
|
|
25
|
+
* jobs.add(10); // critical
|
|
26
|
+
*
|
|
27
|
+
* // Highest priority job first
|
|
28
|
+
* console.log(jobs.poll()); // 10;
|
|
29
|
+
* console.log(jobs.poll()); // 7;
|
|
30
|
+
* console.log(jobs.poll()); // 5;
|
|
31
|
+
* console.log(jobs.poll()); // 3;
|
|
32
|
+
* @example
|
|
33
|
+
* // Auction system with highest bid tracking
|
|
34
|
+
* interface Bid {
|
|
35
|
+
* bidder: string;
|
|
36
|
+
* amount: number;
|
|
37
|
+
* }
|
|
38
|
+
*
|
|
39
|
+
* const auction = new MaxPriorityQueue<Bid>([], {
|
|
40
|
+
* comparator: (a, b) => b.amount - a.amount
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* auction.add({ bidder: 'Alice', amount: 100 });
|
|
44
|
+
* auction.add({ bidder: 'Bob', amount: 250 });
|
|
45
|
+
* auction.add({ bidder: 'Charlie', amount: 175 });
|
|
46
|
+
*
|
|
47
|
+
* // Current highest bid
|
|
48
|
+
* console.log(auction.peek()?.bidder); // 'Bob';
|
|
49
|
+
* console.log(auction.peek()?.amount); // 250;
|
|
50
|
+
*
|
|
51
|
+
* // Process winning bid
|
|
52
|
+
* const winner = auction.poll()!;
|
|
53
|
+
* console.log(winner.bidder); // 'Bob';
|
|
54
|
+
* console.log(auction.peek()?.bidder); // 'Charlie';
|
|
55
|
+
* @example
|
|
56
|
+
* // CPU process scheduling
|
|
57
|
+
* const cpuQueue = new MaxPriorityQueue<[number, string]>([], {
|
|
58
|
+
* comparator: (a, b) => b[0] - a[0]
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* cpuQueue.add([5, 'System process']);
|
|
62
|
+
* cpuQueue.add([1, 'Background task']);
|
|
63
|
+
* cpuQueue.add([8, 'User interaction']);
|
|
64
|
+
* cpuQueue.add([3, 'Network sync']);
|
|
65
|
+
*
|
|
66
|
+
* const order = [];
|
|
67
|
+
* while (cpuQueue.size > 0) {
|
|
68
|
+
* order.push(cpuQueue.poll()![1]);
|
|
69
|
+
* }
|
|
70
|
+
* console.log(order); // [
|
|
71
|
+
* // 'User interaction',
|
|
72
|
+
* // 'System process',
|
|
73
|
+
* // 'Network sync',
|
|
74
|
+
* // 'Background task'
|
|
75
|
+
* // ];
|
|
19
76
|
*/
|
|
20
77
|
export class MaxPriorityQueue<E = any, R = any> extends PriorityQueue<E, R> {
|
|
21
78
|
/**
|
|
@@ -15,6 +15,66 @@ import { PriorityQueue } from './priority-queue';
|
|
|
15
15
|
* @template E Element type stored in the queue.
|
|
16
16
|
* @template R Extra record/metadata associated with each element.
|
|
17
17
|
* @example
|
|
18
|
+
* // Shortest job first scheduling
|
|
19
|
+
* const jobs = new MinPriorityQueue<number>();
|
|
20
|
+
*
|
|
21
|
+
* jobs.add(8); // 8 seconds
|
|
22
|
+
* jobs.add(2); // 2 seconds
|
|
23
|
+
* jobs.add(5); // 5 seconds
|
|
24
|
+
* jobs.add(1); // 1 second
|
|
25
|
+
*
|
|
26
|
+
* // Shortest job first
|
|
27
|
+
* console.log(jobs.poll()); // 1;
|
|
28
|
+
* console.log(jobs.poll()); // 2;
|
|
29
|
+
* console.log(jobs.poll()); // 5;
|
|
30
|
+
* console.log(jobs.poll()); // 8;
|
|
31
|
+
* @example
|
|
32
|
+
* // Event-driven simulation with timestamps
|
|
33
|
+
* interface Event {
|
|
34
|
+
* time: number;
|
|
35
|
+
* action: string;
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* const timeline = new MinPriorityQueue<Event>([], {
|
|
39
|
+
* comparator: (a, b) => a.time - b.time
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* timeline.add({ time: 300, action: 'Timeout' });
|
|
43
|
+
* timeline.add({ time: 100, action: 'Request received' });
|
|
44
|
+
* timeline.add({ time: 200, action: 'Processing done' });
|
|
45
|
+
* timeline.add({ time: 150, action: 'Cache hit' });
|
|
46
|
+
*
|
|
47
|
+
* const order = [];
|
|
48
|
+
* while (timeline.size > 0) {
|
|
49
|
+
* order.push(timeline.poll()!.action);
|
|
50
|
+
* }
|
|
51
|
+
* console.log(order); // [
|
|
52
|
+
* // 'Request received',
|
|
53
|
+
* // 'Cache hit',
|
|
54
|
+
* // 'Processing done',
|
|
55
|
+
* // 'Timeout'
|
|
56
|
+
* // ];
|
|
57
|
+
* @example
|
|
58
|
+
* // Huffman coding frequency selection
|
|
59
|
+
* // Character frequencies for Huffman tree building
|
|
60
|
+
* const freq = new MinPriorityQueue<[number, string]>([], {
|
|
61
|
+
* comparator: (a, b) => a[0] - b[0]
|
|
62
|
+
* });
|
|
63
|
+
*
|
|
64
|
+
* freq.add([5, 'a']);
|
|
65
|
+
* freq.add([9, 'b']);
|
|
66
|
+
* freq.add([12, 'c']);
|
|
67
|
+
* freq.add([2, 'd']);
|
|
68
|
+
*
|
|
69
|
+
* // Always pick two lowest frequencies
|
|
70
|
+
* const first = freq.poll()!;
|
|
71
|
+
* const second = freq.poll()!;
|
|
72
|
+
* console.log(first[1]); // 'd'; // freq 2
|
|
73
|
+
* console.log(second[1]); // 'a'; // freq 5
|
|
74
|
+
*
|
|
75
|
+
* // Combined node goes back
|
|
76
|
+
* freq.add([first[0] + second[0], first[1] + second[1]]);
|
|
77
|
+
* console.log(freq.peek()![0]); // 7;
|
|
18
78
|
*/
|
|
19
79
|
export class MinPriorityQueue<E = any, R = any> extends PriorityQueue<E, R> {
|
|
20
80
|
/**
|
|
@@ -11,6 +11,66 @@ import { Heap } from '../heap';
|
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* @example
|
|
14
|
+
* // Hospital emergency room triage
|
|
15
|
+
* interface Patient {
|
|
16
|
+
* name: string;
|
|
17
|
+
* severity: number; // 1 = critical, 5 = minor
|
|
18
|
+
* }
|
|
19
|
+
*
|
|
20
|
+
* const er = new PriorityQueue<Patient>([], {
|
|
21
|
+
* comparator: (a, b) => a.severity - b.severity
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* er.add({ name: 'Flu symptoms', severity: 4 });
|
|
25
|
+
* er.add({ name: 'Heart attack', severity: 1 });
|
|
26
|
+
* er.add({ name: 'Broken arm', severity: 3 });
|
|
27
|
+
* er.add({ name: 'Stroke', severity: 1 });
|
|
28
|
+
*
|
|
29
|
+
* // Most critical patients first
|
|
30
|
+
* console.log(er.poll()?.severity); // 1;
|
|
31
|
+
* console.log(er.poll()?.severity); // 1;
|
|
32
|
+
* console.log(er.poll()?.severity); // 3;
|
|
33
|
+
* console.log(er.poll()?.severity); // 4;
|
|
34
|
+
* @example
|
|
35
|
+
* // Task scheduler with deadlines
|
|
36
|
+
* interface Task {
|
|
37
|
+
* name: string;
|
|
38
|
+
* deadline: number; // hours until due
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* const scheduler = new PriorityQueue<Task>([], {
|
|
42
|
+
* comparator: (a, b) => a.deadline - b.deadline
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* scheduler.add({ name: 'Report', deadline: 24 });
|
|
46
|
+
* scheduler.add({ name: 'Email', deadline: 2 });
|
|
47
|
+
* scheduler.add({ name: 'Meeting prep', deadline: 4 });
|
|
48
|
+
* scheduler.add({ name: 'Code review', deadline: 8 });
|
|
49
|
+
*
|
|
50
|
+
* // Process most urgent first
|
|
51
|
+
* console.log(scheduler.peek()?.name); // 'Email';
|
|
52
|
+
* console.log(scheduler.size); // 4;
|
|
53
|
+
*
|
|
54
|
+
* const order = [];
|
|
55
|
+
* while (scheduler.size > 0) {
|
|
56
|
+
* order.push(scheduler.poll()!.name);
|
|
57
|
+
* }
|
|
58
|
+
* console.log(order); // ['Email', 'Meeting prep', 'Code review', 'Report'];
|
|
59
|
+
* @example
|
|
60
|
+
* // Bandwidth allocation with priorities
|
|
61
|
+
* const bandwidth = new PriorityQueue<[number, string]>([], {
|
|
62
|
+
* comparator: (a, b) => a[0] - b[0]
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* bandwidth.add([1, 'Video call']); // highest priority
|
|
66
|
+
* bandwidth.add([3, 'File download']);
|
|
67
|
+
* bandwidth.add([2, 'Web browsing']);
|
|
68
|
+
* bandwidth.add([1, 'Voice call']);
|
|
69
|
+
*
|
|
70
|
+
* // Allocate bandwidth to highest priority first
|
|
71
|
+
* console.log(bandwidth.poll()?.[1]); // 'Video call';
|
|
72
|
+
* console.log(bandwidth.poll()?.[1]); // 'Voice call';
|
|
73
|
+
* console.log(bandwidth.size); // 2;
|
|
14
74
|
*/
|
|
15
75
|
export class PriorityQueue<E = any, R = any> extends Heap<E, R> {
|
|
16
76
|
constructor(elements: Iterable<E> | Iterable<R> = [], options?: PriorityQueueOptions<E, R>) {
|