data-structure-typed 1.54.3 → 2.0.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/CHANGELOG.md +1 -1
- package/benchmark/report.html +26 -2
- package/benchmark/report.json +292 -42
- package/dist/cjs/data-structures/base/iterable-element-base.d.ts +14 -40
- package/dist/cjs/data-structures/base/iterable-element-base.js +14 -11
- package/dist/cjs/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/cjs/data-structures/base/linear-base.d.ts +277 -0
- package/dist/cjs/data-structures/base/linear-base.js +553 -0
- package/dist/cjs/data-structures/base/linear-base.js.map +1 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
- package/dist/cjs/data-structures/binary-tree/avl-tree-multi-map.js +50 -37
- 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 +64 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +64 -0
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +62 -0
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +67 -5
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/cjs/data-structures/binary-tree/bst.js +14 -14
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/red-black-tree.d.ts +1 -7
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js +1 -7
- package/dist/cjs/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js +210 -40
- package/dist/cjs/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.js +16 -16
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.d.ts +46 -0
- package/dist/cjs/data-structures/hash/hash-map.js +46 -0
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +3 -11
- package/dist/cjs/data-structures/heap/heap.js +0 -10
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.d.ts +2 -2
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.d.ts +2 -2
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
- package/dist/cjs/data-structures/linked-list/doubly-linked-list.js +131 -146
- 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 +145 -75
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js +283 -169
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.d.ts +130 -91
- package/dist/cjs/data-structures/queue/deque.js +269 -169
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.d.ts +131 -40
- package/dist/cjs/data-structures/queue/queue.js +181 -50
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/data-structures/stack/stack.d.ts +124 -11
- package/dist/cjs/data-structures/stack/stack.js +121 -10
- package/dist/cjs/data-structures/stack/stack.js.map +1 -1
- package/dist/cjs/data-structures/trie/trie.d.ts +4 -3
- package/dist/cjs/data-structures/trie/trie.js +3 -0
- package/dist/cjs/data-structures/trie/trie.js.map +1 -1
- package/dist/cjs/types/data-structures/base/base.d.ts +9 -4
- package/dist/cjs/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
- package/dist/cjs/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/cjs/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/cjs/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/cjs/types/data-structures/queue/deque.d.ts +2 -3
- package/dist/cjs/types/data-structures/queue/queue.d.ts +2 -2
- package/dist/esm/data-structures/base/iterable-element-base.d.ts +14 -40
- package/dist/esm/data-structures/base/iterable-element-base.js +14 -11
- package/dist/esm/data-structures/base/iterable-element-base.js.map +1 -1
- package/dist/esm/data-structures/base/linear-base.d.ts +277 -0
- package/dist/esm/data-structures/base/linear-base.js +549 -0
- package/dist/esm/data-structures/base/linear-base.js.map +1 -0
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.d.ts +12 -8
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js +50 -36
- package/dist/esm/data-structures/binary-tree/avl-tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/avl-tree.d.ts +64 -0
- package/dist/esm/data-structures/binary-tree/avl-tree.js +64 -0
- package/dist/esm/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/binary-tree.d.ts +62 -0
- package/dist/esm/data-structures/binary-tree/binary-tree.js +67 -5
- package/dist/esm/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/bst.d.ts +3 -3
- package/dist/esm/data-structures/binary-tree/bst.js +14 -12
- package/dist/esm/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/red-black-tree.d.ts +1 -7
- package/dist/esm/data-structures/binary-tree/red-black-tree.js +1 -7
- package/dist/esm/data-structures/binary-tree/red-black-tree.js.map +1 -1
- package/dist/esm/data-structures/binary-tree/tree-multi-map.d.ts +175 -14
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js +210 -39
- package/dist/esm/data-structures/binary-tree/tree-multi-map.js.map +1 -1
- package/dist/esm/data-structures/graph/abstract-graph.js +16 -16
- package/dist/esm/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/esm/data-structures/hash/hash-map.d.ts +46 -0
- package/dist/esm/data-structures/hash/hash-map.js +46 -0
- package/dist/esm/data-structures/hash/hash-map.js.map +1 -1
- package/dist/esm/data-structures/heap/heap.d.ts +3 -11
- package/dist/esm/data-structures/heap/heap.js +0 -10
- package/dist/esm/data-structures/heap/heap.js.map +1 -1
- package/dist/esm/data-structures/heap/max-heap.d.ts +2 -2
- package/dist/esm/data-structures/heap/max-heap.js.map +1 -1
- package/dist/esm/data-structures/heap/min-heap.d.ts +2 -2
- package/dist/esm/data-structures/heap/min-heap.js.map +1 -1
- package/dist/esm/data-structures/linked-list/doubly-linked-list.d.ts +65 -94
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js +132 -148
- package/dist/esm/data-structures/linked-list/doubly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/linked-list/singly-linked-list.d.ts +145 -75
- package/dist/esm/data-structures/linked-list/singly-linked-list.js +283 -170
- package/dist/esm/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/max-priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/min-priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/esm/data-structures/priority-queue/priority-queue.d.ts +2 -2
- package/dist/esm/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/esm/data-structures/queue/deque.d.ts +130 -91
- package/dist/esm/data-structures/queue/deque.js +269 -169
- package/dist/esm/data-structures/queue/deque.js.map +1 -1
- package/dist/esm/data-structures/queue/queue.d.ts +131 -40
- package/dist/esm/data-structures/queue/queue.js +182 -51
- package/dist/esm/data-structures/queue/queue.js.map +1 -1
- package/dist/esm/data-structures/stack/stack.d.ts +124 -11
- package/dist/esm/data-structures/stack/stack.js +121 -10
- package/dist/esm/data-structures/stack/stack.js.map +1 -1
- package/dist/esm/data-structures/trie/trie.d.ts +4 -3
- package/dist/esm/data-structures/trie/trie.js +3 -0
- package/dist/esm/data-structures/trie/trie.js.map +1 -1
- package/dist/esm/types/data-structures/base/base.d.ts +9 -4
- package/dist/esm/types/data-structures/binary-tree/avl-tree-multi-map.d.ts +1 -1
- package/dist/esm/types/data-structures/binary-tree/tree-multi-map.d.ts +1 -1
- package/dist/esm/types/data-structures/linked-list/doubly-linked-list.d.ts +2 -2
- package/dist/esm/types/data-structures/linked-list/singly-linked-list.d.ts +2 -2
- package/dist/esm/types/data-structures/queue/deque.d.ts +2 -3
- package/dist/esm/types/data-structures/queue/queue.d.ts +2 -2
- package/dist/individuals/binary-tree/avl-tree-counter.mjs +4701 -0
- package/dist/individuals/binary-tree/avl-tree-multi-map.mjs +4514 -0
- package/dist/individuals/binary-tree/avl-tree.mjs +4321 -0
- package/dist/individuals/binary-tree/binary-tree.mjs +3097 -0
- package/dist/individuals/binary-tree/bst.mjs +3858 -0
- package/dist/individuals/binary-tree/red-black-tree.mjs +4391 -0
- package/dist/individuals/binary-tree/tree-counter.mjs +4806 -0
- package/dist/individuals/binary-tree/tree-multi-map.mjs +4582 -0
- package/dist/individuals/graph/directed-graph.mjs +2910 -0
- package/dist/individuals/graph/undirected-graph.mjs +2745 -0
- package/dist/individuals/hash/hash-map.mjs +1040 -0
- package/dist/individuals/heap/heap.mjs +909 -0
- package/dist/individuals/heap/max-heap.mjs +671 -0
- package/dist/individuals/heap/min-heap.mjs +659 -0
- package/dist/individuals/linked-list/doubly-linked-list.mjs +1495 -0
- package/dist/individuals/linked-list/singly-linked-list.mjs +1479 -0
- package/dist/individuals/priority-queue/max-priority-queue.mjs +768 -0
- package/dist/individuals/priority-queue/min-priority-queue.mjs +757 -0
- package/dist/individuals/priority-queue/priority-queue.mjs +670 -0
- package/dist/individuals/queue/deque.mjs +1262 -0
- package/dist/individuals/queue/queue.mjs +1865 -0
- package/dist/individuals/stack/stack.mjs +415 -0
- package/dist/individuals/trie/trie.mjs +687 -0
- package/dist/umd/data-structure-typed.js +1260 -649
- package/dist/umd/data-structure-typed.min.js +3 -3
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +7 -7
- package/src/data-structures/base/iterable-element-base.ts +29 -20
- package/src/data-structures/base/linear-base.ts +649 -0
- package/src/data-structures/binary-tree/avl-tree-multi-map.ts +51 -36
- package/src/data-structures/binary-tree/avl-tree.ts +64 -0
- package/src/data-structures/binary-tree/binary-tree.ts +5 -5
- package/src/data-structures/binary-tree/bst.ts +9 -9
- package/src/data-structures/binary-tree/tree-multi-map.ts +214 -40
- package/src/data-structures/graph/abstract-graph.ts +16 -16
- package/src/data-structures/hash/hash-map.ts +46 -0
- package/src/data-structures/heap/heap.ts +3 -14
- package/src/data-structures/heap/max-heap.ts +2 -2
- package/src/data-structures/heap/min-heap.ts +2 -2
- package/src/data-structures/linked-list/doubly-linked-list.ts +144 -160
- package/src/data-structures/linked-list/singly-linked-list.ts +307 -185
- package/src/data-structures/priority-queue/max-priority-queue.ts +2 -5
- package/src/data-structures/priority-queue/min-priority-queue.ts +2 -5
- package/src/data-structures/priority-queue/priority-queue.ts +2 -2
- package/src/data-structures/queue/deque.ts +286 -183
- package/src/data-structures/queue/queue.ts +196 -63
- package/src/data-structures/stack/stack.ts +124 -18
- package/src/data-structures/trie/trie.ts +7 -3
- package/src/types/data-structures/base/base.ts +17 -8
- package/src/types/data-structures/binary-tree/avl-tree-multi-map.ts +1 -1
- package/src/types/data-structures/binary-tree/tree-multi-map.ts +1 -1
- package/src/types/data-structures/linked-list/doubly-linked-list.ts +2 -2
- package/src/types/data-structures/linked-list/singly-linked-list.ts +2 -2
- package/src/types/data-structures/queue/deque.ts +2 -3
- package/src/types/data-structures/queue/queue.ts +2 -2
- package/test/integration/all-in-one.test.ts +1 -1
- package/test/integration/avl-tree.test.ts +1 -1
- package/test/integration/bst.test.ts +2 -2
- package/test/unit/data-structures/binary-tree/avl-tree-multi-map.test.ts +168 -0
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +15 -14
- package/test/unit/data-structures/binary-tree/red-black-tree.test.ts +1 -1
- package/test/unit/data-structures/binary-tree/tree-multi-map.test.ts +165 -7
- package/test/unit/data-structures/graph/directed-graph.test.ts +37 -37
- package/test/unit/data-structures/graph/undirected-graph.test.ts +2 -2
- package/test/unit/data-structures/hash/hash-map.test.ts +135 -0
- package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +135 -27
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +183 -12
- package/test/unit/data-structures/queue/deque.test.ts +241 -60
- package/test/unit/data-structures/queue/queue.test.ts +332 -19
- package/test/unit/data-structures/stack/stack.test.ts +165 -0
- package/test/unit/unrestricted-interconversion.test.ts +1 -1
|
@@ -19,7 +19,7 @@ export declare class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode
|
|
|
19
19
|
* @param {V[]} value - The `value` parameter in the constructor represents an array of values of
|
|
20
20
|
* type `V`.
|
|
21
21
|
*/
|
|
22
|
-
constructor(key: K, value
|
|
22
|
+
constructor(key: K, value?: V[]);
|
|
23
23
|
_left?: TreeMultiMapNode<K, V> | null | undefined;
|
|
24
24
|
get left(): TreeMultiMapNode<K, V> | null | undefined;
|
|
25
25
|
set left(v: TreeMultiMapNode<K, V> | null | undefined);
|
|
@@ -30,11 +30,169 @@ export declare class TreeMultiMapNode<K = any, V = any> extends RedBlackTreeNode
|
|
|
30
30
|
/**
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
|
-
* //
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
33
|
+
* // players ranked by score with their equipment
|
|
34
|
+
* type Equipment = {
|
|
35
|
+
* name: string; // Equipment name
|
|
36
|
+
* quality: 'legendary' | 'epic' | 'rare' | 'common';
|
|
37
|
+
* level: number;
|
|
38
|
+
* };
|
|
39
|
+
*
|
|
40
|
+
* type Player = {
|
|
41
|
+
* name: string;
|
|
42
|
+
* score: number;
|
|
43
|
+
* equipments: Equipment[];
|
|
44
|
+
* };
|
|
45
|
+
*
|
|
46
|
+
* // Mock player data with their scores and equipment
|
|
47
|
+
* const players: Player[] = [
|
|
48
|
+
* {
|
|
49
|
+
* name: 'DragonSlayer',
|
|
50
|
+
* score: 8750,
|
|
51
|
+
* equipments: [
|
|
52
|
+
* { name: 'AWM', quality: 'legendary', level: 85 },
|
|
53
|
+
* { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
|
|
54
|
+
* { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
|
|
55
|
+
* { name: 'Compensator', quality: 'epic', level: 78 },
|
|
56
|
+
* { name: 'Vertical Grip', quality: 'rare', level: 72 }
|
|
57
|
+
* ]
|
|
58
|
+
* },
|
|
59
|
+
* {
|
|
60
|
+
* name: 'ShadowNinja',
|
|
61
|
+
* score: 7200,
|
|
62
|
+
* equipments: [
|
|
63
|
+
* { name: 'M416', quality: 'epic', level: 75 },
|
|
64
|
+
* { name: 'Ghillie Suit', quality: 'rare', level: 70 },
|
|
65
|
+
* { name: 'Red Dot Sight', quality: 'common', level: 65 },
|
|
66
|
+
* { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
|
|
67
|
+
* ]
|
|
68
|
+
* },
|
|
69
|
+
* {
|
|
70
|
+
* name: 'RuneMaster',
|
|
71
|
+
* score: 9100,
|
|
72
|
+
* equipments: [
|
|
73
|
+
* { name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
74
|
+
* { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
|
|
75
|
+
* { name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
76
|
+
* { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
77
|
+
* { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
78
|
+
* ]
|
|
79
|
+
* },
|
|
80
|
+
* {
|
|
81
|
+
* name: 'BattleKing',
|
|
82
|
+
* score: 8500,
|
|
83
|
+
* equipments: [
|
|
84
|
+
* { name: 'AUG', quality: 'epic', level: 82 },
|
|
85
|
+
* { name: 'Red Dot Sight', quality: 'rare', level: 75 },
|
|
86
|
+
* { name: 'Extended Mag', quality: 'common', level: 70 },
|
|
87
|
+
* { name: 'Tactical Stock', quality: 'rare', level: 76 }
|
|
88
|
+
* ]
|
|
89
|
+
* },
|
|
90
|
+
* {
|
|
91
|
+
* name: 'SniperElite',
|
|
92
|
+
* score: 7800,
|
|
93
|
+
* equipments: [
|
|
94
|
+
* { name: 'M24', quality: 'legendary', level: 88 },
|
|
95
|
+
* { name: 'Compensator', quality: 'epic', level: 80 },
|
|
96
|
+
* { name: 'Scope 8x', quality: 'legendary', level: 85 },
|
|
97
|
+
* { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
|
|
98
|
+
* ]
|
|
99
|
+
* },
|
|
100
|
+
* {
|
|
101
|
+
* name: 'RushMaster',
|
|
102
|
+
* score: 7500,
|
|
103
|
+
* equipments: [
|
|
104
|
+
* { name: 'Vector', quality: 'rare', level: 72 },
|
|
105
|
+
* { name: 'Level 2 Helmet', quality: 'common', level: 65 },
|
|
106
|
+
* { name: 'Quickdraw Mag', quality: 'common', level: 60 },
|
|
107
|
+
* { name: 'Laser Sight', quality: 'rare', level: 68 }
|
|
108
|
+
* ]
|
|
109
|
+
* },
|
|
110
|
+
* {
|
|
111
|
+
* name: 'GhostWarrior',
|
|
112
|
+
* score: 8200,
|
|
113
|
+
* equipments: [
|
|
114
|
+
* { name: 'SCAR-L', quality: 'epic', level: 78 },
|
|
115
|
+
* { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
|
|
116
|
+
* { name: 'Holographic Sight', quality: 'epic', level: 75 },
|
|
117
|
+
* { name: 'Suppressor', quality: 'rare', level: 72 },
|
|
118
|
+
* { name: 'Vertical Grip', quality: 'common', level: 65 }
|
|
119
|
+
* ]
|
|
120
|
+
* },
|
|
121
|
+
* {
|
|
122
|
+
* name: 'DeathDealer',
|
|
123
|
+
* score: 7300,
|
|
124
|
+
* equipments: [
|
|
125
|
+
* { name: 'SKS', quality: 'epic', level: 76 },
|
|
126
|
+
* { name: 'Holographic Sight', quality: 'rare', level: 68 },
|
|
127
|
+
* { name: 'Extended Mag', quality: 'common', level: 65 }
|
|
128
|
+
* ]
|
|
129
|
+
* },
|
|
130
|
+
* {
|
|
131
|
+
* name: 'StormRider',
|
|
132
|
+
* score: 8900,
|
|
133
|
+
* equipments: [
|
|
134
|
+
* { name: 'MK14', quality: 'legendary', level: 92 },
|
|
135
|
+
* { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
136
|
+
* { name: 'Scope 8x', quality: 'epic', level: 80 },
|
|
137
|
+
* { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
138
|
+
* { name: 'Tactical Stock', quality: 'rare', level: 75 }
|
|
139
|
+
* ]
|
|
140
|
+
* },
|
|
141
|
+
* {
|
|
142
|
+
* name: 'CombatLegend',
|
|
143
|
+
* score: 7600,
|
|
144
|
+
* equipments: [
|
|
145
|
+
* { name: 'UMP45', quality: 'rare', level: 74 },
|
|
146
|
+
* { name: 'Level 2 Vest', quality: 'common', level: 67 },
|
|
147
|
+
* { name: 'Red Dot Sight', quality: 'common', level: 62 },
|
|
148
|
+
* { name: 'Extended Mag', quality: 'rare', level: 70 }
|
|
149
|
+
* ]
|
|
150
|
+
* }
|
|
151
|
+
* ];
|
|
152
|
+
*
|
|
153
|
+
* // Create a TreeMultiMap for player rankings
|
|
154
|
+
* const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
|
|
155
|
+
* toEntryFn: ({ score, equipments }) => [score, equipments],
|
|
156
|
+
* isMapMode: false
|
|
157
|
+
* });
|
|
158
|
+
*
|
|
159
|
+
* const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
|
|
160
|
+
* console.log(topPlayersEquipments); // [
|
|
161
|
+
* // [
|
|
162
|
+
* // {
|
|
163
|
+
* // name: 'MK14',
|
|
164
|
+
* // quality: 'legendary',
|
|
165
|
+
* // level: 92
|
|
166
|
+
* // },
|
|
167
|
+
* // { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
168
|
+
* // {
|
|
169
|
+
* // name: 'Scope 8x',
|
|
170
|
+
* // quality: 'epic',
|
|
171
|
+
* // level: 80
|
|
172
|
+
* // },
|
|
173
|
+
* // { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
174
|
+
* // {
|
|
175
|
+
* // name: 'Tactical Stock',
|
|
176
|
+
* // quality: 'rare',
|
|
177
|
+
* // level: 75
|
|
178
|
+
* // }
|
|
179
|
+
* // ],
|
|
180
|
+
* // [
|
|
181
|
+
* // { name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
182
|
+
* // {
|
|
183
|
+
* // name: 'Level 3 Vest',
|
|
184
|
+
* // quality: 'legendary',
|
|
185
|
+
* // level: 85
|
|
186
|
+
* // },
|
|
187
|
+
* // { name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
188
|
+
* // {
|
|
189
|
+
* // name: 'Suppressor',
|
|
190
|
+
* // quality: 'legendary',
|
|
191
|
+
* // level: 88
|
|
192
|
+
* // },
|
|
193
|
+
* // { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
194
|
+
* // ]
|
|
195
|
+
* // ]
|
|
38
196
|
*/
|
|
39
197
|
export declare class TreeMultiMap<K = any, V = any, R = object, MK = any, MV = any, MR = object> extends RedBlackTree<K, V[], R, MK, MV[], MR> implements IBinaryTree<K, V[], R, MK, MV, MR> {
|
|
40
198
|
/**
|
|
@@ -67,15 +225,18 @@ export declare class TreeMultiMap<K = any, V = any, R = object, MK = any, MV = a
|
|
|
67
225
|
* Time Complexity: O(1)
|
|
68
226
|
* Space Complexity: O(1)
|
|
69
227
|
*
|
|
70
|
-
* The function `createNode` overrides the
|
|
71
|
-
*
|
|
72
|
-
* @param {K} key - The `key` parameter
|
|
73
|
-
*
|
|
74
|
-
* @
|
|
75
|
-
*
|
|
228
|
+
* The function `createNode` overrides the creation of a new TreeMultiMapNode with a specified key
|
|
229
|
+
* and value array.
|
|
230
|
+
* @param {K} key - The `key` parameter represents the key of the node being created in the
|
|
231
|
+
* `TreeMultiMap`.
|
|
232
|
+
* @param {V[]} value - The `value` parameter in the `createNode` method represents an array of
|
|
233
|
+
* values associated with a specific key in the TreeMultiMap data structure.
|
|
234
|
+
* @returns A new instance of `TreeMultiMapNode<K, V>` is being returned with the specified key and
|
|
235
|
+
* value. If `_isMapMode` is true, an empty array is passed as the value, otherwise the provided
|
|
236
|
+
* value is used.
|
|
76
237
|
*/
|
|
77
|
-
createNode(key: K): TreeMultiMapNode<K, V>;
|
|
78
|
-
add(
|
|
238
|
+
createNode(key: K, value?: V[]): TreeMultiMapNode<K, V>;
|
|
239
|
+
add(keyNodeOrEntry: K | TreeMultiMapNode<K, V> | [K | null | undefined, V[] | undefined] | null | undefined): boolean;
|
|
79
240
|
add(key: K, value: V): boolean;
|
|
80
241
|
/**
|
|
81
242
|
* Time Complexity: O(log n)
|
|
@@ -37,11 +37,169 @@ export class TreeMultiMapNode extends RedBlackTreeNode {
|
|
|
37
37
|
/**
|
|
38
38
|
*
|
|
39
39
|
* @example
|
|
40
|
-
* //
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
40
|
+
* // players ranked by score with their equipment
|
|
41
|
+
* type Equipment = {
|
|
42
|
+
* name: string; // Equipment name
|
|
43
|
+
* quality: 'legendary' | 'epic' | 'rare' | 'common';
|
|
44
|
+
* level: number;
|
|
45
|
+
* };
|
|
46
|
+
*
|
|
47
|
+
* type Player = {
|
|
48
|
+
* name: string;
|
|
49
|
+
* score: number;
|
|
50
|
+
* equipments: Equipment[];
|
|
51
|
+
* };
|
|
52
|
+
*
|
|
53
|
+
* // Mock player data with their scores and equipment
|
|
54
|
+
* const players: Player[] = [
|
|
55
|
+
* {
|
|
56
|
+
* name: 'DragonSlayer',
|
|
57
|
+
* score: 8750,
|
|
58
|
+
* equipments: [
|
|
59
|
+
* { name: 'AWM', quality: 'legendary', level: 85 },
|
|
60
|
+
* { name: 'Level 3 Helmet', quality: 'epic', level: 80 },
|
|
61
|
+
* { name: 'Extended Quickdraw Mag', quality: 'rare', level: 75 },
|
|
62
|
+
* { name: 'Compensator', quality: 'epic', level: 78 },
|
|
63
|
+
* { name: 'Vertical Grip', quality: 'rare', level: 72 }
|
|
64
|
+
* ]
|
|
65
|
+
* },
|
|
66
|
+
* {
|
|
67
|
+
* name: 'ShadowNinja',
|
|
68
|
+
* score: 7200,
|
|
69
|
+
* equipments: [
|
|
70
|
+
* { name: 'M416', quality: 'epic', level: 75 },
|
|
71
|
+
* { name: 'Ghillie Suit', quality: 'rare', level: 70 },
|
|
72
|
+
* { name: 'Red Dot Sight', quality: 'common', level: 65 },
|
|
73
|
+
* { name: 'Extended QuickDraw Mag', quality: 'rare', level: 68 }
|
|
74
|
+
* ]
|
|
75
|
+
* },
|
|
76
|
+
* {
|
|
77
|
+
* name: 'RuneMaster',
|
|
78
|
+
* score: 9100,
|
|
79
|
+
* equipments: [
|
|
80
|
+
* { name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
81
|
+
* { name: 'Level 3 Vest', quality: 'legendary', level: 85 },
|
|
82
|
+
* { name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
83
|
+
* { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
84
|
+
* { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
85
|
+
* ]
|
|
86
|
+
* },
|
|
87
|
+
* {
|
|
88
|
+
* name: 'BattleKing',
|
|
89
|
+
* score: 8500,
|
|
90
|
+
* equipments: [
|
|
91
|
+
* { name: 'AUG', quality: 'epic', level: 82 },
|
|
92
|
+
* { name: 'Red Dot Sight', quality: 'rare', level: 75 },
|
|
93
|
+
* { name: 'Extended Mag', quality: 'common', level: 70 },
|
|
94
|
+
* { name: 'Tactical Stock', quality: 'rare', level: 76 }
|
|
95
|
+
* ]
|
|
96
|
+
* },
|
|
97
|
+
* {
|
|
98
|
+
* name: 'SniperElite',
|
|
99
|
+
* score: 7800,
|
|
100
|
+
* equipments: [
|
|
101
|
+
* { name: 'M24', quality: 'legendary', level: 88 },
|
|
102
|
+
* { name: 'Compensator', quality: 'epic', level: 80 },
|
|
103
|
+
* { name: 'Scope 8x', quality: 'legendary', level: 85 },
|
|
104
|
+
* { name: 'Level 2 Helmet', quality: 'rare', level: 75 }
|
|
105
|
+
* ]
|
|
106
|
+
* },
|
|
107
|
+
* {
|
|
108
|
+
* name: 'RushMaster',
|
|
109
|
+
* score: 7500,
|
|
110
|
+
* equipments: [
|
|
111
|
+
* { name: 'Vector', quality: 'rare', level: 72 },
|
|
112
|
+
* { name: 'Level 2 Helmet', quality: 'common', level: 65 },
|
|
113
|
+
* { name: 'Quickdraw Mag', quality: 'common', level: 60 },
|
|
114
|
+
* { name: 'Laser Sight', quality: 'rare', level: 68 }
|
|
115
|
+
* ]
|
|
116
|
+
* },
|
|
117
|
+
* {
|
|
118
|
+
* name: 'GhostWarrior',
|
|
119
|
+
* score: 8200,
|
|
120
|
+
* equipments: [
|
|
121
|
+
* { name: 'SCAR-L', quality: 'epic', level: 78 },
|
|
122
|
+
* { name: 'Extended Quickdraw Mag', quality: 'rare', level: 70 },
|
|
123
|
+
* { name: 'Holographic Sight', quality: 'epic', level: 75 },
|
|
124
|
+
* { name: 'Suppressor', quality: 'rare', level: 72 },
|
|
125
|
+
* { name: 'Vertical Grip', quality: 'common', level: 65 }
|
|
126
|
+
* ]
|
|
127
|
+
* },
|
|
128
|
+
* {
|
|
129
|
+
* name: 'DeathDealer',
|
|
130
|
+
* score: 7300,
|
|
131
|
+
* equipments: [
|
|
132
|
+
* { name: 'SKS', quality: 'epic', level: 76 },
|
|
133
|
+
* { name: 'Holographic Sight', quality: 'rare', level: 68 },
|
|
134
|
+
* { name: 'Extended Mag', quality: 'common', level: 65 }
|
|
135
|
+
* ]
|
|
136
|
+
* },
|
|
137
|
+
* {
|
|
138
|
+
* name: 'StormRider',
|
|
139
|
+
* score: 8900,
|
|
140
|
+
* equipments: [
|
|
141
|
+
* { name: 'MK14', quality: 'legendary', level: 92 },
|
|
142
|
+
* { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
143
|
+
* { name: 'Scope 8x', quality: 'epic', level: 80 },
|
|
144
|
+
* { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
145
|
+
* { name: 'Tactical Stock', quality: 'rare', level: 75 }
|
|
146
|
+
* ]
|
|
147
|
+
* },
|
|
148
|
+
* {
|
|
149
|
+
* name: 'CombatLegend',
|
|
150
|
+
* score: 7600,
|
|
151
|
+
* equipments: [
|
|
152
|
+
* { name: 'UMP45', quality: 'rare', level: 74 },
|
|
153
|
+
* { name: 'Level 2 Vest', quality: 'common', level: 67 },
|
|
154
|
+
* { name: 'Red Dot Sight', quality: 'common', level: 62 },
|
|
155
|
+
* { name: 'Extended Mag', quality: 'rare', level: 70 }
|
|
156
|
+
* ]
|
|
157
|
+
* }
|
|
158
|
+
* ];
|
|
159
|
+
*
|
|
160
|
+
* // Create a TreeMultiMap for player rankings
|
|
161
|
+
* const playerRankings = new TreeMultiMap<number, Equipment, Player>(players, {
|
|
162
|
+
* toEntryFn: ({ score, equipments }) => [score, equipments],
|
|
163
|
+
* isMapMode: false
|
|
164
|
+
* });
|
|
165
|
+
*
|
|
166
|
+
* const topPlayersEquipments = playerRankings.rangeSearch([8900, 10000], node => playerRankings.get(node));
|
|
167
|
+
* console.log(topPlayersEquipments); // [
|
|
168
|
+
* // [
|
|
169
|
+
* // {
|
|
170
|
+
* // name: 'MK14',
|
|
171
|
+
* // quality: 'legendary',
|
|
172
|
+
* // level: 92
|
|
173
|
+
* // },
|
|
174
|
+
* // { name: 'Level 3 Backpack', quality: 'legendary', level: 85 },
|
|
175
|
+
* // {
|
|
176
|
+
* // name: 'Scope 8x',
|
|
177
|
+
* // quality: 'epic',
|
|
178
|
+
* // level: 80
|
|
179
|
+
* // },
|
|
180
|
+
* // { name: 'Suppressor', quality: 'legendary', level: 88 },
|
|
181
|
+
* // {
|
|
182
|
+
* // name: 'Tactical Stock',
|
|
183
|
+
* // quality: 'rare',
|
|
184
|
+
* // level: 75
|
|
185
|
+
* // }
|
|
186
|
+
* // ],
|
|
187
|
+
* // [
|
|
188
|
+
* // { name: 'KAR98K', quality: 'legendary', level: 90 },
|
|
189
|
+
* // {
|
|
190
|
+
* // name: 'Level 3 Vest',
|
|
191
|
+
* // quality: 'legendary',
|
|
192
|
+
* // level: 85
|
|
193
|
+
* // },
|
|
194
|
+
* // { name: 'Holographic Sight', quality: 'epic', level: 82 },
|
|
195
|
+
* // {
|
|
196
|
+
* // name: 'Suppressor',
|
|
197
|
+
* // quality: 'legendary',
|
|
198
|
+
* // level: 88
|
|
199
|
+
* // },
|
|
200
|
+
* // { name: 'Level 3 Backpack', quality: 'epic', level: 80 }
|
|
201
|
+
* // ]
|
|
202
|
+
* // ]
|
|
45
203
|
*/
|
|
46
204
|
export class TreeMultiMap extends RedBlackTree {
|
|
47
205
|
/**
|
|
@@ -56,7 +214,7 @@ export class TreeMultiMap extends RedBlackTree {
|
|
|
56
214
|
* additional options for configuring the TreeMultiMap instance.
|
|
57
215
|
*/
|
|
58
216
|
constructor(keysNodesEntriesOrRaws = [], options) {
|
|
59
|
-
super([], { ...options
|
|
217
|
+
super([], { ...options });
|
|
60
218
|
if (keysNodesEntriesOrRaws) {
|
|
61
219
|
this.addMany(keysNodesEntriesOrRaws);
|
|
62
220
|
}
|
|
@@ -80,6 +238,7 @@ export class TreeMultiMap extends RedBlackTree {
|
|
|
80
238
|
specifyComparable: this._specifyComparable,
|
|
81
239
|
toEntryFn: this._toEntryFn,
|
|
82
240
|
isReverse: this._isReverse,
|
|
241
|
+
isMapMode: this._isMapMode,
|
|
83
242
|
...options
|
|
84
243
|
});
|
|
85
244
|
}
|
|
@@ -87,28 +246,30 @@ export class TreeMultiMap extends RedBlackTree {
|
|
|
87
246
|
* Time Complexity: O(1)
|
|
88
247
|
* Space Complexity: O(1)
|
|
89
248
|
*
|
|
90
|
-
* The function `createNode` overrides the
|
|
91
|
-
*
|
|
92
|
-
* @param {K} key - The `key` parameter
|
|
93
|
-
*
|
|
94
|
-
* @
|
|
95
|
-
*
|
|
249
|
+
* The function `createNode` overrides the creation of a new TreeMultiMapNode with a specified key
|
|
250
|
+
* and value array.
|
|
251
|
+
* @param {K} key - The `key` parameter represents the key of the node being created in the
|
|
252
|
+
* `TreeMultiMap`.
|
|
253
|
+
* @param {V[]} value - The `value` parameter in the `createNode` method represents an array of
|
|
254
|
+
* values associated with a specific key in the TreeMultiMap data structure.
|
|
255
|
+
* @returns A new instance of `TreeMultiMapNode<K, V>` is being returned with the specified key and
|
|
256
|
+
* value. If `_isMapMode` is true, an empty array is passed as the value, otherwise the provided
|
|
257
|
+
* value is used.
|
|
96
258
|
*/
|
|
97
|
-
createNode(key) {
|
|
98
|
-
return new TreeMultiMapNode(key, []);
|
|
259
|
+
createNode(key, value = []) {
|
|
260
|
+
return new TreeMultiMapNode(key, this._isMapMode ? [] : value);
|
|
99
261
|
}
|
|
100
262
|
/**
|
|
101
263
|
* Time Complexity: O(log n)
|
|
102
264
|
* Space Complexity: O(log n)
|
|
103
265
|
*
|
|
104
|
-
* The function
|
|
105
|
-
*
|
|
106
|
-
* @param
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
* @param {V} [
|
|
110
|
-
* you want to add to the TreeMultiMap.
|
|
111
|
-
* be added to the existing list of values associated with that key. If the key is not present,
|
|
266
|
+
* The function overrides the add method to handle different types of input for a TreeMultiMap data
|
|
267
|
+
* structure.
|
|
268
|
+
* @param [key] - The `key` parameter in the `override add` method represents the key of the entry to
|
|
269
|
+
* be added to the TreeMultiMap. It can be of type `K`, which is the key type of the TreeMultiMap, or
|
|
270
|
+
* it can be a TreeMultiMapNode containing the key and its
|
|
271
|
+
* @param {V[]} [values] - The `values` parameter in the `add` method represents an array of values
|
|
272
|
+
* that you want to add to the TreeMultiMap. It can contain one or more values of type `V`.
|
|
112
273
|
* @returns The `add` method is returning a boolean value, which indicates whether the operation was
|
|
113
274
|
* successful or not.
|
|
114
275
|
*/
|
|
@@ -118,30 +279,40 @@ export class TreeMultiMap extends RedBlackTree {
|
|
|
118
279
|
const _commonAdd = (key, values) => {
|
|
119
280
|
if (key === undefined || key === null)
|
|
120
281
|
return false;
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
existingValues.push(value);
|
|
125
|
-
return true;
|
|
126
|
-
}
|
|
127
|
-
const existingNode = this.getNode(key);
|
|
128
|
-
if (this.isRealNode(existingNode)) {
|
|
129
|
-
if (existingValues === undefined) {
|
|
130
|
-
super.add(key, values);
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
if (values !== undefined) {
|
|
282
|
+
const _addToValues = () => {
|
|
283
|
+
const existingValues = this.get(key);
|
|
284
|
+
if (existingValues !== undefined && values !== undefined) {
|
|
134
285
|
for (const value of values)
|
|
135
286
|
existingValues.push(value);
|
|
136
287
|
return true;
|
|
137
288
|
}
|
|
289
|
+
return false;
|
|
290
|
+
};
|
|
291
|
+
const _addByNode = () => {
|
|
292
|
+
const existingNode = this.getNode(key);
|
|
293
|
+
if (this.isRealNode(existingNode)) {
|
|
294
|
+
const existingValues = this.get(existingNode);
|
|
295
|
+
if (existingValues === undefined) {
|
|
296
|
+
super.add(key, values);
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
if (values !== undefined) {
|
|
300
|
+
for (const value of values)
|
|
301
|
+
existingValues.push(value);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
138
308
|
else {
|
|
139
|
-
return
|
|
309
|
+
return super.add(key, values);
|
|
140
310
|
}
|
|
311
|
+
};
|
|
312
|
+
if (this._isMapMode) {
|
|
313
|
+
return _addByNode() || _addToValues();
|
|
141
314
|
}
|
|
142
|
-
|
|
143
|
-
return super.add(key, values);
|
|
144
|
-
}
|
|
315
|
+
return _addToValues() || _addByNode();
|
|
145
316
|
};
|
|
146
317
|
if (this.isEntry(keyNodeOrEntry)) {
|
|
147
318
|
const [key, values] = keyNodeOrEntry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-multi-map.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/tree-multi-map.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGlE,MAAM,OAAO,gBAAmC,SAAQ,gBAAwB;IACrE,MAAM,GAA4B,SAAS,CAAC;IAErD;;;;;;;;OAQG;IACH,YAAY,GAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tree-multi-map.js","sourceRoot":"","sources":["../../../../src/data-structures/binary-tree/tree-multi-map.ts"],"names":[],"mappings":"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"}
|
|
@@ -249,7 +249,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
249
249
|
isWeight = false;
|
|
250
250
|
if (isWeight) {
|
|
251
251
|
const allPaths = this.getAllPathsBetween(v1, v2);
|
|
252
|
-
let min =
|
|
252
|
+
let min = Number.MAX_SAFE_INTEGER;
|
|
253
253
|
for (const path of allPaths) {
|
|
254
254
|
min = Math.min(this.getPathSumWeight(path), min);
|
|
255
255
|
}
|
|
@@ -266,8 +266,8 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
266
266
|
const queue = new Queue([vertex1]);
|
|
267
267
|
visited.set(vertex1, true);
|
|
268
268
|
let cost = 0;
|
|
269
|
-
while (queue.
|
|
270
|
-
for (let i = 0; i < queue.
|
|
269
|
+
while (queue.length > 0) {
|
|
270
|
+
for (let i = 0; i < queue.length; i++) {
|
|
271
271
|
const cur = queue.shift();
|
|
272
272
|
if (cur === vertex2) {
|
|
273
273
|
return cost;
|
|
@@ -313,7 +313,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
313
313
|
if (isWeight) {
|
|
314
314
|
if (isDFS) {
|
|
315
315
|
const allPaths = this.getAllPathsBetween(v1, v2, 10000);
|
|
316
|
-
let min =
|
|
316
|
+
let min = Number.MAX_SAFE_INTEGER;
|
|
317
317
|
let minIndex = -1;
|
|
318
318
|
let index = 0;
|
|
319
319
|
for (const path of allPaths) {
|
|
@@ -377,7 +377,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
377
377
|
* @returns The function `dijkstraWithoutHeap` returns an object of type `DijkstraResult<VO>`.
|
|
378
378
|
*/
|
|
379
379
|
dijkstraWithoutHeap(src, dest = undefined, getMinDist = false, genPaths = false) {
|
|
380
|
-
let minDist =
|
|
380
|
+
let minDist = Number.MAX_SAFE_INTEGER;
|
|
381
381
|
let minDest = undefined;
|
|
382
382
|
let minPath = [];
|
|
383
383
|
const paths = [];
|
|
@@ -393,12 +393,12 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
393
393
|
for (const vertex of vertexMap) {
|
|
394
394
|
const vertexOrKey = vertex[1];
|
|
395
395
|
if (vertexOrKey instanceof AbstractVertex)
|
|
396
|
-
distMap.set(vertexOrKey,
|
|
396
|
+
distMap.set(vertexOrKey, Number.MAX_SAFE_INTEGER);
|
|
397
397
|
}
|
|
398
398
|
distMap.set(srcVertex, 0);
|
|
399
399
|
preMap.set(srcVertex, undefined);
|
|
400
400
|
const getMinOfNoSeen = () => {
|
|
401
|
-
let min =
|
|
401
|
+
let min = Number.MAX_SAFE_INTEGER;
|
|
402
402
|
let minV = undefined;
|
|
403
403
|
for (const [key, value] of distMap) {
|
|
404
404
|
if (!seen.has(key)) {
|
|
@@ -433,7 +433,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
433
433
|
seen.add(cur);
|
|
434
434
|
if (destVertex && destVertex === cur) {
|
|
435
435
|
if (getMinDist) {
|
|
436
|
-
minDist = distMap.get(destVertex) ||
|
|
436
|
+
minDist = distMap.get(destVertex) || Number.MAX_SAFE_INTEGER;
|
|
437
437
|
}
|
|
438
438
|
if (genPaths) {
|
|
439
439
|
getPaths(destVertex);
|
|
@@ -494,7 +494,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
494
494
|
* @returns The function `dijkstra` returns an object of type `DijkstraResult<VO>`.
|
|
495
495
|
*/
|
|
496
496
|
dijkstra(src, dest = undefined, getMinDist = false, genPaths = false) {
|
|
497
|
-
let minDist =
|
|
497
|
+
let minDist = Number.MAX_SAFE_INTEGER;
|
|
498
498
|
let minDest = undefined;
|
|
499
499
|
let minPath = [];
|
|
500
500
|
const paths = [];
|
|
@@ -509,7 +509,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
509
509
|
for (const vertex of vertexMap) {
|
|
510
510
|
const vertexOrKey = vertex[1];
|
|
511
511
|
if (vertexOrKey instanceof AbstractVertex)
|
|
512
|
-
distMap.set(vertexOrKey,
|
|
512
|
+
distMap.set(vertexOrKey, Number.MAX_SAFE_INTEGER);
|
|
513
513
|
}
|
|
514
514
|
const heap = new Heap([], { comparator: (a, b) => a.key - b.key });
|
|
515
515
|
heap.add({ key: 0, value: srcVertex });
|
|
@@ -546,7 +546,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
546
546
|
seen.add(cur);
|
|
547
547
|
if (destVertex && destVertex === cur) {
|
|
548
548
|
if (getMinDist) {
|
|
549
|
-
minDist = distMap.get(destVertex) ||
|
|
549
|
+
minDist = distMap.get(destVertex) || Number.MAX_SAFE_INTEGER;
|
|
550
550
|
}
|
|
551
551
|
if (genPaths) {
|
|
552
552
|
getPaths(destVertex);
|
|
@@ -615,7 +615,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
615
615
|
const paths = [];
|
|
616
616
|
const distMap = new Map();
|
|
617
617
|
const preMap = new Map(); // predecessor
|
|
618
|
-
let min =
|
|
618
|
+
let min = Number.MAX_SAFE_INTEGER;
|
|
619
619
|
let minPath = [];
|
|
620
620
|
// TODO
|
|
621
621
|
let hasNegativeCycle;
|
|
@@ -628,7 +628,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
628
628
|
const edgeMap = this.edgeSet();
|
|
629
629
|
const numOfEdges = edgeMap.length;
|
|
630
630
|
this._vertexMap.forEach(vertex => {
|
|
631
|
-
distMap.set(vertex,
|
|
631
|
+
distMap.set(vertex, Number.MAX_SAFE_INTEGER);
|
|
632
632
|
});
|
|
633
633
|
distMap.set(srcVertex, 0);
|
|
634
634
|
for (let i = 1; i < numOfVertices; ++i) {
|
|
@@ -640,7 +640,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
640
640
|
const sWeight = distMap.get(s);
|
|
641
641
|
const dWeight = distMap.get(d);
|
|
642
642
|
if (sWeight !== undefined && dWeight !== undefined) {
|
|
643
|
-
if (distMap.get(s) !==
|
|
643
|
+
if (distMap.get(s) !== Number.MAX_SAFE_INTEGER && sWeight + weight < dWeight) {
|
|
644
644
|
distMap.set(d, sWeight + weight);
|
|
645
645
|
if (genPath)
|
|
646
646
|
preMap.set(d, s);
|
|
@@ -685,7 +685,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
685
685
|
const weight = edgeMap[j].weight;
|
|
686
686
|
const sWeight = distMap.get(s);
|
|
687
687
|
if (sWeight) {
|
|
688
|
-
if (sWeight !==
|
|
688
|
+
if (sWeight !== Number.MAX_SAFE_INTEGER && sWeight + weight < sWeight)
|
|
689
689
|
hasNegativeCycle = true;
|
|
690
690
|
}
|
|
691
691
|
}
|
|
@@ -734,7 +734,7 @@ export class AbstractGraph extends IterableEntryBase {
|
|
|
734
734
|
}
|
|
735
735
|
for (let i = 0; i < n; i++) {
|
|
736
736
|
for (let j = 0; j < n; j++) {
|
|
737
|
-
costs[i][j] = this.getEdge(idAndVertices[i][1], idAndVertices[j][1])?.weight ||
|
|
737
|
+
costs[i][j] = this.getEdge(idAndVertices[i][1], idAndVertices[j][1])?.weight || Number.MAX_SAFE_INTEGER;
|
|
738
738
|
}
|
|
739
739
|
}
|
|
740
740
|
for (let k = 0; k < n; k++) {
|