data-structure-typed 1.49.5 → 1.49.6
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/README.md +14 -23
- package/benchmark/report.html +14 -23
- package/benchmark/report.json +163 -256
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +53 -48
- package/dist/cjs/data-structures/binary-tree/avl-tree.js +55 -49
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +153 -130
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +192 -149
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +83 -71
- package/dist/cjs/data-structures/binary-tree/bst.js +113 -89
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.d.ts +37 -35
- package/dist/cjs/data-structures/binary-tree/rb-tree.js +62 -59
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multimap.d.ts +46 -39
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js +58 -51
- package/dist/cjs/data-structures/binary-tree/tree-multimap.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +3 -3
- package/dist/cjs/types/common.d.ts +3 -3
- package/dist/cjs/types/common.js +2 -2
- package/dist/cjs/types/common.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +53 -48
- package/dist/mjs/data-structures/binary-tree/avl-tree.js +55 -49
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +153 -130
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +192 -149
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +83 -71
- package/dist/mjs/data-structures/binary-tree/bst.js +113 -89
- package/dist/mjs/data-structures/binary-tree/rb-tree.d.ts +37 -35
- package/dist/mjs/data-structures/binary-tree/rb-tree.js +62 -59
- package/dist/mjs/data-structures/binary-tree/tree-multimap.d.ts +46 -39
- package/dist/mjs/data-structures/binary-tree/tree-multimap.js +58 -51
- package/dist/mjs/interfaces/binary-tree.d.ts +3 -3
- package/dist/mjs/types/common.d.ts +3 -3
- package/dist/mjs/types/common.js +2 -2
- package/dist/umd/data-structure-typed.js +497 -419
- package/dist/umd/data-structure-typed.min.js +2 -2
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +1 -1
- package/src/data-structures/binary-tree/avl-tree.ts +58 -53
- package/src/data-structures/binary-tree/binary-tree.ts +253 -205
- package/src/data-structures/binary-tree/bst.ts +125 -104
- package/src/data-structures/binary-tree/rb-tree.ts +66 -64
- package/src/data-structures/binary-tree/tree-multimap.ts +62 -56
- package/src/interfaces/binary-tree.ts +3 -3
- package/src/types/common.ts +3 -3
- package/test/performance/data-structures/binary-tree/avl-tree.test.ts +4 -12
- package/test/performance/data-structures/binary-tree/binary-tree-overall.test.ts +37 -0
- package/test/performance/data-structures/binary-tree/binary-tree.test.ts +6 -16
- package/test/performance/data-structures/binary-tree/bst.test.ts +5 -13
- package/test/performance/data-structures/binary-tree/rb-tree.test.ts +5 -15
- package/test/performance/data-structures/comparison/comparison.test.ts +13 -36
- package/test/performance/data-structures/graph/directed-graph.test.ts +3 -14
- package/test/performance/data-structures/hash/hash-map.test.ts +11 -34
- package/test/performance/data-structures/heap/heap.test.ts +5 -18
- package/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +0 -1
- package/test/performance/data-structures/linked-list/singly-linked-list.test.ts +0 -2
- package/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +2 -4
- package/test/performance/data-structures/priority-queue/priority-queue.test.ts +4 -14
- package/test/performance/data-structures/queue/queue.test.ts +8 -25
- package/test/performance/data-structures/stack/stack.test.ts +6 -18
- package/test/performance/data-structures/trie/trie.test.ts +2 -6
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +6 -5
- package/test/unit/data-structures/binary-tree/bst.test.ts +17 -1
- package/test/performance/data-structures/binary-tree/overall.test.ts +0 -0
- package/test/performance/data-structures/matrix/matrix2d.test.ts +0 -0
- package/test/performance/data-structures/matrix/vector2d.test.ts +0 -0
|
@@ -12,33 +12,23 @@ const cOrderedMap = new OrderedMap<number, number>();
|
|
|
12
12
|
|
|
13
13
|
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
|
|
14
14
|
rbTree.clear();
|
|
15
|
-
for (let i = 0; i < arr.length; i++)
|
|
16
|
-
rbTree.add(arr[i]);
|
|
17
|
-
}
|
|
15
|
+
for (let i = 0; i < arr.length; i++) rbTree.add(arr[i]);
|
|
18
16
|
});
|
|
19
17
|
|
|
20
18
|
if (isCompetitor) {
|
|
21
19
|
suite.add(`CPT ${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
|
|
22
|
-
for (let i = 0; i < arr.length; i++)
|
|
23
|
-
cOrderedMap.setElement(arr[i], arr[i]);
|
|
24
|
-
}
|
|
20
|
+
for (let i = 0; i < arr.length; i++) cOrderedMap.setElement(arr[i], arr[i]);
|
|
25
21
|
});
|
|
26
22
|
}
|
|
27
23
|
|
|
28
24
|
suite
|
|
29
25
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & delete randomly`, () => {
|
|
30
26
|
rbTree.clear();
|
|
31
|
-
for (let i = 0; i < arr.length; i++)
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
for (let i = 0; i < arr.length; i++) {
|
|
35
|
-
rbTree.delete(arr[i]);
|
|
36
|
-
}
|
|
27
|
+
for (let i = 0; i < arr.length; i++) rbTree.add(arr[i]);
|
|
28
|
+
for (let i = 0; i < arr.length; i++) rbTree.delete(arr[i]);
|
|
37
29
|
})
|
|
38
30
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} getNode`, () => {
|
|
39
|
-
for (let i = 0; i < arr.length; i++)
|
|
40
|
-
rbTree.getNode(arr[i]);
|
|
41
|
-
}
|
|
31
|
+
for (let i = 0; i < arr.length; i++) rbTree.getNode(arr[i]);
|
|
42
32
|
});
|
|
43
33
|
|
|
44
34
|
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add & iterator`, () => {
|
|
@@ -70,75 +70,52 @@ if (isCompetitor) {
|
|
|
70
70
|
for (let i = 0; i < TEN_THOUSAND; i++) pq.pop();
|
|
71
71
|
})
|
|
72
72
|
.add(`CPT OM ${HUNDRED_THOUSAND.toLocaleString()} add`, () => {
|
|
73
|
-
for (let i = 0; i < arrHundredThousand.length; i++)
|
|
73
|
+
for (let i = 0; i < arrHundredThousand.length; i++)
|
|
74
74
|
cOrderedMap.setElement(arrHundredThousand[i], arrHundredThousand[i]);
|
|
75
|
-
}
|
|
76
75
|
})
|
|
77
76
|
.add(`CPT HM ${TEN_THOUSAND.toLocaleString()} set`, () => {
|
|
78
77
|
const hm = new CHashMap<number, number>();
|
|
79
78
|
|
|
80
|
-
for (let i = 0; i < TEN_THOUSAND; i++)
|
|
81
|
-
hm.setElement(i, i);
|
|
82
|
-
}
|
|
79
|
+
for (let i = 0; i < TEN_THOUSAND; i++) hm.setElement(i, i);
|
|
83
80
|
})
|
|
84
81
|
.add(`CPT HM ${TEN_THOUSAND.toLocaleString()} set & get`, () => {
|
|
85
82
|
const hm = new CHashMap<number, number>();
|
|
86
83
|
|
|
87
|
-
for (let i = 0; i < TEN_THOUSAND; i++)
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
for (let i = 0; i < TEN_THOUSAND; i++) {
|
|
91
|
-
hm.getElementByKey(i);
|
|
92
|
-
}
|
|
84
|
+
for (let i = 0; i < TEN_THOUSAND; i++) hm.setElement(i, i);
|
|
85
|
+
for (let i = 0; i < TEN_THOUSAND; i++) hm.getElementByKey(i);
|
|
93
86
|
})
|
|
94
87
|
.add(`CPT LL ${MILLION.toLocaleString()} unshift`, () => {
|
|
95
88
|
const list = new CLinkedList<number>();
|
|
96
89
|
|
|
97
|
-
for (let i = 0; i < MILLION; i++)
|
|
98
|
-
list.pushFront(i);
|
|
99
|
-
}
|
|
90
|
+
for (let i = 0; i < MILLION; i++) list.pushFront(i);
|
|
100
91
|
})
|
|
101
92
|
.add(`CPT PQ ${TEN_THOUSAND.toLocaleString()} add & pop`, () => {
|
|
102
93
|
const pq = new CPriorityQueue<number>();
|
|
103
94
|
|
|
104
|
-
for (let i = 0; i < TEN_THOUSAND; i++)
|
|
105
|
-
pq.push(i);
|
|
106
|
-
}
|
|
95
|
+
for (let i = 0; i < TEN_THOUSAND; i++) pq.push(i);
|
|
107
96
|
|
|
108
|
-
for (let i = 0; i < TEN_THOUSAND; i++)
|
|
109
|
-
pq.pop();
|
|
110
|
-
}
|
|
97
|
+
for (let i = 0; i < TEN_THOUSAND; i++) pq.pop();
|
|
111
98
|
})
|
|
112
99
|
.add(`CPT DQ ${MILLION.toLocaleString()} push`, () => {
|
|
113
100
|
const deque = new CDeque<number>();
|
|
114
|
-
for (let i = 0; i < MILLION; i++)
|
|
115
|
-
deque.pushBack(i);
|
|
116
|
-
}
|
|
101
|
+
for (let i = 0; i < MILLION; i++) deque.pushBack(i);
|
|
117
102
|
})
|
|
118
103
|
.add(`CPT Q ${MILLION.toLocaleString()} push`, () => {
|
|
119
104
|
const queue = new CQueue<number>();
|
|
120
105
|
|
|
121
|
-
for (let i = 0; i < MILLION; i++)
|
|
122
|
-
queue.push(i);
|
|
123
|
-
}
|
|
106
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
124
107
|
})
|
|
125
108
|
.add(`CPT ST ${MILLION.toLocaleString()} push`, () => {
|
|
126
109
|
const queue = new CStack<number>();
|
|
127
110
|
|
|
128
|
-
for (let i = 0; i < MILLION; i++)
|
|
129
|
-
queue.push(i);
|
|
130
|
-
}
|
|
111
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
131
112
|
})
|
|
132
113
|
.add(`CPT ST ${MILLION.toLocaleString()} push & pop`, () => {
|
|
133
114
|
const queue = new CStack<number>();
|
|
134
115
|
|
|
135
|
-
for (let i = 0; i < MILLION; i++)
|
|
136
|
-
|
|
137
|
-
}
|
|
138
|
-
for (let i = 0; i < MILLION; i++) {
|
|
139
|
-
queue.pop();
|
|
140
|
-
}
|
|
116
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
117
|
+
for (let i = 0; i < MILLION; i++) queue.pop();
|
|
141
118
|
});
|
|
142
119
|
}
|
|
143
120
|
|
|
144
|
-
export { suite };
|
|
121
|
+
// export { suite };
|
|
@@ -9,9 +9,7 @@ const vertexes = getRandomWords(THOUSAND);
|
|
|
9
9
|
|
|
10
10
|
suite
|
|
11
11
|
.add(`${THOUSAND.toLocaleString()} addVertex`, () => {
|
|
12
|
-
for (const v of vertexes)
|
|
13
|
-
graph.addVertex(v);
|
|
14
|
-
}
|
|
12
|
+
for (const v of vertexes) graph.addVertex(v);
|
|
15
13
|
})
|
|
16
14
|
.add(`${THOUSAND.toLocaleString()} addEdge`, () => {
|
|
17
15
|
for (let i = 0; i < THOUSAND; i++) {
|
|
@@ -21,29 +19,20 @@ suite
|
|
|
21
19
|
}
|
|
22
20
|
})
|
|
23
21
|
.add(`${THOUSAND.toLocaleString()} getVertex`, () => {
|
|
24
|
-
for (let i = 0; i < THOUSAND; i++)
|
|
25
|
-
graph.getVertex(vertexes[getRandomIndex(vertexes)]);
|
|
26
|
-
}
|
|
22
|
+
for (let i = 0; i < THOUSAND; i++) graph.getVertex(vertexes[getRandomIndex(vertexes)]);
|
|
27
23
|
})
|
|
28
24
|
.add(`${THOUSAND.toLocaleString()} getEdge`, () => {
|
|
29
|
-
for (let i = 0; i < THOUSAND; i++)
|
|
25
|
+
for (let i = 0; i < THOUSAND; i++)
|
|
30
26
|
graph.getEdge(vertexes[getRandomIndex(vertexes)], vertexes[getRandomIndex(vertexes)]);
|
|
31
|
-
}
|
|
32
27
|
})
|
|
33
28
|
.add(`tarjan`, () => {
|
|
34
|
-
// for (let i = 0; i < THOUSAND; i++) {
|
|
35
29
|
graph.tarjan(true);
|
|
36
|
-
// }
|
|
37
30
|
})
|
|
38
31
|
.add(`tarjan all`, () => {
|
|
39
|
-
// for (let i = 0; i < THOUSAND; i++) {
|
|
40
32
|
graph.tarjan(true, true, true, true);
|
|
41
|
-
// }
|
|
42
33
|
})
|
|
43
34
|
.add(`topologicalSort`, () => {
|
|
44
|
-
// for (let i = 0; i < THOUSAND; i++) {
|
|
45
35
|
graph.topologicalSort('key');
|
|
46
|
-
// }
|
|
47
36
|
});
|
|
48
37
|
|
|
49
38
|
export { suite };
|
|
@@ -10,18 +10,14 @@ const { MILLION } = magnitude;
|
|
|
10
10
|
suite.add(`${MILLION.toLocaleString()} set`, () => {
|
|
11
11
|
const hm = new HashMap<number, number>();
|
|
12
12
|
|
|
13
|
-
for (let i = 0; i < MILLION; i++)
|
|
14
|
-
hm.set(i, i);
|
|
15
|
-
}
|
|
13
|
+
for (let i = 0; i < MILLION; i++) hm.set(i, i);
|
|
16
14
|
});
|
|
17
15
|
|
|
18
16
|
if (isCompetitor) {
|
|
19
17
|
suite.add(`CPT ${MILLION.toLocaleString()} set`, () => {
|
|
20
18
|
const hm = new CHashMap<number, number>();
|
|
21
19
|
|
|
22
|
-
for (let i = 0; i < MILLION; i++)
|
|
23
|
-
hm.setElement(i, i);
|
|
24
|
-
}
|
|
20
|
+
for (let i = 0; i < MILLION; i++) hm.setElement(i, i);
|
|
25
21
|
});
|
|
26
22
|
}
|
|
27
23
|
|
|
@@ -40,43 +36,30 @@ suite.add(`Native Set ${MILLION.toLocaleString()} add`, () => {
|
|
|
40
36
|
suite.add(`${MILLION.toLocaleString()} set & get`, () => {
|
|
41
37
|
const hm = new HashMap<number, number>();
|
|
42
38
|
|
|
43
|
-
for (let i = 0; i < MILLION; i++)
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
for (let i = 0; i < MILLION; i++) {
|
|
47
|
-
hm.get(i);
|
|
48
|
-
}
|
|
39
|
+
for (let i = 0; i < MILLION; i++) hm.set(i, i);
|
|
40
|
+
for (let i = 0; i < MILLION; i++) hm.get(i);
|
|
49
41
|
});
|
|
50
42
|
|
|
51
43
|
if (isCompetitor) {
|
|
52
44
|
suite.add(`CPT ${MILLION.toLocaleString()} set & get`, () => {
|
|
53
45
|
const hm = new CHashMap<number, number>();
|
|
54
46
|
|
|
55
|
-
for (let i = 0; i < MILLION; i++)
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
for (let i = 0; i < MILLION; i++) {
|
|
59
|
-
hm.getElementByKey(i);
|
|
60
|
-
}
|
|
47
|
+
for (let i = 0; i < MILLION; i++) hm.setElement(i, i);
|
|
48
|
+
for (let i = 0; i < MILLION; i++) hm.getElementByKey(i);
|
|
61
49
|
});
|
|
62
50
|
}
|
|
63
51
|
|
|
64
52
|
suite.add(`Native Map ${MILLION.toLocaleString()} set & get`, () => {
|
|
65
53
|
const hm = new Map<number, number>();
|
|
66
54
|
|
|
67
|
-
for (let i = 0; i < MILLION; i++)
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
for (let i = 0; i < MILLION; i++) {
|
|
71
|
-
hm.get(i);
|
|
72
|
-
}
|
|
55
|
+
for (let i = 0; i < MILLION; i++) hm.set(i, i);
|
|
56
|
+
for (let i = 0; i < MILLION; i++) hm.get(i);
|
|
73
57
|
});
|
|
74
58
|
|
|
75
59
|
suite.add(`Native Set ${MILLION.toLocaleString()} add & has`, () => {
|
|
76
60
|
const hs = new Set<number>();
|
|
77
61
|
|
|
78
62
|
for (let i = 0; i < MILLION; i++) hs.add(i);
|
|
79
|
-
|
|
80
63
|
for (let i = 0; i < MILLION; i++) hs.has(i);
|
|
81
64
|
});
|
|
82
65
|
|
|
@@ -88,9 +71,7 @@ suite.add(`${MILLION.toLocaleString()} ObjKey set & get`, () => {
|
|
|
88
71
|
objKeys.push(obj);
|
|
89
72
|
hm.set(obj, i);
|
|
90
73
|
}
|
|
91
|
-
for (let i = 0; i < MILLION; i++)
|
|
92
|
-
hm.get(objKeys[i]);
|
|
93
|
-
}
|
|
74
|
+
for (let i = 0; i < MILLION; i++) hm.get(objKeys[i]);
|
|
94
75
|
});
|
|
95
76
|
|
|
96
77
|
suite.add(`Native Map ${MILLION.toLocaleString()} ObjKey set & get`, () => {
|
|
@@ -101,9 +82,7 @@ suite.add(`Native Map ${MILLION.toLocaleString()} ObjKey set & get`, () => {
|
|
|
101
82
|
objs.push(obj);
|
|
102
83
|
hm.set(obj, i);
|
|
103
84
|
}
|
|
104
|
-
for (let i = 0; i < MILLION; i++)
|
|
105
|
-
hm.get(objs[i]);
|
|
106
|
-
}
|
|
85
|
+
for (let i = 0; i < MILLION; i++) hm.get(objs[i]);
|
|
107
86
|
});
|
|
108
87
|
|
|
109
88
|
suite.add(`Native Set ${MILLION.toLocaleString()} ObjKey add & has`, () => {
|
|
@@ -114,9 +93,7 @@ suite.add(`Native Set ${MILLION.toLocaleString()} ObjKey add & has`, () => {
|
|
|
114
93
|
objs.push(obj);
|
|
115
94
|
hs.add(obj);
|
|
116
95
|
}
|
|
117
|
-
for (let i = 0; i < MILLION; i++)
|
|
118
|
-
hs.has(objs[i]);
|
|
119
|
-
}
|
|
96
|
+
for (let i = 0; i < MILLION; i++) hs.has(objs[i]);
|
|
120
97
|
});
|
|
121
98
|
|
|
122
99
|
export { suite };
|
|
@@ -9,31 +9,18 @@ suite
|
|
|
9
9
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & poll`, () => {
|
|
10
10
|
const heap = new Heap<number>([], { comparator: (a, b) => b - a });
|
|
11
11
|
|
|
12
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
17
|
-
heap.poll();
|
|
18
|
-
}
|
|
12
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) heap.add(i);
|
|
13
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) heap.poll();
|
|
19
14
|
})
|
|
20
15
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} add & dfs`, () => {
|
|
21
16
|
const heap = new Heap<number>([], { comparator: (a, b) => b - a });
|
|
22
|
-
|
|
23
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
24
|
-
heap.add(i);
|
|
25
|
-
}
|
|
26
|
-
|
|
17
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) heap.add(i);
|
|
27
18
|
heap.dfs();
|
|
28
19
|
})
|
|
29
20
|
.add(`${TEN_THOUSAND.toLocaleString()} fib add & pop`, () => {
|
|
30
21
|
const fbHeap = new FibonacciHeap<number>();
|
|
31
|
-
for (let i = 1; i <= TEN_THOUSAND; i++)
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
for (let i = 1; i <= TEN_THOUSAND; i++) {
|
|
35
|
-
fbHeap.pop();
|
|
36
|
-
}
|
|
22
|
+
for (let i = 1; i <= TEN_THOUSAND; i++) fbHeap.push(i);
|
|
23
|
+
for (let i = 1; i <= TEN_THOUSAND; i++) fbHeap.pop();
|
|
37
24
|
});
|
|
38
25
|
|
|
39
26
|
export { suite };
|
|
@@ -10,14 +10,12 @@ suite
|
|
|
10
10
|
const list = new SinglyLinkedList<number>();
|
|
11
11
|
|
|
12
12
|
for (let i = 0; i < MILLION; i++) list.push(i);
|
|
13
|
-
|
|
14
13
|
for (let i = 0; i < MILLION; i++) list.shift();
|
|
15
14
|
})
|
|
16
15
|
.add(`${TEN_THOUSAND.toLocaleString()} push & pop`, () => {
|
|
17
16
|
const list = new SinglyLinkedList<number>();
|
|
18
17
|
|
|
19
18
|
for (let i = 0; i < TEN_THOUSAND; i++) list.push(i);
|
|
20
|
-
|
|
21
19
|
for (let i = 0; i < TEN_THOUSAND; i++) list.pop();
|
|
22
20
|
})
|
|
23
21
|
.add(`${TEN_THOUSAND.toLocaleString()} addBefore`, () => {
|
|
@@ -11,9 +11,7 @@ suite.add(`${TEN_THOUSAND.toLocaleString()} refill & poll`, () => {
|
|
|
11
11
|
);
|
|
12
12
|
const maxPQ = new MaxPriorityQueue<number>();
|
|
13
13
|
maxPQ.refill(nodes);
|
|
14
|
-
while (maxPQ.size > 0)
|
|
15
|
-
maxPQ.poll();
|
|
16
|
-
}
|
|
14
|
+
while (maxPQ.size > 0) maxPQ.poll();
|
|
17
15
|
});
|
|
18
16
|
|
|
19
|
-
export { suite };
|
|
17
|
+
// export { suite };
|
|
@@ -10,25 +10,15 @@ const { HUNDRED_THOUSAND } = magnitude;
|
|
|
10
10
|
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add & poll`, () => {
|
|
11
11
|
const pq = new PriorityQueue<number>([], { comparator: (a, b) => b - a });
|
|
12
12
|
|
|
13
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
18
|
-
pq.poll();
|
|
19
|
-
}
|
|
13
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) pq.add(i);
|
|
14
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) pq.poll();
|
|
20
15
|
});
|
|
21
16
|
if (isCompetitor) {
|
|
22
17
|
suite.add(`CPT ${HUNDRED_THOUSAND.toLocaleString()} add & pop`, () => {
|
|
23
18
|
const pq = new CPriorityQueue<number>();
|
|
24
19
|
|
|
25
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
30
|
-
pq.pop();
|
|
31
|
-
}
|
|
20
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) pq.push(i);
|
|
21
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) pq.pop();
|
|
32
22
|
});
|
|
33
23
|
}
|
|
34
24
|
|
|
@@ -10,50 +10,33 @@ const { MILLION, HUNDRED_THOUSAND } = magnitude;
|
|
|
10
10
|
suite.add(`${MILLION.toLocaleString()} push`, () => {
|
|
11
11
|
const queue = new Queue<number>();
|
|
12
12
|
|
|
13
|
-
for (let i = 0; i < MILLION; i++)
|
|
14
|
-
queue.push(i);
|
|
15
|
-
}
|
|
13
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
16
14
|
});
|
|
17
15
|
if (isCompetitor) {
|
|
18
16
|
suite.add(`CPT ${MILLION.toLocaleString()} push`, () => {
|
|
19
17
|
const queue = new CQueue<number>();
|
|
20
18
|
|
|
21
|
-
for (let i = 0; i < MILLION; i++)
|
|
22
|
-
queue.push(i);
|
|
23
|
-
}
|
|
19
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
24
20
|
});
|
|
25
21
|
}
|
|
26
22
|
suite.add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
|
|
27
23
|
const queue = new Queue<number>();
|
|
28
24
|
|
|
29
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
33
|
-
queue.shift();
|
|
34
|
-
}
|
|
25
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) queue.push(i);
|
|
26
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) queue.shift();
|
|
35
27
|
});
|
|
36
28
|
suite
|
|
37
29
|
.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => {
|
|
38
30
|
const arr = new Array<number>();
|
|
39
31
|
|
|
40
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
44
|
-
arr.shift();
|
|
45
|
-
}
|
|
32
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) arr.push(i);
|
|
33
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) arr.shift();
|
|
46
34
|
})
|
|
47
35
|
.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & pop`, () => {
|
|
48
36
|
const arr = new Array<number>();
|
|
49
37
|
|
|
50
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++)
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
for (let i = 0; i < HUNDRED_THOUSAND; i++) {
|
|
55
|
-
arr.pop();
|
|
56
|
-
}
|
|
38
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) arr.push(i);
|
|
39
|
+
for (let i = 0; i < HUNDRED_THOUSAND; i++) arr.pop();
|
|
57
40
|
});
|
|
58
41
|
|
|
59
42
|
export { suite };
|
|
@@ -10,39 +10,27 @@ const { MILLION } = magnitude;
|
|
|
10
10
|
suite.add(`${MILLION.toLocaleString()} push`, () => {
|
|
11
11
|
const stack = new Stack<number>();
|
|
12
12
|
|
|
13
|
-
for (let i = 0; i < MILLION; i++)
|
|
14
|
-
stack.push(i);
|
|
15
|
-
}
|
|
13
|
+
for (let i = 0; i < MILLION; i++) stack.push(i);
|
|
16
14
|
});
|
|
17
15
|
if (isCompetitor) {
|
|
18
16
|
suite.add(`CPT ${MILLION.toLocaleString()} push`, () => {
|
|
19
17
|
const queue = new CStack<number>();
|
|
20
18
|
|
|
21
|
-
for (let i = 0; i < MILLION; i++)
|
|
22
|
-
queue.push(i);
|
|
23
|
-
}
|
|
19
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
24
20
|
});
|
|
25
21
|
}
|
|
26
22
|
suite.add(`${MILLION.toLocaleString()} push & pop`, () => {
|
|
27
23
|
const queue = new Stack<number>();
|
|
28
24
|
|
|
29
|
-
for (let i = 0; i < MILLION; i++)
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
for (let i = 0; i < MILLION; i++) {
|
|
33
|
-
queue.pop();
|
|
34
|
-
}
|
|
25
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
26
|
+
for (let i = 0; i < MILLION; i++) queue.pop();
|
|
35
27
|
});
|
|
36
28
|
if (isCompetitor) {
|
|
37
29
|
suite.add(`CPT ${MILLION.toLocaleString()} push & pop`, () => {
|
|
38
30
|
const queue = new CStack<number>();
|
|
39
31
|
|
|
40
|
-
for (let i = 0; i < MILLION; i++)
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
for (let i = 0; i < MILLION; i++) {
|
|
44
|
-
queue.pop();
|
|
45
|
-
}
|
|
32
|
+
for (let i = 0; i < MILLION; i++) queue.push(i);
|
|
33
|
+
for (let i = 0; i < MILLION; i++) queue.pop();
|
|
46
34
|
});
|
|
47
35
|
}
|
|
48
36
|
|
|
@@ -9,14 +9,10 @@ const randomWords = getRandomWords(HUNDRED_THOUSAND, false);
|
|
|
9
9
|
|
|
10
10
|
suite
|
|
11
11
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} push`, () => {
|
|
12
|
-
for (let i = 0; i < randomWords.length; i++)
|
|
13
|
-
trie.add(randomWords[i]);
|
|
14
|
-
}
|
|
12
|
+
for (let i = 0; i < randomWords.length; i++) trie.add(randomWords[i]);
|
|
15
13
|
})
|
|
16
14
|
.add(`${HUNDRED_THOUSAND.toLocaleString()} getWords`, () => {
|
|
17
|
-
for (let i = 0; i < randomWords.length; i++)
|
|
18
|
-
trie.getWords(randomWords[i]);
|
|
19
|
-
}
|
|
15
|
+
for (let i = 0; i < randomWords.length; i++) trie.getWords(randomWords[i]);
|
|
20
16
|
});
|
|
21
17
|
|
|
22
18
|
export { suite };
|
|
@@ -106,7 +106,8 @@ describe('BinaryTree', () => {
|
|
|
106
106
|
it('should delete nodes', () => {
|
|
107
107
|
expect(tree.getHeight(tree.root, IterationType.ITERATIVE)).toBe(-1);
|
|
108
108
|
expect(tree.getMinHeight()).toBe(-1);
|
|
109
|
-
const node1 = tree.
|
|
109
|
+
const node1 = tree.createNode(1);
|
|
110
|
+
tree.add(node1);
|
|
110
111
|
expect(tree.size).toBe(1);
|
|
111
112
|
|
|
112
113
|
const leftChild = new BinaryTreeNode<number>(2);
|
|
@@ -224,15 +225,15 @@ describe('BinaryTree', () => {
|
|
|
224
225
|
new BinaryTreeNode(4, 4)
|
|
225
226
|
]);
|
|
226
227
|
|
|
227
|
-
expect(tree.
|
|
228
|
-
expect(tree.
|
|
228
|
+
expect(tree.isBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
|
|
229
|
+
expect(tree.isBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
|
|
229
230
|
});
|
|
230
231
|
|
|
231
232
|
it('should isSubtreeBST', () => {
|
|
232
233
|
tree.addMany([4, 2, 6, 1, 3, 5, 7, 4]);
|
|
233
234
|
|
|
234
|
-
expect(tree.
|
|
235
|
-
expect(tree.
|
|
235
|
+
expect(tree.isBST(tree.getNode(4), IterationType.RECURSIVE)).toBe(true);
|
|
236
|
+
expect(tree.isBST(tree.getNode(4), IterationType.ITERATIVE)).toBe(true);
|
|
236
237
|
expect(tree.getNodes(2, undefined, false, null)).toEqual([]);
|
|
237
238
|
expect(tree.getNodes(tree.getNodeByKey(2), undefined, false, tree.root)).toEqual([tree.getNodeByKey(2)]);
|
|
238
239
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BinaryTreeNode, BST, BSTNode, CP, IterationType } from '../../../../src';
|
|
1
|
+
import { BinaryTreeNode, BST, BSTNode, BSTVariant, CP, IterationType } from '../../../../src';
|
|
2
2
|
import { isDebugTest } from '../../../config';
|
|
3
3
|
|
|
4
4
|
const isDebug = isDebugTest;
|
|
@@ -47,6 +47,8 @@ describe('BST operations test', () => {
|
|
|
47
47
|
const leftMost = bst.getLeftMost();
|
|
48
48
|
expect(leftMost?.key).toBe(1);
|
|
49
49
|
|
|
50
|
+
expect(bst.isBST()).toBe(true);
|
|
51
|
+
|
|
50
52
|
const node15 = bst.getNode(15);
|
|
51
53
|
const minNodeBySpecificNode = node15 && bst.getLeftMost(node15);
|
|
52
54
|
expect(minNodeBySpecificNode?.key).toBe(12);
|
|
@@ -795,6 +797,20 @@ describe('BST operations test recursively', () => {
|
|
|
795
797
|
});
|
|
796
798
|
});
|
|
797
799
|
|
|
800
|
+
describe('BST isBST', function () {
|
|
801
|
+
test('isBST', () => {
|
|
802
|
+
const bst = new BST<number, number>();
|
|
803
|
+
bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
804
|
+
expect(bst.isBST()).toBe(true);
|
|
805
|
+
});
|
|
806
|
+
|
|
807
|
+
test('isBST when variant is Max', () => {
|
|
808
|
+
const bst = new BST<number, number>([1, 2, 3, 9, 8, 5, 6, 7, 4], { variant: BSTVariant.INVERSE });
|
|
809
|
+
bst.addMany([1, 2, 3, 9, 8, 5, 6, 7, 4]);
|
|
810
|
+
expect(bst.isBST()).toBe(true);
|
|
811
|
+
});
|
|
812
|
+
});
|
|
813
|
+
|
|
798
814
|
describe('BST Performance test', function () {
|
|
799
815
|
const bst = new BST<number, number>();
|
|
800
816
|
const inputSize = 10000; // Adjust input sizes as needed
|
|
File without changes
|
|
File without changes
|
|
File without changes
|