From ae11bca83ce946f2d5dd142d21968e2aa4548282 Mon Sep 17 00:00:00 2001 From: Revone Date: Fri, 19 Jan 2024 18:02:56 +0800 Subject: [PATCH] Refactor: Added the _ensureCallback method to eliminate redundant code. --- README.md | 34 +++++++++---------- .../binary-tree/avl-tree-multi-map.ts | 1 + src/data-structures/binary-tree/avl-tree.ts | 1 - .../binary-tree/binary-tree.ts | 20 +++++++---- src/data-structures/binary-tree/bst.ts | 1 + src/data-structures/binary-tree/rb-tree.ts | 2 +- .../binary-tree/tree-multi-map.ts | 1 + 7 files changed, 34 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 760a9fc..ad45276 100644 --- a/README.md +++ b/README.md @@ -736,45 +736,43 @@ Version 11.7.9 [//]: # (No deletion!!! Start of Replace Section)
heap
-
test nametime taken (ms)executions per secsample deviation
100,000 add6.31158.421.69e-4
100,000 add & poll32.2131.050.00
+
test nametime taken (ms)executions per secsample deviation
100,000 add6.42155.781.88e-4
100,000 add & poll31.6031.659.13e-4
rb-tree
-
test nametime taken (ms)executions per secsample deviation
100,000 add59.7016.757.70e-4
100,000 add randomly72.5513.780.00
100,000 get104.489.570.00
100,000 iterator27.7036.100.01
100,000 add & delete orderly126.077.930.00
100,000 add & delete randomly212.964.700.00
+
test nametime taken (ms)executions per secsample deviation
100,000 add59.2816.877.81e-4
100,000 add randomly71.6113.969.02e-4
100,000 get104.139.600.00
100,000 iterator27.0337.000.00
100,000 add & delete orderly126.427.910.00
100,000 add & delete randomly214.364.660.00
queue
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push44.4922.480.01
100,000 push & shift4.82207.405.25e-4
Native JS Array 100,000 push & shift2201.760.450.10
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push44.9822.230.01
100,000 push & shift4.89204.396.15e-4
Native JS Array 100,000 push & shift2251.130.440.26
deque
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push12.3481.061.27e-4
1,000,000 push & pop21.3546.841.44e-4
1,000,000 push & shift21.5446.420.00
100,000 push & shift2.09478.801.60e-4
Native JS Array 100,000 push & shift2233.460.450.12
100,000 unshift & shift1.99502.421.55e-4
Native JS Array 100,000 unshift & shift4153.080.240.34
-
-
hash-map
-
test nametime taken (ms)executions per secsample deviation
1,000,000 set129.847.700.04
Native JS Map 1,000,000 set238.664.190.03
Native JS Set 1,000,000 add194.685.140.01
1,000,000 set & get134.957.410.03
Native JS Map 1,000,000 set & get320.943.120.04
Native JS Set 1,000,000 add & has261.563.820.07
1,000,000 ObjKey set & get363.112.750.06
Native JS Map 1,000,000 ObjKey set & get344.032.910.05
Native JS Set 1,000,000 ObjKey add & has351.352.850.10
-
- -
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push22.2145.020.00
1,000,000 push & pop30.9732.290.00
1,000,000 push & shift30.8132.460.00
100,000 push & shift3.24308.252.08e-4
Native JS Array 100,000 push & shift2279.950.440.21
100,000 unshift & shift2.93341.783.21e-4
Native JS Array 100,000 unshift & shift4076.040.250.42
+
+
hash-map
+
test nametime taken (ms)executions per secsample deviation
1,000,000 set118.118.470.02
Native JS Map 1,000,000 set206.184.850.01
Native JS Set 1,000,000 add167.505.970.01
1,000,000 set & get116.158.610.01
Native JS Map 1,000,000 set & get269.113.720.02
Native JS Set 1,000,000 add & has168.025.950.01
1,000,000 ObjKey set & get335.362.980.04
Native JS Map 1,000,000 ObjKey set & get327.783.050.06
Native JS Set 1,000,000 ObjKey add & has281.643.550.04
+
trie
-
test nametime taken (ms)executions per secsample deviation
100,000 push44.7522.356.31e-4
100,000 getWords83.9611.910.00
+
test nametime taken (ms)executions per secsample deviation
100,000 push43.6422.918.01e-4
100,000 getWords82.9512.060.00
avl-tree
-
test nametime taken (ms)executions per secsample deviation
100,000 add262.233.810.00
100,000 add randomly323.183.090.00
100,000 get130.857.640.00
100,000 iterator31.7931.460.01
100,000 add & delete orderly423.802.360.00
100,000 add & delete randomly585.791.710.00
+
test nametime taken (ms)executions per secsample deviation
100,000 add263.013.800.02
100,000 add randomly353.892.830.01
100,000 get131.657.600.00
100,000 iterator31.6231.630.01
100,000 add & delete orderly468.812.130.00
100,000 add & delete randomly628.301.590.03
binary-tree-overall
-
test nametime taken (ms)executions per secsample deviation
10,000 RBTree add randomly5.84171.138.92e-5
10,000 RBTree get randomly9.48105.495.40e-4
10,000 RBTree add & delete randomly18.1954.981.42e-4
10,000 AVLTree add randomly26.4537.802.66e-4
10,000 AVLTree get randomly10.6394.091.36e-4
10,000 AVLTree add & delete randomly49.0720.383.49e-4
+
test nametime taken (ms)executions per secsample deviation
10,000 RBTree add randomly5.79172.737.35e-5
10,000 RBTree get randomly9.58104.379.96e-5
10,000 RBTree add & delete randomly17.8256.121.90e-4
10,000 AVLTree add randomly27.8535.913.16e-4
10,000 AVLTree get randomly10.7393.196.38e-5
10,000 AVLTree add & delete randomly48.9820.423.91e-4
directed-graph
-
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.101.01e+41.05e-6
1,000 addEdge6.18161.887.72e-4
1,000 getVertex0.052.17e+43.58e-7
1,000 getEdge23.0343.430.00
tarjan203.184.920.02
topologicalSort174.785.720.00
+
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.109624.607.61e-7
1,000 addEdge6.02166.181.45e-4
1,000 getVertex0.052.17e+43.52e-7
1,000 getEdge23.8841.880.00
tarjan215.084.650.01
topologicalSort187.835.320.00
doubly-linked-list
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push227.394.400.03
1,000,000 unshift211.704.720.02
1,000,000 unshift & shift171.845.820.02
1,000,000 addBefore318.693.140.06
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push221.694.510.03
1,000,000 unshift227.334.400.07
1,000,000 unshift & shift170.085.880.02
1,000,000 addBefore321.293.110.07
singly-linked-list
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push & shift201.654.960.04
10,000 push & pop216.764.610.01
10,000 addBefore248.824.020.01
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push & shift213.144.690.04
10,000 push & pop217.844.590.01
10,000 addBefore250.813.990.01
priority-queue
-
test nametime taken (ms)executions per secsample deviation
100,000 add27.3536.560.00
100,000 add & poll78.7612.700.02
+
test nametime taken (ms)executions per secsample deviation
100,000 add26.9137.161.96e-4
100,000 add & poll75.0913.325.04e-4
stack
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push38.7925.780.00
1,000,000 push & pop47.0121.270.01
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push39.9225.050.01
1,000,000 push & pop48.0820.800.01
[//]: # (No deletion!!! End of Replace Section) diff --git a/src/data-structures/binary-tree/avl-tree-multi-map.ts b/src/data-structures/binary-tree/avl-tree-multi-map.ts index 281eb41..e8b4d9b 100644 --- a/src/data-structures/binary-tree/avl-tree-multi-map.ts +++ b/src/data-structures/binary-tree/avl-tree-multi-map.ts @@ -245,6 +245,7 @@ export class AVLTreeMultiMap< ): BinaryTreeDeleteResult[] { const deletedResult: BinaryTreeDeleteResult[] = []; if (!this.root) return deletedResult; + callback = this._ensureCallback(identifier, callback); const curr: NODE | undefined = this.getNode(identifier, callback) ?? undefined; if (!curr) return deletedResult; diff --git a/src/data-structures/binary-tree/avl-tree.ts b/src/data-structures/binary-tree/avl-tree.ts index 8ec899e..86a6cf3 100644 --- a/src/data-structures/binary-tree/avl-tree.ts +++ b/src/data-structures/binary-tree/avl-tree.ts @@ -172,7 +172,6 @@ export class AVLTree< identifier: ReturnType, callback: C = this._DEFAULT_CALLBACK as C ): BinaryTreeDeleteResult[] { - if ((identifier as any) instanceof AVLTreeNode) callback = (node => node) as C; const deletedResults = super.delete(identifier, callback); for (const { needBalanced } of deletedResults) { if (needBalanced) { diff --git a/src/data-structures/binary-tree/binary-tree.ts b/src/data-structures/binary-tree/binary-tree.ts index c96509c..2f0f16b 100644 --- a/src/data-structures/binary-tree/binary-tree.ts +++ b/src/data-structures/binary-tree/binary-tree.ts @@ -508,8 +508,7 @@ export class BinaryTree< ): BinaryTreeDeleteResult[] { const deletedResult: BinaryTreeDeleteResult[] = []; if (!this.root) return deletedResult; - if ((!callback || callback === this._DEFAULT_CALLBACK) && (identifier as any) instanceof BinaryTreeNode) - callback = (node => node) as C; + callback = this._ensureCallback(identifier, callback); const curr = this.getNode(identifier, callback); if (!curr) return deletedResult; @@ -612,10 +611,9 @@ export class BinaryTree< beginRoot: KeyOrNodeOrEntry = this.root, iterationType: IterationType = this.iterationType ): NODE[] { - if ((!callback || callback === this._DEFAULT_CALLBACK) && (identifier as any) instanceof BinaryTreeNode) - callback = (node => node) as C; beginRoot = this.ensureNode(beginRoot); if (!beginRoot) return []; + callback = this._ensureCallback(identifier, callback); const ans: NODE[] = []; @@ -838,8 +836,7 @@ export class BinaryTree< beginRoot: KeyOrNodeOrEntry = this.root, iterationType: IterationType = this.iterationType ): boolean { - if ((!callback || callback === this._DEFAULT_CALLBACK) && (identifier as any) instanceof BinaryTreeNode) - callback = (node => node) as C; + callback = this._ensureCallback(identifier, callback); return this.getNodes(identifier, callback, true, beginRoot, iterationType).length > 0; } @@ -2051,4 +2048,15 @@ export class BinaryTree< } this._root = v; } + + protected _ensureCallback>( + identifier: ReturnType | null | undefined, + callback: C = this._DEFAULT_CALLBACK as C + ): C { + if ((!callback || callback === this._DEFAULT_CALLBACK) && this.isNode(identifier)) { + callback = (node => node) as C; + } + + return callback; + } } diff --git a/src/data-structures/binary-tree/bst.ts b/src/data-structures/binary-tree/bst.ts index 021b88f..e91e0da 100644 --- a/src/data-structures/binary-tree/bst.ts +++ b/src/data-structures/binary-tree/bst.ts @@ -448,6 +448,7 @@ export class BST< ): NODE[] { beginRoot = this.ensureNode(beginRoot); if (!beginRoot) return []; + callback = this._ensureCallback(identifier, callback); const ans: NODE[] = []; if (iterationType === 'RECURSIVE') { diff --git a/src/data-structures/binary-tree/rb-tree.ts b/src/data-structures/binary-tree/rb-tree.ts index 4fe09bf..236d035 100644 --- a/src/data-structures/binary-tree/rb-tree.ts +++ b/src/data-structures/binary-tree/rb-tree.ts @@ -252,7 +252,7 @@ export class RedBlackTree< ): BinaryTreeDeleteResult[] { if (identifier === null) return []; const results: BinaryTreeDeleteResult[] = []; - + callback = this._ensureCallback(identifier, callback); const nodeToDelete = this.isRealNode(identifier) ? identifier : this.getNode(identifier, callback); if (!nodeToDelete) { diff --git a/src/data-structures/binary-tree/tree-multi-map.ts b/src/data-structures/binary-tree/tree-multi-map.ts index 025520b..7ad13d9 100644 --- a/src/data-structures/binary-tree/tree-multi-map.ts +++ b/src/data-structures/binary-tree/tree-multi-map.ts @@ -257,6 +257,7 @@ export class TreeMultiMap< ): BinaryTreeDeleteResult[] { if (identifier === null) return []; const results: BinaryTreeDeleteResult[] = []; + callback = this._ensureCallback(identifier, callback); const nodeToDelete = this.isRealNode(identifier) ? identifier : this.getNode(identifier, callback);