diff --git a/README.md b/README.md index 45d7e3d..6f78b55 100644 --- a/README.md +++ b/README.md @@ -658,37 +658,40 @@ optimal approach to data structure design. [//]: # (Start of Replace Section)
avl-tree
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 add randomly2.28438.38230.002.56e-5
1000 add & delete randomly5.16193.94110.017.96e-4
1000 addMany3.05328.30170.003.13e-4
1000 get2.08480.72250.009.01e-5
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly32.7530.539.04e-4
10,000 add & delete randomly69.5914.370.00
10,000 addMany42.0723.778.58e-4
10,000 get27.8735.885.71e-4
binary-tree
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 add randomly12.8877.6550.011.17e-4
1000 add & delete randomly15.9562.7040.021.78e-4
1000 addMany10.6194.2550.011.16e-4
1000 get18.0255.5130.021.59e-4
1000 dfs69.9514.3010.076.49e-4
1000 bfs54.7818.2510.054.98e-4
1000 morris37.2626.8320.042.16e-4
+
test nametime taken (ms)executions per secsample deviation
1,000 add randomly12.8477.861.92e-4
1,000 add & delete randomly15.9462.723.07e-4
1,000 addMany10.5994.451.67e-4
1,000 get17.9955.592.35e-4
1,000 dfs70.1714.258.83e-4
1,000 bfs54.5218.347.43e-4
1,000 morris37.2626.845.27e-4
bst
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 add randomly2.02496.10250.001.56e-5
1000 add & delete randomly4.60217.31120.004.43e-4
1000 addMany2.23448.71240.002.96e-4
1000 get2.09479.52250.001.27e-5
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly33.2530.074.20e-4
10,000 add & delete randomly73.7613.568.39e-4
10,000 addMany29.9633.384.40e-4
10,000 get28.5335.053.89e-4
+
+
rb-tree
+
test nametime taken (ms)executions per secsample deviation
100,000 add randomly74.4113.440.00
100,000 add & 1000 delete randomly80.6312.400.01
100,000 getNode60.0016.670.01
directed-graph
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 addVertex0.109871.965011.01e-47.32e-7
1000 addEdge6.48154.2990.010.00
1000 getVertex0.052.17e+411104.61e-53.80e-7
1000 getEdge24.6540.5730.020.01
tarjan208.004.8110.210.01
tarjan all212.974.7010.210.00
topologicalSort171.495.8310.170.01
+
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.109856.401.79e-6
1,000 addEdge6.21160.968.40e-4
1,000 getVertex0.052.16e+43.85e-7
1,000 getEdge22.4344.570.00
tarjan219.404.560.03
tarjan all214.214.670.00
topologicalSort172.465.800.00
heap
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 add & pop0.342929.811493.41e-42.37e-6
1000 fib add & pop3.89257.31140.002.53e-5
+
test nametime taken (ms)executions per secsample deviation
10,000 add & pop4.63215.754.05e-5
10,000 fib add & pop355.102.820.00
doubly-linked-list
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000000 unshift212.404.7110.210.02
1000000 unshift & shift172.945.7810.170.03
1000 insertBefore0.033.70e+419032.71e-52.38e-6
+
test nametime taken (ms)executions per secsample deviation
1,000,000 unshift210.624.750.05
1,000,000 unshift & shift176.635.660.04
1,000,000 insertBefore288.553.470.05
singly-linked-list
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000 push & pop1.75571.73300.005.06e-5
1000 insertBefore2.30434.82220.005.10e-5
+
test nametime taken (ms)executions per secsample deviation
10,000 push & pop232.244.310.03
10,000 insertBefore245.584.070.00
max-priority-queue
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
10000 refill & poll11.4187.6550.011.49e-4
+
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll11.6286.092.24e-4
deque
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000000 push212.514.7110.210.06
1000000 shift24.9840.0430.020.00
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push223.784.470.05
1,000,000 shift25.7938.780.00
queue
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
1000000 push41.9723.8320.040.01
1000000 push & shift79.0812.6510.080.00
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push44.2722.590.01
1,000,000 push & shift79.6312.560.00
trie
-
test nametime taken (ms)executions per secexecuted timessample mean (secs)sample deviation
100000 push54.2418.4410.057.00e-4
100000 getWords96.1210.4010.100.00
+
test nametime taken (ms)executions per secsample deviation
100,000 push49.2920.290.00
100,000 getWords95.5510.470.01
[//]: # (End of Replace Section) \ No newline at end of file diff --git a/src/data-structures/binary-tree/binary-tree.ts b/src/data-structures/binary-tree/binary-tree.ts index c44befc..6a9378d 100644 --- a/src/data-structures/binary-tree/binary-tree.ts +++ b/src/data-structures/binary-tree/binary-tree.ts @@ -142,7 +142,7 @@ export class BinaryTree = BinaryTreeNode } protected defaultOneParamCallback = (node: N) => node.key; - + /** * Creates a new instance of BinaryTreeNode with the given key and value. * @param {BTNKey} key - The key for the new node. diff --git a/src/data-structures/binary-tree/bst.ts b/src/data-structures/binary-tree/bst.ts index aa85a2e..21fdc07 100644 --- a/src/data-structures/binary-tree/bst.ts +++ b/src/data-structures/binary-tree/bst.ts @@ -36,7 +36,7 @@ export class BST = BSTNode> } } } - + /** * The function creates a new binary search tree node with the given key and value. * @param {BTNKey} key - The key parameter is the key value that will be associated with diff --git a/src/data-structures/binary-tree/rb-tree.ts b/src/data-structures/binary-tree/rb-tree.ts index a2cd4cc..8ee5d51 100644 --- a/src/data-structures/binary-tree/rb-tree.ts +++ b/src/data-structures/binary-tree/rb-tree.ts @@ -44,6 +44,12 @@ export class RedBlackTree { return this._root; } + protected _size: number = 0; + + get size(): number { + return this._size; + } + /** * The `insert` function inserts a new node with a given key into a red-black tree and fixes any * violations of the red-black tree properties. @@ -51,7 +57,7 @@ export class RedBlackTree { * the RBTree. * @returns The function does not explicitly return anything. */ - insert(key: number): void { + add(key: number): void { const node: RBTreeNode = new RBTreeNode(key, RBTNColor.RED); node.left = NIL; node.right = NIL; @@ -79,20 +85,23 @@ export class RedBlackTree { if (node.parent === null) { node.color = RBTNColor.BLACK; + this._size++; return; } if (node.parent.parent === null) { + this._size++; return; } this._fixInsert(node); + this._size++; } /** * The `delete` function in TypeScript is used to remove a node with a specific key from a red-black * tree. - * @param {RBTreeNode} node - The `node` parameter is of type `RBTreeNode` and represents the current + * @param {number} key - The `node` parameter is of type `RBTreeNode` and represents the current * node being processed in the delete operation. * @returns The `delete` function does not return anything. It has a return type of `void`. */ @@ -113,6 +122,7 @@ export class RedBlackTree { } if (z === NIL) { + this._size--; return; } @@ -144,6 +154,7 @@ export class RedBlackTree { if (yOriginalColor === RBTNColor.BLACK) { this._fixDelete(x); } + this._size--; }; helper(this.root); } @@ -241,6 +252,11 @@ export class RedBlackTree { return y; } + clear() { + this._root = NIL; + this._size = 0; + } + print(beginRoot: RBTreeNode = this.root) { const display = (root: RBTreeNode | null): void => { const [lines, , ,] = _displayAux(root); diff --git a/test/performance/data-structures/binary-tree/avl-tree.test.ts b/test/performance/data-structures/binary-tree/avl-tree.test.ts index f8a0d54..ca2a0a3 100644 --- a/test/performance/data-structures/binary-tree/avl-tree.test.ts +++ b/test/performance/data-structures/binary-tree/avl-tree.test.ts @@ -4,17 +4,17 @@ import {getRandomIntArray, magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); const avl = new AVLTree(); -const {N_LOG_N} = magnitude; -const arr = getRandomIntArray(N_LOG_N, 0, N_LOG_N, true); +const {TEN_THOUSAND} = magnitude; +const arr = getRandomIntArray(TEN_THOUSAND, 0, TEN_THOUSAND, true); suite - .add(`${N_LOG_N} add randomly`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} add randomly`, () => { avl.clear(); for (let i = 0; i < arr.length; i++) { avl.add(arr[i]); } }) - .add(`${N_LOG_N} add & delete randomly`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} add & delete randomly`, () => { avl.clear(); for (let i = 0; i < arr.length; i++) { avl.add(arr[i]); @@ -23,11 +23,11 @@ suite avl.delete(arr[i]); } }) - .add(`${N_LOG_N} addMany`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} addMany`, () => { avl.clear(); avl.addMany(arr); }) - .add(`${N_LOG_N} get`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} get`, () => { for (let i = 0; i < arr.length; i++) { avl.get(arr[i]); } diff --git a/test/performance/data-structures/binary-tree/binary-tree.test.ts b/test/performance/data-structures/binary-tree/binary-tree.test.ts index 416afeb..21a4dc0 100644 --- a/test/performance/data-structures/binary-tree/binary-tree.test.ts +++ b/test/performance/data-structures/binary-tree/binary-tree.test.ts @@ -8,13 +8,13 @@ const {N_LOG_N} = magnitude; const arr = getRandomIntArray(N_LOG_N, 0, N_LOG_N, true); suite - .add(`${N_LOG_N} add randomly`, () => { + .add(`${N_LOG_N.toLocaleString()} add randomly`, () => { biTree.clear(); for (let i = 0; i < arr.length; i++) { biTree.add(arr[i]); } }) - .add(`${N_LOG_N} add & delete randomly`, () => { + .add(`${N_LOG_N.toLocaleString()} add & delete randomly`, () => { biTree.clear(); for (let i = 0; i < arr.length; i++) { biTree.add(arr[i]); @@ -23,22 +23,22 @@ suite biTree.delete(arr[i]); } }) - .add(`${N_LOG_N} addMany`, () => { + .add(`${N_LOG_N.toLocaleString()} addMany`, () => { biTree.clear(); biTree.addMany(arr); }) - .add(`${N_LOG_N} get`, () => { + .add(`${N_LOG_N.toLocaleString()} get`, () => { for (let i = 0; i < arr.length; i++) { biTree.get(arr[i]); } }) - .add(`${N_LOG_N} dfs`, () => { + .add(`${N_LOG_N.toLocaleString()} dfs`, () => { for (let i = 0; i < N_LOG_N; i++) biTree.dfs(); }) - .add(`${N_LOG_N} bfs`, () => { + .add(`${N_LOG_N.toLocaleString()} bfs`, () => { for (let i = 0; i < N_LOG_N; i++) biTree.bfs(); }) - .add(`${N_LOG_N} morris`, () => { + .add(`${N_LOG_N.toLocaleString()} morris`, () => { for (let i = 0; i < N_LOG_N; i++) biTree.morris(n => n, 'pre'); }); diff --git a/test/performance/data-structures/binary-tree/bst.test.ts b/test/performance/data-structures/binary-tree/bst.test.ts index 65e888d..b787c4b 100644 --- a/test/performance/data-structures/binary-tree/bst.test.ts +++ b/test/performance/data-structures/binary-tree/bst.test.ts @@ -4,17 +4,17 @@ import {getRandomIntArray, magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); const bst = new BST(); -const {N_LOG_N} = magnitude; -const arr = getRandomIntArray(N_LOG_N, 0, N_LOG_N, true); +const {TEN_THOUSAND} = magnitude; +const arr = getRandomIntArray(TEN_THOUSAND, 0, TEN_THOUSAND, true); suite - .add(`${N_LOG_N} add randomly`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} add randomly`, () => { bst.clear(); for (let i = 0; i < arr.length; i++) { bst.add(arr[i]); } }) - .add(`${N_LOG_N} add & delete randomly`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} add & delete randomly`, () => { bst.clear(); for (let i = 0; i < arr.length; i++) { bst.add(arr[i]); @@ -23,11 +23,11 @@ suite bst.delete(arr[i]); } }) - .add(`${N_LOG_N} addMany`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} addMany`, () => { bst.clear(); bst.addMany(arr); }) - .add(`${N_LOG_N} get`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} get`, () => { for (let i = 0; i < arr.length; i++) { bst.get(arr[i]); } diff --git a/test/performance/data-structures/binary-tree/rb-tree.test.ts b/test/performance/data-structures/binary-tree/rb-tree.test.ts index e69de29..a3da096 100644 --- a/test/performance/data-structures/binary-tree/rb-tree.test.ts +++ b/test/performance/data-structures/binary-tree/rb-tree.test.ts @@ -0,0 +1,32 @@ +import {RedBlackTree} from '../../../../src'; +import * as Benchmark from 'benchmark'; +import {getRandomIntArray, magnitude} from '../../../utils'; + +const suite = new Benchmark.Suite(); +const rbTree = new RedBlackTree(); +const {HUNDRED_THOUSAND} = magnitude; +const arr = getRandomIntArray(HUNDRED_THOUSAND, 0, HUNDRED_THOUSAND, true); + +suite + .add(`${HUNDRED_THOUSAND.toLocaleString()} add randomly`, () => { + rbTree.clear(); + for (let i = 0; i < arr.length; i++) { + rbTree.add(arr[i]); + } + }) + .add(`${HUNDRED_THOUSAND.toLocaleString()} add & 1000 delete randomly`, () => { + rbTree.clear(); + for (let i = 0; i < arr.length; i++) { + rbTree.add(arr[i]); + } + for (let i = 0; i < 1000; i++) { + rbTree.delete(arr[i]); + } + }) + .add(`${HUNDRED_THOUSAND.toLocaleString()} getNode`, () => { + for (let i = 0; i < arr.length; i++) { + rbTree.getNode(arr[i]); + } + }); + +export {suite}; diff --git a/test/performance/data-structures/graph/directed-graph.test.ts b/test/performance/data-structures/graph/directed-graph.test.ts index fd5376f..c8719d6 100644 --- a/test/performance/data-structures/graph/directed-graph.test.ts +++ b/test/performance/data-structures/graph/directed-graph.test.ts @@ -8,24 +8,24 @@ const graph = new DirectedGraph(); const vertexes = getRandomWords(THOUSAND); suite - .add(`${THOUSAND} addVertex`, () => { + .add(`${THOUSAND.toLocaleString()} addVertex`, () => { for (const v of vertexes) { graph.addVertex(v); } }) - .add(`${THOUSAND} addEdge`, () => { + .add(`${THOUSAND.toLocaleString()} addEdge`, () => { for (let i = 0; i < THOUSAND; i++) { const v1 = vertexes[getRandomIndex(vertexes)]; const v2 = vertexes[getRandomIndex(vertexes)]; graph.addEdge(v1, v2); } }) - .add(`${THOUSAND} getVertex`, () => { + .add(`${THOUSAND.toLocaleString()} getVertex`, () => { for (let i = 0; i < THOUSAND; i++) { graph.getVertex(vertexes[getRandomIndex(vertexes)]); } }) - .add(`${THOUSAND} getEdge`, () => { + .add(`${THOUSAND.toLocaleString()} getEdge`, () => { for (let i = 0; i < THOUSAND; i++) { graph.getEdge(vertexes[getRandomIndex(vertexes)], vertexes[getRandomIndex(vertexes)]); } diff --git a/test/performance/data-structures/heap/heap.test.ts b/test/performance/data-structures/heap/heap.test.ts index d0fd2e8..a55c311 100644 --- a/test/performance/data-structures/heap/heap.test.ts +++ b/test/performance/data-structures/heap/heap.test.ts @@ -3,26 +3,26 @@ import * as Benchmark from 'benchmark'; import {magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); -const {N_LOG_N} = magnitude; +const {TEN_THOUSAND} = magnitude; suite - .add(`${N_LOG_N} add & pop`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} add & pop`, () => { const heap = new Heap({comparator: (a, b) => b - a}); - for (let i = 0; i < N_LOG_N; i++) { + for (let i = 0; i < TEN_THOUSAND; i++) { heap.add(i); } - for (let i = 0; i < N_LOG_N; i++) { + for (let i = 0; i < TEN_THOUSAND; i++) { heap.pop(); } }) - .add(`${N_LOG_N} fib add & pop`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} fib add & pop`, () => { const fbHeap = new FibonacciHeap(); - for (let i = 1; i <= N_LOG_N; i++) { + for (let i = 1; i <= TEN_THOUSAND; i++) { fbHeap.push(i); } - for (let i = 1; i <= N_LOG_N; i++) { + for (let i = 1; i <= TEN_THOUSAND; i++) { fbHeap.pop(); } }); diff --git a/test/performance/data-structures/linked-list/doubly-linked-list.test.ts b/test/performance/data-structures/linked-list/doubly-linked-list.test.ts index c181260..5cc9977 100644 --- a/test/performance/data-structures/linked-list/doubly-linked-list.test.ts +++ b/test/performance/data-structures/linked-list/doubly-linked-list.test.ts @@ -3,17 +3,17 @@ import * as Benchmark from 'benchmark'; import {magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); -const {LINEAR, N_LOG_N} = magnitude; +const {LINEAR} = magnitude; suite - .add(`${LINEAR} unshift`, () => { + .add(`${LINEAR.toLocaleString()} unshift`, () => { const list = new DoublyLinkedList(); for (let i = 0; i < LINEAR; i++) { list.unshift(i); } }) - .add(`${LINEAR} unshift & shift`, () => { + .add(`${LINEAR.toLocaleString()} unshift & shift`, () => { const list = new DoublyLinkedList(); for (let i = 0; i < LINEAR; i++) { @@ -23,11 +23,11 @@ suite list.shift(); } }) - .add(`${N_LOG_N} insertBefore`, () => { + .add(`${LINEAR.toLocaleString()} insertBefore`, () => { const doublyList = new DoublyLinkedList(); let midNode: DoublyLinkedListNode | null = null; - const midIndex = Math.floor(N_LOG_N / 2); - for (let i = 0; i < N_LOG_N; i++) { + const midIndex = Math.floor(LINEAR / 2); + for (let i = 0; i < LINEAR; i++) { doublyList.push(i); if (i === midIndex) { midNode = doublyList.getNode(i); diff --git a/test/performance/data-structures/linked-list/singly-linked-list.test.ts b/test/performance/data-structures/linked-list/singly-linked-list.test.ts index 7c9e852..4802321 100644 --- a/test/performance/data-structures/linked-list/singly-linked-list.test.ts +++ b/test/performance/data-structures/linked-list/singly-linked-list.test.ts @@ -3,25 +3,25 @@ import * as Benchmark from 'benchmark'; import {magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); -const {N_LOG_N} = magnitude; +const {TEN_THOUSAND} = magnitude; suite - .add(`${N_LOG_N} push & pop`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} push & pop`, () => { const list = new SinglyLinkedList(); - for (let i = 0; i < N_LOG_N; i++) { + for (let i = 0; i < TEN_THOUSAND; i++) { list.push(i); } - for (let i = 0; i < N_LOG_N; i++) { + for (let i = 0; i < TEN_THOUSAND; i++) { list.pop(); } }) - .add(`${N_LOG_N} insertBefore`, () => { + .add(`${TEN_THOUSAND.toLocaleString()} insertBefore`, () => { const singlyList = new SinglyLinkedList(); let midSinglyNode: SinglyLinkedListNode | null = null; - const midIndex = Math.floor(N_LOG_N / 2); - for (let i = 0; i < N_LOG_N; i++) { + const midIndex = Math.floor(TEN_THOUSAND / 2); + for (let i = 0; i < TEN_THOUSAND; i++) { singlyList.push(i); if (i === midIndex) { midSinglyNode = singlyList.getNode(i); diff --git a/test/performance/data-structures/priority-queue/max-priority-queue.test.ts b/test/performance/data-structures/priority-queue/max-priority-queue.test.ts index 430e20b..ef44072 100644 --- a/test/performance/data-structures/priority-queue/max-priority-queue.test.ts +++ b/test/performance/data-structures/priority-queue/max-priority-queue.test.ts @@ -5,7 +5,7 @@ import {magnitude} from '../../../utils'; const suite = new Benchmark.Suite(); const {TEN_THOUSAND} = magnitude; -suite.add(`${TEN_THOUSAND} refill & poll`, () => { +suite.add(`${TEN_THOUSAND.toLocaleString()} refill & poll`, () => { const nodes = Array.from( new Set(Array.from(new Array(TEN_THOUSAND), () => Math.floor(Math.random() * TEN_THOUSAND * 100))) ); diff --git a/test/performance/data-structures/queue/deque.test.ts b/test/performance/data-structures/queue/deque.test.ts index e377199..566b370 100644 --- a/test/performance/data-structures/queue/deque.test.ts +++ b/test/performance/data-structures/queue/deque.test.ts @@ -6,13 +6,13 @@ export const suite = new Benchmark.Suite(); const {LINEAR} = magnitude; suite - .add(`${LINEAR} push`, () => { + .add(`${LINEAR.toLocaleString()} push`, () => { const deque = new Deque(); for (let i = 0; i < LINEAR; i++) { deque.push(i); } }) - .add(`${LINEAR} shift`, () => { + .add(`${LINEAR.toLocaleString()} shift`, () => { const deque = new Deque(); for (let i = 0; i < LINEAR; i++) { deque.push(i); diff --git a/test/performance/data-structures/queue/queue.test.ts b/test/performance/data-structures/queue/queue.test.ts index 689cac0..a5b5874 100644 --- a/test/performance/data-structures/queue/queue.test.ts +++ b/test/performance/data-structures/queue/queue.test.ts @@ -6,14 +6,14 @@ const suite = new Benchmark.Suite(); const {LINEAR} = magnitude; suite - .add(`${LINEAR} push`, () => { + .add(`${LINEAR.toLocaleString()} push`, () => { const queue = new Queue(); for (let i = 0; i < LINEAR; i++) { queue.push(i); } }) - .add(`${LINEAR} push & shift`, () => { + .add(`${LINEAR.toLocaleString()} push & shift`, () => { const queue = new Queue(); for (let i = 0; i < LINEAR; i++) { diff --git a/test/performance/data-structures/trie/trie.test.ts b/test/performance/data-structures/trie/trie.test.ts index a448dd2..433104b 100644 --- a/test/performance/data-structures/trie/trie.test.ts +++ b/test/performance/data-structures/trie/trie.test.ts @@ -8,12 +8,12 @@ const trie = new Trie(); const randomWords = getRandomWords(HUNDRED_THOUSAND, false); suite - .add(`${HUNDRED_THOUSAND} push`, () => { + .add(`${HUNDRED_THOUSAND.toLocaleString()} push`, () => { for (let i = 0; i < randomWords.length; i++) { trie.add(randomWords[i]); } }) - .add(`${HUNDRED_THOUSAND} getWords`, () => { + .add(`${HUNDRED_THOUSAND.toLocaleString()} getWords`, () => { for (let i = 0; i < randomWords.length; i++) { trie.getWords(randomWords[i]); } diff --git a/test/performance/reportor.ts b/test/performance/reportor.ts index 10cd22b..e0c585b 100644 --- a/test/performance/reportor.ts +++ b/test/performance/reportor.ts @@ -126,11 +126,10 @@ function replaceMarkdownContent(startMarker: string, endMarker: string, newText: } // Replace the old content with the new text - const updatedMarkdown = - data.slice(0, startIndex + startMarker.length) + '\n' + newText + data.slice(endIndex); + const updatedMarkdown = data.slice(0, startIndex + startMarker.length) + '\n' + newText + data.slice(endIndex); // Try writing the modified content back to the file - fs.writeFile(filePath, updatedMarkdown, 'utf8', (err) => { + fs.writeFile(filePath, updatedMarkdown, 'utf8', err => { if (err) { console.error(`Unable to write to ${filePath}:`, err); } else { @@ -145,7 +144,7 @@ performanceTests.forEach(item => { const relativeFilePath = path.relative(__dirname, file); const directory = path.dirname(relativeFilePath); const fileName = path.basename(relativeFilePath); - console.log(`${BG_YELLOW}Running in${END}: ${GRAY}${directory}/${END}${CYAN}${fileName}${END}`); + console.log(`${BG_YELLOW} Running ${END} ${GRAY}${directory}/${END}${CYAN}${fileName}${END}`); if (suite) { let runTime = 0; @@ -159,8 +158,8 @@ performanceTests.forEach(item => { 'test name': benchmark.name, 'time taken (ms)': numberFix(benchmark.times.period * 1000, 2), 'executions per sec': numberFix(benchmark.hz, 2), - 'executed times': numberFix(benchmark.count, 0), - 'sample mean (secs)': numberFix(benchmark.stats.mean, 2), + // 'executed times': numberFix(benchmark.count, 0), + // 'sample mean (secs)': numberFix(benchmark.stats.mean, 2), 'sample deviation': numberFix(benchmark.stats.deviation, 2) }; }); diff --git a/test/unit/data-structures/binary-tree/rb-tree.test.ts b/test/unit/data-structures/binary-tree/rb-tree.test.ts index 2da8475..1a2e085 100644 --- a/test/unit/data-structures/binary-tree/rb-tree.test.ts +++ b/test/unit/data-structures/binary-tree/rb-tree.test.ts @@ -11,11 +11,11 @@ describe('RedBlackTree', () => { tree = new RedBlackTree(); }); - describe('insert and getNode', () => { - test('should insert and find a node in the tree', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + describe('add and getNode', () => { + test('should add and find a node in the tree', () => { + tree.add(10); + tree.add(20); + tree.add(5); expect(tree.getNode(10)).toBeInstanceOf(RBTreeNode); expect(tree.getNode(20)).toBeInstanceOf(RBTreeNode); @@ -23,9 +23,9 @@ describe('RedBlackTree', () => { expect(tree.getNode(15)).toBe(null); }); - test('should insert and find nodes with negative keys', () => { - tree.insert(-10); - tree.insert(-20); + test('should add and find nodes with negative keys', () => { + tree.add(-10); + tree.add(-20); expect(tree.getNode(-10)).toBeInstanceOf(RBTreeNode); expect(tree.getNode(-20)).toBeInstanceOf(RBTreeNode); @@ -34,18 +34,18 @@ describe('RedBlackTree', () => { describe('deleteNode', () => { test('should delete a node from the tree', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + tree.add(10); + tree.add(20); + tree.add(5); tree.delete(20); expect(tree.getNode(20)).toBe(null); }); test('should handle deleting a non-existent node', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + tree.add(10); + tree.add(20); + tree.add(5); tree.delete(15); expect(tree.getNode(15)).toBe(null); @@ -54,11 +54,11 @@ describe('RedBlackTree', () => { describe('minimum', () => { test('should find the minimum node in the tree', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); - tree.insert(15); - tree.insert(3); + tree.add(10); + tree.add(20); + tree.add(5); + tree.add(15); + tree.add(3); const minNode = tree.getLeftMost(tree.root); expect(minNode.key).toBe(3); @@ -72,11 +72,11 @@ describe('RedBlackTree', () => { describe('getRightMost', () => { test('should find the getRightMost node in the tree', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); - tree.insert(15); - tree.insert(25); + tree.add(10); + tree.add(20); + tree.add(5); + tree.add(15); + tree.add(25); const maxNode = tree.getRightMost(tree.root); expect(maxNode.key).toBe(25); @@ -90,11 +90,11 @@ describe('RedBlackTree', () => { describe('getSuccessor', () => { test('should find the getSuccessor of a node', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); - tree.insert(15); - tree.insert(25); + tree.add(10); + tree.add(20); + tree.add(5); + tree.add(15); + tree.add(25); const node = tree.getNode(15); const successorNode = tree.getSuccessor(node); @@ -103,8 +103,8 @@ describe('RedBlackTree', () => { }); test('should handle a node with no getSuccessor', () => { - tree.insert(10); - tree.insert(5); + tree.add(10); + tree.add(5); const node = tree.getNode(10); const successorNode = tree.getSuccessor(node); @@ -115,11 +115,11 @@ describe('RedBlackTree', () => { describe('getPredecessor', () => { test('should find the getPredecessor of a node', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); - tree.insert(15); - tree.insert(25); + tree.add(10); + tree.add(20); + tree.add(5); + tree.add(15); + tree.add(25); const node = tree.getNode(20); const predecessorNode = tree.getPredecessor(node); @@ -128,8 +128,8 @@ describe('RedBlackTree', () => { }); test('should handle a node with no getPredecessor', () => { - tree.insert(10); - tree.insert(20); + tree.add(10); + tree.add(20); const node = tree.getNode(20); const predecessorNode = tree.getPredecessor(node); @@ -146,69 +146,69 @@ describe('RedBlackTree', () => { tree = new RedBlackTree(); }); - it('should insert nodes into the tree', () => { - tree.insert(10); + it('should add nodes into the tree', () => { + tree.add(10); expect(tree.getNode(10)).toBeDefined(); - tree.insert(20); + tree.add(20); expect(tree.getNode(20)).toBeDefined(); - tree.insert(5); + tree.add(5); expect(tree.getNode(5)).toBeDefined(); }); it('should delete nodes from the tree', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + tree.add(10); + tree.add(20); + tree.add(5); tree.delete(20); expect(tree.getNode(20)).toBe(null); }); it('should get the successor of a node', () => { - tree.insert(10); - tree.insert(20); + tree.add(10); + tree.add(20); const node = tree.getNode(10); const successor = tree.getSuccessor(node); expect(successor?.key).toBe(20); }); it('should get the predecessor of a node', () => { - tree.insert(10); - tree.insert(20); + tree.add(10); + tree.add(20); const node = tree.getNode(20); const predecessor = tree.getPredecessor(node); expect(predecessor?.key).toBe(10); }); it('should rotate nodes to the left', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + tree.add(10); + tree.add(20); + tree.add(5); const node = tree.getNode(10); - tree.insert(15); + tree.add(15); // Verify that rotation has occurred expect(node.left.key).toBe(5); expect(node.right.key).toBe(20); }); it('should rotate nodes to the right', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); + tree.add(10); + tree.add(20); + tree.add(5); const node = tree.getNode(20); - tree.insert(25); + tree.add(25); // Verify that rotation has occurred expect(node.left.key).toBe(0); expect(node.right.key).toBe(25); }); it('should all node attributes fully conform to the red-black tree standards.', () => { - tree.insert(10); - tree.insert(20); - tree.insert(5); - tree.insert(15); - tree.insert(21); - tree.insert(6); - tree.insert(2); + tree.add(10); + tree.add(20); + tree.add(5); + tree.add(15); + tree.add(21); + tree.add(6); + tree.add(2); let node10F = tree.getNode(10); let node20F = tree.getNode(20); @@ -344,31 +344,31 @@ describe('RedBlackTree', () => { }); it('should fix the tree after insertion', () => { - tree.insert(1); - tree.insert(2); - tree.insert(5); - tree.insert(15); + tree.add(1); + tree.add(2); + tree.add(5); + tree.add(15); const node15F = tree.getNode(15); expect(node15F.left).toBe(NIL); expect(node15F.right).toBe(NIL); expect(node15F.parent).toBe(tree.getNode(5)); - tree.insert(25); - tree.insert(10); - tree.insert(8); - tree.insert(28); - tree.insert(111); - tree.insert(12); + tree.add(25); + tree.add(10); + tree.add(8); + tree.add(28); + tree.add(111); + tree.add(12); tree.delete(2); - tree.insert(22); - tree.insert(50); - tree.insert(155); - tree.insert(225); + tree.add(22); + tree.add(50); + tree.add(155); + tree.add(225); const node225F = tree.getNode(225); expect(node225F.left).toBe(NIL); expect(node225F.right).toBe(NIL); expect(node225F.parent.key).toBe(155); - tree.insert(7); + tree.add(7); const node15S = tree.getNode(15); expect(node15S.left.key).toBe(8); @@ -382,9 +382,9 @@ describe('RedBlackTree', () => { const node15T = tree.getNode(15); expect(node15T).toBe(null); - tree.insert(23); - tree.insert(33); - tree.insert(15); + tree.add(23); + tree.add(33); + tree.add(15); const nodeLM = tree.getLeftMost(); expect(nodeLM.key).toBe(1); @@ -402,33 +402,33 @@ describe('RedBlackTree', () => { expect(node225S.right).toBe(NIL); expect(node225S.parent.key).toBe(155); expect(tree.getNode(0)).toBe(null); - tree.insert(1); - tree.insert(2); - tree.insert(3); - tree.insert(4); - tree.insert(5); - tree.insert(6); - tree.insert(7); - tree.insert(8); - tree.insert(9); - tree.insert(10); - tree.insert(11); - tree.insert(12); - tree.insert(13); - tree.insert(14); - tree.insert(15); - tree.insert(16); - tree.insert(17); - tree.insert(18); - tree.insert(19); - tree.insert(110); + tree.add(1); + tree.add(2); + tree.add(3); + tree.add(4); + tree.add(5); + tree.add(6); + tree.add(7); + tree.add(8); + tree.add(9); + tree.add(10); + tree.add(11); + tree.add(12); + tree.add(13); + tree.add(14); + tree.add(15); + tree.add(16); + tree.add(17); + tree.add(18); + tree.add(19); + tree.add(110); isDebug && tree.print(); }); it('should fix the tree after insertion and deletion', () => { for (let i = 0; i < 100; i++) { - tree.insert(getRandomInt(-100, 1000)); + tree.add(getRandomInt(-100, 1000)); tree.delete(getRandomInt(-100, 1000)); } }); diff --git a/test/unit/data-structures/graph/salty-edges.json b/test/unit/data-structures/graph/salty-edges.json new file mode 100644 index 0000000..5bbc784 --- /dev/null +++ b/test/unit/data-structures/graph/salty-edges.json @@ -0,0 +1 @@ +[[{"name":"Intersection_1"},{"name":"Intersection_2","weight":28}],[{"name":"Intersection_1"},{"name":"Intersection_14","weight":44}],[{"name":"Intersection_2"},{"name":"Intersection_3","weight":8}],[{"name":"Intersection_2"},{"name":"Intersection_14","weight":44}],[{"name":"Intersection_3"},{"name":"Intersection_4","weight":31}],[{"name":"Intersection_3"},{"name":"Intersection_22","weight":45}],[{"name":"Intersection_4"},{"name":"Intersection_5","weight":37}],[{"name":"Intersection_4"},{"name":"Intersection_24","weight":40}],[{"name":"Intersection_5"},{"name":"Intersection_6","weight":32}],[{"name":"Intersection_5"},{"name":"Intersection_26","weight":34}],[{"name":"Intersection_6"},{"name":"Intersection_7","weight":30}],[{"name":"Intersection_7"},{"name":"Intersection_8","weight":53}],[{"name":"Intersection_7"},{"name":"Intersection_27","weight":0}],[{"name":"Intersection_8"},{"name":"Intersection_9","weight":33}],[{"name":"Intersection_8"},{"name":"Intersection_47","weight":38}],[{"name":"Intersection_9"},{"name":"Intersection_10","weight":28}],[{"name":"Intersection_9"},{"name":"Intersection_62","weight":31}],[{"name":"Intersection_10"},{"name":"Intersection_11","weight":18}],[{"name":"Intersection_10"},{"name":"Intersection_59","weight":45}],[{"name":"Intersection_11"},{"name":"Intersection_12","weight":28}],[{"name":"Intersection_11"},{"name":"Intersection_58","weight":21}],[{"name":"Intersection_12"},{"name":"Intersection_13","weight":35}],[{"name":"Intersection_12"},{"name":"Intersection_57","weight":22}],[{"name":"Intersection_14"},{"name":"Intersection_15","weight":40}],[{"name":"Intersection_15"},{"name":"Intersection_16","weight":43}],[{"name":"Intersection_15"},{"name":"Intersection_23","weight":27}],[{"name":"Intersection_16"},{"name":"Intersection_17","weight":14}],[{"name":"Intersection_17"},{"name":"Intersection_18","weight":51}],[{"name":"Intersection_18"},{"name":"Intersection_19","weight":29}],[{"name":"Intersection_19"},{"name":"Intersection_20","weight":34}],[{"name":"Intersection_20"},{"name":"Intersection_21","weight":43}],[{"name":"Intersection_20"},{"name":"Intersection_66","weight":24}],[{"name":"Intersection_21"},{"name":"Intersection_52","weight":36}],[{"name":"Intersection_22"},{"name":"Intersection_23","weight":27}],[{"name":"Intersection_23"},{"name":"Intersection_33","weight":10}],[{"name":"Intersection_24"},{"name":"Intersection_25","weight":24}],[{"name":"Intersection_24"},{"name":"Intersection_22","weight":45}],[{"name":"Intersection_25"},{"name":"Intersection_34","weight":23}],[{"name":"Intersection_26"},{"name":"Intersection_30","weight":5}],[{"name":"Intersection_27"},{"name":"Intersection_28","weight":25}],[{"name":"Intersection_27"},{"name":"Intersection_45","weight":6}],[{"name":"Intersection_28"},{"name":"Intersection_29","weight":21}],[{"name":"Intersection_29"},{"name":"Intersection_26","weight":34}],[{"name":"Intersection_29"},{"name":"Intersection_41","weight":23}],[{"name":"Intersection_30"},{"name":"Intersection_24","weight":40}],[{"name":"Intersection_30"},{"name":"Intersection_31","weight":18}],[{"name":"Intersection_31"},{"name":"Intersection_32","weight":11}],[{"name":"Intersection_32"},{"name":"Intersection_35","weight":21}],[{"name":"Intersection_33"},{"name":"Intersection_25","weight":24}],[{"name":"Intersection_33"},{"name":"Intersection_42","weight":32}],[{"name":"Intersection_34"},{"name":"Intersection_32","weight":11}],[{"name":"Intersection_34"},{"name":"Intersection_42","weight":32}],[{"name":"Intersection_35"},{"name":"Intersection_36","weight":25}],[{"name":"Intersection_35"},{"name":"Intersection_43","weight":23}],[{"name":"Intersection_36"},{"name":"Intersection_37","weight":37}],[{"name":"Intersection_37"},{"name":"Intersection_49","weight":19}],[{"name":"Intersection_38"},{"name":"Intersection_39","weight":29}],[{"name":"Intersection_38"},{"name":"Intersection_46","weight":31}],[{"name":"Intersection_39"},{"name":"Intersection_40","weight":22}],[{"name":"Intersection_39"},{"name":"Intersection_46","weight":31}],[{"name":"Intersection_40"},{"name":"Intersection_41","weight":23}],[{"name":"Intersection_41"},{"name":"Intersection_31","weight":18}],[{"name":"Intersection_42"},{"name":"Intersection_16","weight":43}],[{"name":"Intersection_42"},{"name":"Intersection_43","weight":23}],[{"name":"Intersection_43"},{"name":"Intersection_44","weight":23}],[{"name":"Intersection_43"},{"name":"Intersection_17","weight":14}],[{"name":"Intersection_45"},{"name":"Intersection_39","weight":29}],[{"name":"Intersection_46"},{"name":"Intersection_48","weight":4}],[{"name":"Intersection_47"},{"name":"Intersection_38","weight":0}],[{"name":"Intersection_47"},{"name":"Intersection_45","weight":6}],[{"name":"Intersection_48"},{"name":"Intersection_37","weight":37}],[{"name":"Intersection_48"},{"name":"Intersection_63","weight":38}],[{"name":"Intersection_49"},{"name":"Intersection_19","weight":29}],[{"name":"Intersection_49"},{"name":"Intersection_51","weight":42}],[{"name":"Intersection_50"},{"name":"Intersection_49","weight":19}],[{"name":"Intersection_51"},{"name":"Intersection_66","weight":24}],[{"name":"Intersection_52"},{"name":"Intersection_53","weight":31}],[{"name":"Intersection_53"},{"name":"Intersection_54","weight":42}],[{"name":"Intersection_54"},{"name":"Intersection_55","weight":18}],[{"name":"Intersection_54"},{"name":"Intersection_61","weight":28}],[{"name":"Intersection_55"},{"name":"Intersection_56","weight":15}],[{"name":"Intersection_56"},{"name":"Intersection_13","weight":35}],[{"name":"Intersection_57"},{"name":"Intersection_56","weight":15}],[{"name":"Intersection_58"},{"name":"Intersection_57","weight":22}],[{"name":"Intersection_58"},{"name":"Intersection_65","weight":19}],[{"name":"Intersection_59"},{"name":"Intersection_60","weight":40}],[{"name":"Intersection_59"},{"name":"Intersection_62","weight":31}],[{"name":"Intersection_60"},{"name":"Intersection_53","weight":31}],[{"name":"Intersection_61"},{"name":"Intersection_59","weight":45}],[{"name":"Intersection_62"},{"name":"Intersection_47","weight":38}],[{"name":"Intersection_62"},{"name":"Intersection_63","weight":38}],[{"name":"Intersection_63"},{"name":"Intersection_64","weight":16}],[{"name":"Intersection_64"},{"name":"Intersection_60","weight":40}],[{"name":"Intersection_64"},{"name":"Intersection_51","weight":42}],[{"name":"Intersection_65"},{"name":"Intersection_61","weight":28}],[{"name":"Intersection_65"},{"name":"Intersection_55","weight":18}],[{"name":"Intersection_66"},{"name":"Intersection_52","weight":36}]] \ No newline at end of file diff --git a/test/unit/data-structures/graph/salty-vertexes.json b/test/unit/data-structures/graph/salty-vertexes.json new file mode 100644 index 0000000..50035b3 --- /dev/null +++ b/test/unit/data-structures/graph/salty-vertexes.json @@ -0,0 +1 @@ +[{"name":"Intersection_1"},{"name":"Intersection_2"},{"name":"Intersection_3"},{"name":"Intersection_4"},{"name":"Intersection_5"},{"name":"Intersection_6"},{"name":"Intersection_7"},{"name":"Intersection_8"},{"name":"Intersection_9"},{"name":"Intersection_10"},{"name":"Intersection_11"},{"name":"Intersection_12"},{"name":"Intersection_13"},{"name":"Intersection_14"},{"name":"Intersection_15"},{"name":"Intersection_16"},{"name":"Intersection_17"},{"name":"Intersection_18"},{"name":"Intersection_19"},{"name":"Intersection_20"},{"name":"Intersection_21"},{"name":"Intersection_22"},{"name":"Intersection_23"},{"name":"Intersection_24"},{"name":"Intersection_25"},{"name":"Intersection_26"},{"name":"Intersection_27"},{"name":"Intersection_28"},{"name":"Intersection_29"},{"name":"Intersection_30"},{"name":"Intersection_31"},{"name":"Intersection_32"},{"name":"Intersection_33"},{"name":"Intersection_34"},{"name":"Intersection_35"},{"name":"Intersection_36"},{"name":"Intersection_37"},{"name":"Intersection_38"},{"name":"Intersection_39"},{"name":"Intersection_40"},{"name":"Intersection_41"},{"name":"Intersection_42"},{"name":"Intersection_43"},{"name":"Intersection_44"},{"name":"Intersection_45"},{"name":"Intersection_46"},{"name":"Intersection_47"},{"name":"Intersection_48"},{"name":"Intersection_49"},{"name":"Intersection_50"},{"name":"Intersection_51"},{"name":"Intersection_52"},{"name":"Intersection_53"},{"name":"Intersection_54"},{"name":"Intersection_55"},{"name":"Intersection_56"},{"name":"Intersection_57"},{"name":"Intersection_58"},{"name":"Intersection_59"},{"name":"Intersection_60"},{"name":"Intersection_61"},{"name":"Intersection_62"},{"name":"Intersection_63"},{"name":"Intersection_64"},{"name":"Intersection_65"},{"name":"Intersection_66"}] \ No newline at end of file diff --git a/test/unit/data-structures/graph/undirected-graph.test.ts b/test/unit/data-structures/graph/undirected-graph.test.ts index b4f827f..fce010f 100644 --- a/test/unit/data-structures/graph/undirected-graph.test.ts +++ b/test/unit/data-structures/graph/undirected-graph.test.ts @@ -1,6 +1,6 @@ import {UndirectedEdge, UndirectedGraph, UndirectedVertex} from '../../../../src'; -import saltyVertexes from './salty-vertexes.json'; -import saltyEdges from './salty-edges.json'; +import saltyVertexes from './salty-vertexes.json'; +import saltyEdges from './salty-edges.json'; describe('UndirectedGraph Operation Test', () => { let graph: UndirectedGraph; @@ -151,18 +151,17 @@ describe('UndirectedGraph', () => { it('xxx', () => { // const start = performance.now(); - const graph = new UndirectedGraph<{ name: string }, number >() + const graph = new UndirectedGraph<{name: string}, number>(); for (const v of saltyVertexes) { graph.addVertex(v.name, v); } for (const e of saltyEdges) { - const [s,d] = e; - graph.addEdge( s.name, d.name, d.weight ); + const [s, d] = e; + graph.addEdge(s.name, d.name, d.weight); } // const result = graph.getAllPathsBetween('Intersection_1','Intersection_5'); // console.log('---xxx', performance.now() - start, result) // const result = graph.dijkstra('Intersection_1','Intersection_5', true, true); // console.log('---xxx', performance.now() - start, result) - - }) + }); });