From d71a1eb2bcc499f32394b4979ac690ecc963c3c3 Mon Sep 17 00:00:00 2001 From: Revone Date: Tue, 14 Nov 2023 21:41:20 +0800 Subject: [PATCH] fix: Removed unused enums. style: Beautified text color output of the performance report generator console. --- CHANGELOG.md | 2 +- README.md | 30 ++--- package-lock.json | 51 ++++---- package.json | 14 ++- .../data-structures/graph/directed-graph.ts | 6 - test/integration/all-in-one.ts | 110 ++++++++++++++++++ test/performance/reportor.ts | 4 +- .../binary-tree/rb-tree.test.ts | 4 +- 8 files changed, 164 insertions(+), 57 deletions(-) create mode 100644 test/integration/all-in-one.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b6e3a5..cdca002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ All notable changes to this project will be documented in this file. - [Semantic Versioning](https://semver.org/spec/v2.0.0.html) - [`auto-changelog`](https://github.com/CookPete/auto-changelog) -## [v1.43.3](https://github.com/zrwusa/data-structure-typed/compare/v1.35.0...main) (upcoming) +## [v1.44.0](https://github.com/zrwusa/data-structure-typed/compare/v1.35.0...main) (upcoming) ### Changes diff --git a/README.md b/README.md index 17d2ba0..dc4a89f 100644 --- a/README.md +++ b/README.md @@ -735,49 +735,49 @@ optimal approach to data structure design. [//]: # (No deletion!!! Start of Replace Section)
avl-tree
-
test nametime taken (ms)executions per secsample deviation
10,000 add randomly35.3828.260.00
10,000 add & delete randomly80.6512.400.01
10,000 addMany46.4521.539.97e-4
10,000 get31.5931.660.00
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly33.2330.090.00
10,000 add & delete randomly71.0714.070.00
10,000 addMany40.8924.454.42e-4
10,000 get28.0035.723.66e-4
binary-tree
-
test nametime taken (ms)executions per secsample deviation
1,000 add randomly13.0176.847.71e-4
1,000 add & delete randomly16.8259.460.00
1,000 addMany10.4695.622.13e-4
1,000 get18.4454.222.49e-4
1,000 dfs163.316.120.01
1,000 bfs58.0717.220.00
1,000 morris273.113.660.00
+
test nametime taken (ms)executions per secsample deviation
1,000 add randomly12.4080.641.37e-4
1,000 add & delete randomly16.1361.988.55e-4
1,000 addMany10.3496.681.34e-4
1,000 get18.6553.638.17e-4
1,000 dfs155.936.416.00e-4
1,000 bfs56.0817.832.98e-4
1,000 morris257.053.890.00
bst
-
test nametime taken (ms)executions per secsample deviation
10,000 add randomly33.4429.915.09e-4
10,000 add & delete randomly76.0313.150.00
10,000 addMany32.2631.000.00
10,000 get32.7530.530.01
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly28.5335.059.51e-4
10,000 add & delete randomly66.8914.959.60e-4
10,000 addMany30.9432.320.01
10,000 get28.1835.484.43e-4
rb-tree
-
test nametime taken (ms)executions per secsample deviation
100,000 add99.2710.070.01
100,000 add & delete randomly233.224.290.01
100,000 getNode148.416.740.00
+
test nametime taken (ms)executions per secsample deviation
100,000 add87.9311.370.00
100,000 add & delete randomly218.684.570.01
100,000 getNode99.7410.037.04e-4
directed-graph
-
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.119381.523.21e-6
1,000 addEdge6.36157.147.19e-4
1,000 getVertex0.052.09e+42.72e-6
1,000 getEdge24.6640.550.00
tarjan219.654.550.01
tarjan all239.684.170.04
topologicalSort216.144.630.07
+
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.119305.581.07e-5
1,000 addEdge7.66130.500.00
1,000 getVertex0.052.03e+44.70e-6
1,000 getEdge27.2236.740.01
tarjan186.495.360.01
tarjan all190.285.260.00
topologicalSort157.126.360.00
hash-map
-
test nametime taken (ms)executions per secsample deviation
10,000 set19.5051.270.01
10,000 set & get38.2026.180.01
+
test nametime taken (ms)executions per secsample deviation
10,000 set16.0762.243.45e-4
10,000 set & get34.8328.715.83e-4
heap
-
test nametime taken (ms)executions per secsample deviation
10,000 add & pop4.86205.697.04e-4
10,000 fib add & pop386.502.590.03
+
test nametime taken (ms)executions per secsample deviation
10,000 add & pop4.63215.974.24e-5
10,000 fib add & pop380.192.630.07
doubly-linked-list
-
test nametime taken (ms)executions per secsample deviation
1,000,000 unshift243.464.110.05
1,000,000 unshift & shift178.495.600.02
1,000,000 insertBefore326.383.060.07
+
test nametime taken (ms)executions per secsample deviation
1,000,000 unshift218.864.570.07
1,000,000 unshift & shift171.505.830.02
1,000,000 insertBefore328.273.050.06
singly-linked-list
-
test nametime taken (ms)executions per secsample deviation
10,000 push & pop232.854.290.01
10,000 insertBefore255.903.910.01
+
test nametime taken (ms)executions per secsample deviation
10,000 push & pop224.784.450.01
10,000 insertBefore253.693.940.02
max-priority-queue
-
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll11.8884.150.00
+
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll11.9883.500.00
priority-queue
-
test nametime taken (ms)executions per secsample deviation
10,000 add & pop12.6079.351.40e-4
+
test nametime taken (ms)executions per secsample deviation
10,000 add & pop12.6579.048.45e-4
deque
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push226.324.420.03
1,000,000 shift26.0938.330.00
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push231.264.320.04
1,000,000 shift28.0535.650.01
queue
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push45.4522.000.01
1,000,000 push & shift82.8712.070.00
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push48.0120.830.02
1,000,000 push & shift83.3412.000.00
stack
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push43.9522.750.01
1,000,000 push & pop50.9119.640.00
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push43.2423.130.01
1,000,000 push & pop57.9617.250.02
trie
-
test nametime taken (ms)executions per secsample deviation
100,000 push50.2019.920.00
100,000 getWords110.089.080.01
+
test nametime taken (ms)executions per secsample deviation
100,000 push58.1217.210.02
100,000 getWords144.396.930.13
[//]: # (No deletion!!! End of Replace Section) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4a089f0..6449c6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "data-structure-typed", - "version": "1.43.3", + "version": "1.44.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "data-structure-typed", - "version": "1.43.3", + "version": "1.44.0", "license": "MIT", "devDependencies": { "@swc/core": "^1.3.96", @@ -17,10 +17,11 @@ "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "auto-changelog": "^2.4.0", - "avl-tree-typed": "^1.42.5", + "avl-tree-typed": "^1.44.0", "benchmark": "^2.1.4", - "binary-tree-typed": "^1.42.5", - "bst-typed": "^1.42.5", + "binary-tree-typed": "^1.44.0", + "bst-typed": "^1.44.0", + "data-structure-typed": "^1.44.0", "dependency-cruiser": "^14.1.0", "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", @@ -28,7 +29,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.28.1", "fast-glob": "^3.3.1", - "heap-typed": "^1.42.5", + "heap-typed": "^1.44.0", "istanbul-badges-readme": "^1.8.5", "jest": "^29.7.0", "js-sdsl": "^4.4.2", @@ -3001,12 +3002,12 @@ } }, "node_modules/avl-tree-typed": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/avl-tree-typed/-/avl-tree-typed-1.43.1.tgz", - "integrity": "sha512-XeCTZGn4Wo5HjO1gwqtZ80Q3nBn2I2PB7WVemeyhHAGzvXCzjDOvtzFzHUHw/VebIQEXYacIzPqyjCZwSRH/aQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/avl-tree-typed/-/avl-tree-typed-1.44.0.tgz", + "integrity": "sha512-XaKEv9Y6IR7vCy2n5NPOczPnuPPny801MGQIN9supoz1yku7wfN99JBtZI2VN+F60eNo302pTEelgDV8AYiV1Q==", "dev": true, "dependencies": { - "data-structure-typed": "^1.43.1" + "data-structure-typed": "^1.44.0" } }, "node_modules/babel-jest": { @@ -3200,12 +3201,12 @@ } }, "node_modules/binary-tree-typed": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/binary-tree-typed/-/binary-tree-typed-1.43.1.tgz", - "integrity": "sha512-3j3QX1vuk0WNfYLgC+yeYdAn5vRT/kO/8+OS94B924PCVPRNddOyO3rSVl0aJq/N0ihUR8z0brQnR/HC9Mo09A==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/binary-tree-typed/-/binary-tree-typed-1.44.0.tgz", + "integrity": "sha512-f+g6X8prsdlzx++ac44zER0QtrdnL6I7hIgHBR1JuLOve4Hcrb5fkNAXtQwA4vOtmghtGYcGl4IOlhtyRMuF/w==", "dev": true, "dependencies": { - "data-structure-typed": "^1.43.1" + "data-structure-typed": "^1.44.0" } }, "node_modules/brace-expansion": { @@ -3284,12 +3285,12 @@ } }, "node_modules/bst-typed": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/bst-typed/-/bst-typed-1.43.1.tgz", - "integrity": "sha512-IeSQ8a6z1A8C0csPb4pqQOQNgQi1NnH/GfLL4Nx2aSA1NvF25nXK+f61Vz+t3a4pzcgmBjI+wYMZNYmSLrZ3NQ==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/bst-typed/-/bst-typed-1.44.0.tgz", + "integrity": "sha512-PQ75B1aWXE5fuenMZ3lAIVV+Ek/7OJp2kJty0sGlVvtR0MENIz8MnT0tNt+3XzHjbhml0gcvh5KNaqCKyQIdSQ==", "dev": true, "dependencies": { - "data-structure-typed": "^1.43.1" + "data-structure-typed": "^1.44.0" } }, "node_modules/buffer-from": { @@ -3692,9 +3693,9 @@ } }, "node_modules/data-structure-typed": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/data-structure-typed/-/data-structure-typed-1.43.1.tgz", - "integrity": "sha512-STWriSmxUv78EYJiBtyPPDzEX1xfSzOvZFamUorHxEoWw1m5Sl0TESsC2biNIJ/GXZWhhJG7Tef6hseXWZ6GVw==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/data-structure-typed/-/data-structure-typed-1.44.0.tgz", + "integrity": "sha512-mS/JWpl/evwqnWtIRmGqvwHR6NEbzuAp3AkK8keq1J45vctxryX8YKTS56u5JHE2MNTZc+5Tt+H5ltmLfz18SQ==", "dev": true }, "node_modules/debug": { @@ -5059,12 +5060,12 @@ } }, "node_modules/heap-typed": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/heap-typed/-/heap-typed-1.43.1.tgz", - "integrity": "sha512-nKRcoir8MJF4qJFp6na1DZNWBl2wi5f5BM/qlrvkMina9Dxbphwrl7pPtlcJ3ohdl3lXTjZNrCU7dWntH4djaA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/heap-typed/-/heap-typed-1.44.0.tgz", + "integrity": "sha512-QKmfpcZV3Fc0X5uopTejcaElLvEZe/D7ZdCdeAQdQnJpLGUD+gsVWNJeHKl4ek2P+1w/PNkbOgv6RJ4Cr6MM6w==", "dev": true, "dependencies": { - "data-structure-typed": "^1.43.1" + "data-structure-typed": "^1.44.0" } }, "node_modules/html-escaper": { diff --git a/package.json b/package.json index 6ecaa9f..317f722 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "data-structure-typed", - "version": "1.43.3", + "version": "1.44.1", "description": "Data Structures of Javascript & TypeScript. Binary Tree, BST, Graph, Heap, Priority Queue, Linked List, Queue, Deque, Stack, AVL Tree, Tree Multiset, Trie, Directed Graph, Undirected Graph, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue.", "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", @@ -20,6 +20,7 @@ "build:umd": "tsup", "build:docs": "typedoc --out docs ./src", "test:unit": "jest --runInBand", + "test": "npm run test:unit", "test:integration": "npm run update:subs && jest --config jest.integration.config.js", "test:perf": "ts-node test/performance/reportor.ts", "check": "tsc --noEmit", @@ -32,7 +33,7 @@ "format:test": "prettier --write 'test/**/*.{js,ts}'", "format": "npm run format:src && npm run format:test", "ci": "env && git fetch --tags && npm run check && npm run lint && npm run build && npm run test:unit && npm run changelog", - "update:subs": "npm i avl-tree-typed binary-tree-typed bst-typed heap-typed --save-dev", + "update:subs": "npm i avl-tree-typed binary-tree-typed bst-typed heap-typed data-structure-typed --save-dev", "install:all-subs": "npm i avl-tree-typed binary-tree-typed bst-typed deque-typed directed-graph-typed doubly-linked-list-typed graph-typed heap-typed linked-list-typed max-heap-typed max-priority-queue-typed min-heap-typed min-priority-queue-typed priority-queue-typed singly-linked-list-typed stack-typed tree-multimap-typed trie-typed undirected-graph-typed queue-typed --save-dev", "changelog": "auto-changelog", "coverage:badge": "istanbul-badges-readme", @@ -63,10 +64,11 @@ "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "auto-changelog": "^2.4.0", - "avl-tree-typed": "^1.42.5", + "avl-tree-typed": "^1.44.0", "benchmark": "^2.1.4", - "binary-tree-typed": "^1.42.5", - "bst-typed": "^1.42.5", + "binary-tree-typed": "^1.44.0", + "bst-typed": "^1.44.0", + "data-structure-typed": "^1.44.0", "dependency-cruiser": "^14.1.0", "eslint": "^8.50.0", "eslint-config-prettier": "^9.0.0", @@ -74,7 +76,7 @@ "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.28.1", "fast-glob": "^3.3.1", - "heap-typed": "^1.42.5", + "heap-typed": "^1.44.0", "istanbul-badges-readme": "^1.8.5", "jest": "^29.7.0", "js-sdsl": "^4.4.2", diff --git a/src/types/data-structures/graph/directed-graph.ts b/src/types/data-structures/graph/directed-graph.ts index 45add08..e4fc9b6 100644 --- a/src/types/data-structures/graph/directed-graph.ts +++ b/src/types/data-structures/graph/directed-graph.ts @@ -1,8 +1,2 @@ // 0 means unknown, 1 means visiting, 2 means visited; export type TopologicalStatus = 0 | 1 | 2; - -export enum TopologicalProperty { - VAL = 'VAL', - NODE = 'NODE', - ID = 'ID' -} diff --git a/test/integration/all-in-one.ts b/test/integration/all-in-one.ts new file mode 100644 index 0000000..313c16b --- /dev/null +++ b/test/integration/all-in-one.ts @@ -0,0 +1,110 @@ +import {AVLTree, CP} from 'data-structure-typed'; + +describe('AVL Tree Test from data-structure-typed', () => { + it('should perform various operations on a AVL Tree from data-structure-typed', () => { + const keys = [11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]; + const tree = new AVLTree(); + + for (const i of keys) tree.add(i, i); + + const node6 = tree.get(6); + + expect(node6 && tree.getHeight(node6)).toBe(3); + expect(node6 && tree.getDepth(node6)).toBe(1); + + const getValueById = tree.get(10); + expect(getValueById).toBe(10); + + const getMinNodeByRoot = tree.getLeftMost(); + expect(getMinNodeByRoot?.key).toBe(1); + + const node15 = tree.getNode(15); + const getMinNodeBySpecificNode = node15 && tree.getLeftMost(node15); + expect(getMinNodeBySpecificNode?.key).toBe(12); + + let subTreeSum = 0; + node15 && tree.subTreeTraverse(node => (subTreeSum += node.key), 15); + expect(subTreeSum).toBe(70); + + let lesserSum = 0; + tree.lesserOrGreaterTraverse(node => (lesserSum += node.key), CP.lt, 10); + expect(lesserSum).toBe(45); + + // node15 has type problem. After the uniform design, the generics of containers (DirectedGraph, BST) are based on the type of value. However, this design has a drawback: when I attempt to inherit from the Vertex or BSTNode classes, the types of the results obtained by all methods are those of the parent class. + expect(node15?.value).toBe(15); + + const dfs = tree.dfs(node => node, 'in'); + expect(dfs[0].key).toBe(1); + expect(dfs[dfs.length - 1].key).toBe(16); + + tree.perfectlyBalance(); + const bfs = tree.bfs(node => node); + expect(tree.isPerfectlyBalanced()).toBe(true); + expect(bfs[0].key).toBe(8); + expect(bfs[bfs.length - 1].key).toBe(16); + + expect(tree.delete(11)[0].deleted?.key).toBe(11); + expect(tree.isAVLBalanced()).toBe(true); + expect(node15 && tree.getHeight(node15)).toBe(2); + + expect(tree.delete(1)[0].deleted?.key).toBe(1); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(4); + + expect(tree.delete(4)[0].deleted?.key).toBe(4); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(4); + + expect(tree.delete(10)[0].deleted?.key).toBe(10); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(15)[0].deleted?.key).toBe(15); + expect(tree.isAVLBalanced()).toBe(true); + + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(5)[0].deleted?.key).toBe(5); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(13)[0].deleted?.key).toBe(13); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(3)[0].deleted?.key).toBe(3); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(8)[0].deleted?.key).toBe(8); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(3); + + expect(tree.delete(6)[0].deleted?.key).toBe(6); + expect(tree.delete(6).length).toBe(0); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(2); + + expect(tree.delete(7)[0].deleted?.key).toBe(7); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(2); + + expect(tree.delete(9)[0].deleted?.key).toBe(9); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(2); + expect(tree.delete(14)[0].deleted?.key).toBe(14); + expect(tree.isAVLBalanced()).toBe(true); + expect(tree.getHeight()).toBe(1); + + expect(tree.isAVLBalanced()).toBe(true); + const lastBFSIds = tree.bfs(); + expect(lastBFSIds[0]).toBe(12); + expect(lastBFSIds[1]).toBe(2); + expect(lastBFSIds[2]).toBe(16); + + const lastBFSNodes = tree.bfs(node => node); + expect(lastBFSNodes[0].key).toBe(12); + expect(lastBFSNodes[1].key).toBe(2); + expect(lastBFSNodes[2].key).toBe(16); + }); +}); diff --git a/test/performance/reportor.ts b/test/performance/reportor.ts index 628e1b0..6d2f25e 100644 --- a/test/performance/reportor.ts +++ b/test/performance/reportor.ts @@ -107,7 +107,7 @@ const composeReport = () => { htmlTables // New content to be inserted ); fs.writeFileSync(htmlFilePath, html); - console.log(`Performance ${BOLD}${GREEN}report${END} file generated`); + console.log(`Performance ${BOLD}${GREEN}report${END} file generated in ${BOLD}${GREEN}${reportDistPath}${END}`); }; function replaceMarkdownContent(startMarker: string, endMarker: string, newText: string) { @@ -135,7 +135,7 @@ function replaceMarkdownContent(startMarker: string, endMarker: string, newText: if (err) { console.error(`Unable to write to ${filePath}:`, err); } else { - console.log(`The content has been successfully replaced in ${filePath}!`); + console.log(`The content has been successfully replaced in ${BOLD}${GREEN}${filePath}!${END}`); } }); }); 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 27884d4..96c29ed 100644 --- a/test/unit/data-structures/binary-tree/rb-tree.test.ts +++ b/test/unit/data-structures/binary-tree/rb-tree.test.ts @@ -478,13 +478,13 @@ describe('RedBlackTree', () => { for (let i = 0; i < arr.length; i++) { tree.add(arr[i]); } - console.log(performance.now() - tS); + isDebug && console.log(performance.now() - tS); const cS = performance.now(); for (let i = 0; i < arr.length; i++) { competitor.setElement(arr[i], arr[i]); } - console.log(performance.now() - cS); + isDebug && console.log(performance.now() - cS); }); });