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
|
@@ -11,13 +11,13 @@ describe('Deque - Basic Operations', () => {
|
|
|
11
11
|
});
|
|
12
12
|
|
|
13
13
|
it('push should add elements to the end', () => {
|
|
14
|
-
expect(deque.
|
|
14
|
+
expect(deque.length).toBe(2);
|
|
15
15
|
expect(deque.last).toBe(2);
|
|
16
16
|
});
|
|
17
17
|
|
|
18
18
|
it('pop should remove elements from the end', () => {
|
|
19
19
|
expect(deque.pop()).toBe(2);
|
|
20
|
-
expect(deque.
|
|
20
|
+
expect(deque.length).toBe(1);
|
|
21
21
|
expect(deque.pop()).toBe(1);
|
|
22
22
|
expect(deque.isEmpty()).toBeTruthy();
|
|
23
23
|
});
|
|
@@ -26,7 +26,7 @@ describe('Deque - Basic Operations', () => {
|
|
|
26
26
|
deque.clear();
|
|
27
27
|
deque.unshift(1);
|
|
28
28
|
deque.unshift(2);
|
|
29
|
-
expect(deque.
|
|
29
|
+
expect(deque.length).toBe(2);
|
|
30
30
|
expect(deque.first).toBe(2);
|
|
31
31
|
});
|
|
32
32
|
|
|
@@ -35,7 +35,7 @@ describe('Deque - Basic Operations', () => {
|
|
|
35
35
|
deque.unshift(1);
|
|
36
36
|
deque.unshift(2);
|
|
37
37
|
expect(deque.shift()).toBe(2);
|
|
38
|
-
expect(deque.
|
|
38
|
+
expect(deque.length).toBe(1);
|
|
39
39
|
expect(deque.shift()).toBe(1);
|
|
40
40
|
expect(deque.isEmpty()).toBeTruthy();
|
|
41
41
|
});
|
|
@@ -88,24 +88,24 @@ describe('Deque - Basic Operations', () => {
|
|
|
88
88
|
deque.push('0');
|
|
89
89
|
deque.push('5');
|
|
90
90
|
deque.push('9');
|
|
91
|
-
expect(deque.
|
|
91
|
+
expect(deque.length).toBe(6);
|
|
92
92
|
deque.delete('2');
|
|
93
|
-
expect(deque.
|
|
93
|
+
expect(deque.length).toBe(5);
|
|
94
94
|
expect([...deque]).toEqual(['1', '6', '0', '5', '9']);
|
|
95
95
|
const cloned = deque.clone();
|
|
96
96
|
expect([...cloned]).toEqual(['1', '6', '0', '5', '9']);
|
|
97
|
-
expect(deque.
|
|
97
|
+
expect(deque.length).toBe(5);
|
|
98
98
|
deque.delete('5');
|
|
99
|
-
expect(deque.
|
|
99
|
+
expect(deque.length).toBe(4);
|
|
100
100
|
expect([...deque]).toEqual(['1', '6', '0', '9']);
|
|
101
101
|
expect([...cloned]).toEqual(['1', '6', '0', '5', '9']);
|
|
102
|
-
expect(cloned.
|
|
102
|
+
expect(cloned.length).toBe(5);
|
|
103
103
|
cloned.push('8');
|
|
104
|
-
expect(cloned.
|
|
104
|
+
expect(cloned.length).toBe(6);
|
|
105
105
|
cloned.delete('6');
|
|
106
|
-
expect(cloned.
|
|
106
|
+
expect(cloned.length).toBe(5);
|
|
107
107
|
cloned.delete('6');
|
|
108
|
-
expect(cloned.
|
|
108
|
+
expect(cloned.length).toBe(5);
|
|
109
109
|
});
|
|
110
110
|
});
|
|
111
111
|
describe('Deque - Complex Operations', () => {
|
|
@@ -126,15 +126,15 @@ describe('Deque - Complex Operations', () => {
|
|
|
126
126
|
deque.push(1);
|
|
127
127
|
deque.push(2);
|
|
128
128
|
deque.push(3);
|
|
129
|
-
expect(deque.
|
|
129
|
+
expect(deque.length).toBe(3);
|
|
130
130
|
deque.cut(1, true);
|
|
131
|
-
expect(deque.
|
|
131
|
+
expect(deque.length).toBe(2);
|
|
132
132
|
expect(deque.toArray()).toEqual([1, 2]);
|
|
133
133
|
|
|
134
134
|
const dq1 = new Deque([1, 2, 3, 4, 5, 6, 7]);
|
|
135
|
-
expect(dq1.
|
|
135
|
+
expect(dq1.length).toBe(7);
|
|
136
136
|
expect([...dq1.cut(3, true)]).toEqual([1, 2, 3, 4]);
|
|
137
|
-
expect(dq1.
|
|
137
|
+
expect(dq1.length).toBe(4);
|
|
138
138
|
expect([...dq1]).toEqual([1, 2, 3, 4]);
|
|
139
139
|
const dqCut = dq1.cut(2);
|
|
140
140
|
expect(dqCut.toArray()).toEqual([1, 2, 3]);
|
|
@@ -228,7 +228,7 @@ describe('Deque - Complex Operations', () => {
|
|
|
228
228
|
|
|
229
229
|
it('shrinkToFit should reduce the memory footprint', () => {
|
|
230
230
|
deque.shrinkToFit();
|
|
231
|
-
expect(deque.
|
|
231
|
+
expect(deque.length).toBe(0);
|
|
232
232
|
expect(deque.has(1)).toBe(false);
|
|
233
233
|
expect(deque.bucketFirst).toBe(0);
|
|
234
234
|
expect(deque.bucketLast).toBe(0);
|
|
@@ -241,7 +241,7 @@ describe('Deque - Complex Operations', () => {
|
|
|
241
241
|
deque.shrinkToFit();
|
|
242
242
|
|
|
243
243
|
deque = new Deque([1, 2, 3, 4, 5], { bucketSize: 2 });
|
|
244
|
-
expect(deque.
|
|
244
|
+
expect(deque.length).toBe(5);
|
|
245
245
|
expect(deque.has(1)).toBe(true);
|
|
246
246
|
expect(deque.bucketFirst).toBe(0);
|
|
247
247
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -322,19 +322,19 @@ describe('Deque - Utility Operations', () => {
|
|
|
322
322
|
|
|
323
323
|
it('should maxLen work well', () => {
|
|
324
324
|
const dequeMaxLen = new Deque([3, 4, 5, 6, 7], { maxLen: 3 });
|
|
325
|
-
expect(dequeMaxLen.
|
|
325
|
+
expect(dequeMaxLen.length).toBe(3);
|
|
326
326
|
expect(dequeMaxLen.toArray()).toEqual([5, 6, 7]);
|
|
327
327
|
dequeMaxLen.unshift(4);
|
|
328
328
|
dequeMaxLen.unshift(3);
|
|
329
|
-
expect(dequeMaxLen.
|
|
329
|
+
expect(dequeMaxLen.length).toBe(3);
|
|
330
330
|
expect(dequeMaxLen.toArray()).toEqual([3, 4, 5]);
|
|
331
331
|
|
|
332
332
|
const dequeNoMaxLen = new Deque([3, 4, 5, 6, 7]);
|
|
333
|
-
expect(dequeNoMaxLen.
|
|
333
|
+
expect(dequeNoMaxLen.length).toBe(5);
|
|
334
334
|
expect(dequeNoMaxLen.toArray()).toEqual([3, 4, 5, 6, 7]);
|
|
335
335
|
dequeNoMaxLen.unshift(4);
|
|
336
336
|
dequeNoMaxLen.unshift(3);
|
|
337
|
-
expect(dequeNoMaxLen.
|
|
337
|
+
expect(dequeNoMaxLen.length).toBe(7);
|
|
338
338
|
expect(dequeNoMaxLen.toArray()).toEqual([3, 4, 3, 4, 5, 6, 7]);
|
|
339
339
|
});
|
|
340
340
|
});
|
|
@@ -350,21 +350,21 @@ describe('Deque - Additional Operations', () => {
|
|
|
350
350
|
deque.push(1);
|
|
351
351
|
deque.push(2);
|
|
352
352
|
expect(deque.last).toBe(2);
|
|
353
|
-
expect(deque.
|
|
353
|
+
expect(deque.length).toBe(2);
|
|
354
354
|
});
|
|
355
355
|
|
|
356
356
|
it('pop should remove and return the last element', () => {
|
|
357
357
|
deque.push(1);
|
|
358
358
|
deque.push(2);
|
|
359
359
|
expect(deque.pop()).toBe(2);
|
|
360
|
-
expect(deque.
|
|
360
|
+
expect(deque.length).toBe(1);
|
|
361
361
|
});
|
|
362
362
|
|
|
363
363
|
it('unshift should add an element to the beginning', () => {
|
|
364
364
|
deque.unshift(1);
|
|
365
365
|
deque.unshift(2);
|
|
366
366
|
expect(deque.first).toBe(2);
|
|
367
|
-
expect(deque.
|
|
367
|
+
expect(deque.length).toBe(2);
|
|
368
368
|
});
|
|
369
369
|
|
|
370
370
|
it('shift should remove and return the first element', () => {
|
|
@@ -372,31 +372,31 @@ describe('Deque - Additional Operations', () => {
|
|
|
372
372
|
deque.unshift(1);
|
|
373
373
|
deque.unshift(2);
|
|
374
374
|
expect(deque.shift()).toBe(2);
|
|
375
|
-
expect(deque.
|
|
375
|
+
expect(deque.length).toBe(1);
|
|
376
376
|
});
|
|
377
377
|
|
|
378
378
|
it('clear should reset the deque', () => {
|
|
379
379
|
deque.unshift(1);
|
|
380
380
|
deque.clear();
|
|
381
|
-
expect(deque.
|
|
381
|
+
expect(deque.length).toBe(0);
|
|
382
382
|
expect(deque.isEmpty()).toBeTruthy();
|
|
383
383
|
});
|
|
384
384
|
|
|
385
|
-
it('begin should yield elements from the beginning', () => {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
});
|
|
392
|
-
|
|
393
|
-
it('reverseBegin should yield elements in reverse order', () => {
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
});
|
|
385
|
+
// it('begin should yield elements from the beginning', () => {
|
|
386
|
+
// deque.push(1);
|
|
387
|
+
// deque.push(2);
|
|
388
|
+
// const iterator = deque.begin();
|
|
389
|
+
// expect(iterator.next().value).toBe(1);
|
|
390
|
+
// expect(iterator.next().value).toBe(2);
|
|
391
|
+
// });
|
|
392
|
+
|
|
393
|
+
// it('reverseBegin should yield elements in reverse order', () => {
|
|
394
|
+
// deque.push(1);
|
|
395
|
+
// deque.push(2);
|
|
396
|
+
// const iterator = deque.reverseBegin();
|
|
397
|
+
// expect(iterator.next().value).toBe(2);
|
|
398
|
+
// expect(iterator.next().value).toBe(1);
|
|
399
|
+
// });
|
|
400
400
|
});
|
|
401
401
|
describe('Deque - push Method', () => {
|
|
402
402
|
let deque: Deque<number>;
|
|
@@ -411,7 +411,7 @@ describe('Deque - push Method', () => {
|
|
|
411
411
|
it('push should add an element when deque is empty', () => {
|
|
412
412
|
deque.push(1);
|
|
413
413
|
expect(deque.last).toBe(1);
|
|
414
|
-
expect(deque.
|
|
414
|
+
expect(deque.length).toBe(1);
|
|
415
415
|
});
|
|
416
416
|
|
|
417
417
|
it('push should add an element when lastInBucket is not at max', () => {
|
|
@@ -420,7 +420,7 @@ describe('Deque - push Method', () => {
|
|
|
420
420
|
}
|
|
421
421
|
deque.push(bucketSize);
|
|
422
422
|
expect(deque.last).toBe(bucketSize);
|
|
423
|
-
expect(deque.
|
|
423
|
+
expect(deque.length).toBe(bucketSize);
|
|
424
424
|
});
|
|
425
425
|
|
|
426
426
|
it('push should add an element and move to next bucket when last bucket is full', () => {
|
|
@@ -429,7 +429,7 @@ describe('Deque - push Method', () => {
|
|
|
429
429
|
}
|
|
430
430
|
deque.push(bucketSize + 1);
|
|
431
431
|
expect(deque.last).toBe(bucketSize + 1);
|
|
432
|
-
expect(deque.
|
|
432
|
+
expect(deque.length).toBe(bucketSize + 1);
|
|
433
433
|
});
|
|
434
434
|
|
|
435
435
|
it('push should add an element and reallocate when last bucket and lastInBucket are at max', () => {
|
|
@@ -439,7 +439,7 @@ describe('Deque - push Method', () => {
|
|
|
439
439
|
|
|
440
440
|
deque.push(100);
|
|
441
441
|
expect(deque.last).toBe(100);
|
|
442
|
-
expect(deque.
|
|
442
|
+
expect(deque.length).toBeGreaterThan(bucketSize);
|
|
443
443
|
});
|
|
444
444
|
});
|
|
445
445
|
describe('Deque - pop Method', () => {
|
|
@@ -456,7 +456,7 @@ describe('Deque - pop Method', () => {
|
|
|
456
456
|
deque.push(1);
|
|
457
457
|
deque.push(2);
|
|
458
458
|
expect(deque.pop()).toBe(2);
|
|
459
|
-
expect(deque.
|
|
459
|
+
expect(deque.length).toBe(1);
|
|
460
460
|
});
|
|
461
461
|
|
|
462
462
|
it('pop should handle popping the only element', () => {
|
|
@@ -488,7 +488,7 @@ describe('Deque - unshift Method', () => {
|
|
|
488
488
|
it('unshift should add an element to the beginning when deque is empty', () => {
|
|
489
489
|
deque.unshift(1);
|
|
490
490
|
expect(deque.first).toBe(1);
|
|
491
|
-
expect(deque.
|
|
491
|
+
expect(deque.length).toBe(1);
|
|
492
492
|
});
|
|
493
493
|
|
|
494
494
|
it('unshift should add an element to the beginning and adjust firstInBucket', () => {
|
|
@@ -523,7 +523,7 @@ describe('Deque - shift Method', () => {
|
|
|
523
523
|
deque.push(1);
|
|
524
524
|
deque.push(2);
|
|
525
525
|
expect(deque.shift()).toBe(1);
|
|
526
|
-
expect(deque.
|
|
526
|
+
expect(deque.length).toBe(1);
|
|
527
527
|
});
|
|
528
528
|
|
|
529
529
|
it('shift should handle shifting the only element', () => {
|
|
@@ -543,6 +543,95 @@ describe('Deque - shift Method', () => {
|
|
|
543
543
|
});
|
|
544
544
|
});
|
|
545
545
|
|
|
546
|
+
describe('Deque Additional Methods', () => {
|
|
547
|
+
// Slice method implementation and test
|
|
548
|
+
test('slice should return a new list with specified range', () => {
|
|
549
|
+
const list = new Deque([1, 2, 3, 4, 5]);
|
|
550
|
+
const slicedList = list.slice(1, 4);
|
|
551
|
+
|
|
552
|
+
expect(slicedList.toArray()).toEqual([2, 3, 4]);
|
|
553
|
+
expect(list.length).toBe(5); // Original list unchanged
|
|
554
|
+
});
|
|
555
|
+
|
|
556
|
+
// Splice method implementation
|
|
557
|
+
test('splice should modify list and return removed elements', () => {
|
|
558
|
+
const list = new Deque([1, 2, 3, 4, 5]);
|
|
559
|
+
const removedList = list.splice(2, 2, 6, 7);
|
|
560
|
+
|
|
561
|
+
expect(list.toArray()).toEqual([1, 2, 6, 7, 5]);
|
|
562
|
+
expect(removedList.toArray()).toEqual([3, 4]);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
// Concat method test
|
|
566
|
+
test('concat should combine multiple lists', () => {
|
|
567
|
+
const list1 = new Deque([1, 2]);
|
|
568
|
+
const list2 = new Deque([3, 4]);
|
|
569
|
+
const list3 = new Deque([5, 6]);
|
|
570
|
+
|
|
571
|
+
const concatenatedList = list1.concat(list2, list3);
|
|
572
|
+
expect(concatenatedList.toArray()).toEqual([1, 2, 3, 4, 5, 6]);
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
// Sort method test
|
|
576
|
+
test('sort should order elements in ascending order', () => {
|
|
577
|
+
const list = new Deque([5, 2, 8, 1, 9]);
|
|
578
|
+
list.sort((a, b) => a - b);
|
|
579
|
+
|
|
580
|
+
expect(list.toArray()).toEqual([1, 2, 5, 8, 9]);
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
// Reverse method test
|
|
584
|
+
test('reverse should invert the list order', () => {
|
|
585
|
+
const list = new Deque([1, 2, 3, 4, 5]);
|
|
586
|
+
list.reverse();
|
|
587
|
+
|
|
588
|
+
expect(list.toArray()).toEqual([5, 4, 3, 2, 1]);
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
// Join method test
|
|
592
|
+
test('join should convert list to string with separator', () => {
|
|
593
|
+
const list = new Deque(['a', 'b', 'c']);
|
|
594
|
+
|
|
595
|
+
expect(list.join('-')).toBe('a-b-c');
|
|
596
|
+
expect(list.join()).toBe('a,b,c');
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
// IndexOf method test
|
|
600
|
+
test('indexOf should return first occurrence index', () => {
|
|
601
|
+
const list = new Deque([1, 2, 3, 2, 1]);
|
|
602
|
+
|
|
603
|
+
expect(list.indexOf(2)).toBe(1);
|
|
604
|
+
expect(list.indexOf(4)).toBe(-1);
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
// LastIndexOf method test
|
|
608
|
+
test('lastIndexOf should return last occurrence index', () => {
|
|
609
|
+
const list = new Deque([1, 2, 3, 2, 1]);
|
|
610
|
+
|
|
611
|
+
expect(list.lastIndexOf(2)).toBe(3);
|
|
612
|
+
expect(list.lastIndexOf(4)).toBe(-1);
|
|
613
|
+
});
|
|
614
|
+
|
|
615
|
+
// findIndex method test
|
|
616
|
+
test('findIndex should return first occurrence index', () => {
|
|
617
|
+
const list = new Deque([1, 2, 3, 2, 1]);
|
|
618
|
+
expect(list.findIndex(item => item === 2)).toBe(1);
|
|
619
|
+
expect(list.findIndex(item => item === 4)).toBe(-1);
|
|
620
|
+
});
|
|
621
|
+
|
|
622
|
+
// fill method test
|
|
623
|
+
test('fill should return fill all the list', () => {
|
|
624
|
+
let list = new Deque([1, 2, 3, 2, 1]);
|
|
625
|
+
expect([...list.fill(9)]).toEqual([9, 9, 9, 9, 9]);
|
|
626
|
+
list = new Deque([1, 2, 3, 2, 1]);
|
|
627
|
+
expect([...list.fill(9, 2, 3)]).toEqual([1, 2, 9, 2, 1]);
|
|
628
|
+
list = new Deque([1, 2, 3, 2, 1]);
|
|
629
|
+
expect([...list.fill(9, -3, -2)]).toEqual([1, 2, 9, 2, 1]);
|
|
630
|
+
list = new Deque([1, 2, 3, 2, 1]);
|
|
631
|
+
expect([...list.fill(9, -2, -3)]).toEqual([1, 2, 3, 2, 1]);
|
|
632
|
+
});
|
|
633
|
+
});
|
|
634
|
+
|
|
546
635
|
describe('Deque', () => {
|
|
547
636
|
it('should initialize with default iterable with length function', () => {
|
|
548
637
|
class IterableNumbers {
|
|
@@ -565,7 +654,7 @@ describe('Deque', () => {
|
|
|
565
654
|
|
|
566
655
|
const numbers = new IterableNumbers([1, 6, 7, 3, 2, 4, 5]);
|
|
567
656
|
const deque = new Deque(numbers, { bucketSize: 3 });
|
|
568
|
-
expect(deque.
|
|
657
|
+
expect(deque.length).toBe(7);
|
|
569
658
|
expect(deque.bucketSize).toBe(3);
|
|
570
659
|
expect(deque.maxLen).toBe(-1);
|
|
571
660
|
});
|
|
@@ -591,7 +680,7 @@ describe('Deque', () => {
|
|
|
591
680
|
|
|
592
681
|
const numbers = new IterableNumbersWithSize([1, 6, 7, 3, 2, 4, 5]);
|
|
593
682
|
const deque = new Deque(numbers, { bucketSize: 3 });
|
|
594
|
-
expect(deque.
|
|
683
|
+
expect(deque.length).toBe(7);
|
|
595
684
|
expect(deque.bucketSize).toBe(3);
|
|
596
685
|
expect(deque.maxLen).toBe(-1);
|
|
597
686
|
});
|
|
@@ -601,7 +690,7 @@ describe('Deque', () => {
|
|
|
601
690
|
key: number;
|
|
602
691
|
}> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
|
|
603
692
|
const deque = new Deque<number>(objArr, { toElementFn: item => item.key });
|
|
604
|
-
expect(deque.
|
|
693
|
+
expect(deque.length).toBe(7);
|
|
605
694
|
expect(deque.has(1)).toBe(true);
|
|
606
695
|
expect(deque.has(7)).toBe(true);
|
|
607
696
|
expect(deque.has(8)).toBe(false);
|
|
@@ -612,7 +701,7 @@ describe('Deque', () => {
|
|
|
612
701
|
key: number;
|
|
613
702
|
}> = [{ key: 1 }, { key: 6 }, { key: 7 }, { key: 3 }, { key: 2 }, { key: 4 }, { key: 5 }];
|
|
614
703
|
const deque = new Deque<number>(objArr, { toElementFn: item => item.key, bucketSize: 3 });
|
|
615
|
-
expect(deque.
|
|
704
|
+
expect(deque.length).toBe(7);
|
|
616
705
|
expect(deque.has(1)).toBe(true);
|
|
617
706
|
expect(deque.bucketFirst).toBe(0);
|
|
618
707
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -628,7 +717,7 @@ describe('Deque', () => {
|
|
|
628
717
|
|
|
629
718
|
it('should pop work well when bucket boundary is reached', () => {
|
|
630
719
|
const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
|
|
631
|
-
expect(deque.
|
|
720
|
+
expect(deque.length).toBe(7);
|
|
632
721
|
expect(deque.has(1)).toBe(true);
|
|
633
722
|
expect(deque.bucketFirst).toBe(0);
|
|
634
723
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -641,7 +730,7 @@ describe('Deque', () => {
|
|
|
641
730
|
[4, 5]
|
|
642
731
|
]);
|
|
643
732
|
for (let i = 0; i < 3; ++i) deque.pop();
|
|
644
|
-
expect(deque.
|
|
733
|
+
expect(deque.length).toBe(4);
|
|
645
734
|
expect(deque.has(1)).toBe(true);
|
|
646
735
|
expect(deque.bucketFirst).toBe(0);
|
|
647
736
|
expect(deque.bucketLast).toBe(1);
|
|
@@ -654,7 +743,7 @@ describe('Deque', () => {
|
|
|
654
743
|
[4, 5]
|
|
655
744
|
]); // TODO may be a problem
|
|
656
745
|
deque.pop();
|
|
657
|
-
expect(deque.
|
|
746
|
+
expect(deque.length).toBe(3);
|
|
658
747
|
expect(deque.has(1)).toBe(true);
|
|
659
748
|
expect(deque.bucketFirst).toBe(0);
|
|
660
749
|
expect(deque.bucketLast).toBe(1);
|
|
@@ -670,7 +759,7 @@ describe('Deque', () => {
|
|
|
670
759
|
|
|
671
760
|
it('should shift work well when bucket boundary is reached and should shrinkToFit', () => {
|
|
672
761
|
const deque = new Deque<number>([1, 6, 7, 3, 2, 4, 5], { bucketSize: 3 });
|
|
673
|
-
expect(deque.
|
|
762
|
+
expect(deque.length).toBe(7);
|
|
674
763
|
expect(deque.has(1)).toBe(true);
|
|
675
764
|
expect(deque.bucketFirst).toBe(0);
|
|
676
765
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -683,7 +772,7 @@ describe('Deque', () => {
|
|
|
683
772
|
[4, 5]
|
|
684
773
|
]);
|
|
685
774
|
for (let i = 0; i < 3; ++i) deque.shift();
|
|
686
|
-
expect(deque.
|
|
775
|
+
expect(deque.length).toBe(4);
|
|
687
776
|
expect(deque.has(1)).toBe(false);
|
|
688
777
|
expect(deque.bucketFirst).toBe(1);
|
|
689
778
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -696,7 +785,7 @@ describe('Deque', () => {
|
|
|
696
785
|
[4, 5]
|
|
697
786
|
]); // TODO may be a problem
|
|
698
787
|
deque.shift();
|
|
699
|
-
expect(deque.
|
|
788
|
+
expect(deque.length).toBe(3);
|
|
700
789
|
expect(deque.has(1)).toBe(false);
|
|
701
790
|
expect(deque.bucketFirst).toBe(1);
|
|
702
791
|
expect(deque.bucketLast).toBe(2);
|
|
@@ -709,7 +798,7 @@ describe('Deque', () => {
|
|
|
709
798
|
[4, 5]
|
|
710
799
|
]); // TODO may be a problem
|
|
711
800
|
deque.shrinkToFit();
|
|
712
|
-
expect(deque.
|
|
801
|
+
expect(deque.length).toBe(3);
|
|
713
802
|
expect(deque.has(1)).toBe(false);
|
|
714
803
|
expect(deque.bucketFirst).toBe(0);
|
|
715
804
|
expect(deque.bucketLast).toBe(1);
|
|
@@ -722,3 +811,95 @@ describe('Deque', () => {
|
|
|
722
811
|
]); // TODO may be a problem
|
|
723
812
|
});
|
|
724
813
|
});
|
|
814
|
+
|
|
815
|
+
describe('classic uses', () => {
|
|
816
|
+
it('@example prize roulette', () => {
|
|
817
|
+
class PrizeRoulette {
|
|
818
|
+
private deque: Deque<string>;
|
|
819
|
+
|
|
820
|
+
constructor(prizes: string[]) {
|
|
821
|
+
// Initialize the deque with prizes
|
|
822
|
+
this.deque = new Deque<string>(prizes);
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
// Rotate clockwise to the right (forward)
|
|
826
|
+
rotateClockwise(steps: number): void {
|
|
827
|
+
const n = this.deque.length;
|
|
828
|
+
if (n === 0) return;
|
|
829
|
+
|
|
830
|
+
for (let i = 0; i < steps; i++) {
|
|
831
|
+
const last = this.deque.pop(); // Remove the last element
|
|
832
|
+
this.deque.unshift(last!); // Add it to the front
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
// Rotate counterclockwise to the left (backward)
|
|
837
|
+
rotateCounterClockwise(steps: number): void {
|
|
838
|
+
const n = this.deque.length;
|
|
839
|
+
if (n === 0) return;
|
|
840
|
+
|
|
841
|
+
for (let i = 0; i < steps; i++) {
|
|
842
|
+
const first = this.deque.shift(); // Remove the first element
|
|
843
|
+
this.deque.push(first!); // Add it to the back
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// Display the current prize at the head
|
|
848
|
+
display() {
|
|
849
|
+
return this.deque.first;
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// Example usage
|
|
854
|
+
const prizes = ['Car', 'Bike', 'Laptop', 'Phone', 'Watch', 'Headphones']; // Initialize the prize list
|
|
855
|
+
const roulette = new PrizeRoulette(prizes);
|
|
856
|
+
|
|
857
|
+
// Display the initial state
|
|
858
|
+
expect(roulette.display()).toBe('Car'); // Car
|
|
859
|
+
|
|
860
|
+
// Rotate clockwise by 3 steps
|
|
861
|
+
roulette.rotateClockwise(3);
|
|
862
|
+
expect(roulette.display()).toBe('Phone'); // Phone
|
|
863
|
+
|
|
864
|
+
// Rotate counterclockwise by 2 steps
|
|
865
|
+
roulette.rotateCounterClockwise(2);
|
|
866
|
+
expect(roulette.display()).toBe('Headphones'); // Headphones
|
|
867
|
+
});
|
|
868
|
+
|
|
869
|
+
it('@example sliding window', () => {
|
|
870
|
+
// Maximum function of sliding window
|
|
871
|
+
function maxSlidingWindow(nums: number[], k: number): number[] {
|
|
872
|
+
const n = nums.length;
|
|
873
|
+
if (n * k === 0) return [];
|
|
874
|
+
|
|
875
|
+
const deq = new Deque<number>();
|
|
876
|
+
const result: number[] = [];
|
|
877
|
+
|
|
878
|
+
for (let i = 0; i < n; i++) {
|
|
879
|
+
// Delete indexes in the queue that are not within the window range
|
|
880
|
+
if (deq.length > 0 && deq.first! === i - k) {
|
|
881
|
+
deq.shift();
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
// Remove all indices less than the current value from the tail of the queue
|
|
885
|
+
while (deq.length > 0 && nums[deq.last!] < nums[i]) {
|
|
886
|
+
deq.pop();
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
// Add the current index to the end of the queue
|
|
890
|
+
deq.push(i);
|
|
891
|
+
|
|
892
|
+
// Add the maximum value of the window to the results
|
|
893
|
+
if (i >= k - 1) {
|
|
894
|
+
result.push(nums[deq.first!]);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
return result;
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
const nums = [1, 3, -1, -3, 5, 3, 6, 7];
|
|
902
|
+
const k = 3;
|
|
903
|
+
expect(maxSlidingWindow(nums, k)).toEqual([3, 3, 5, 5, 6, 7]); // Output: [3, 3, 5, 5, 6, 7]
|
|
904
|
+
});
|
|
905
|
+
});
|