diff --git a/README.md b/README.md index 13ffe3d..13fb309 100644 --- a/README.md +++ b/README.md @@ -9,21 +9,21 @@ [//]: # (![npm bundle size](https://img.shields.io/bundlephobia/min/data-structure-typed)) -## Why -

English | 简体中文

+## Why + Do you envy C++ with [STL]() (std::), Python with [collections](), and Java with [java.util]() ? Well, no need to envy anymore! JavaScript and TypeScript now have [data-structure-typed]().**`Benchmark`** compared with C++ STL. **`API standards`** aligned with ES6 and Java. **`Usability`** is comparable to Python -### We provide data structures that are not available in JavaScript/TypeScript +### We provide data structures that are not available in JS/TS Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undirected Graph, BST, AVL Tree, Priority Queue, Queue, Tree Multiset, Linked List. -### Performance superior to native JavaScript/TypeScript +### Performance superior to native JS/TS **`Queue vs. native Array, 100,000 scale`** @@ -65,6 +65,30 @@ Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undi
+**`HashMap vs. native Map/Set, 100,000 scale`** + + + + + + + + + + + + + + + + + + + + + +
MethodTime Taken (ms)
HashMap 1,000,000 set122.51
Native Map 1,000,000 set223.80
Native Set 1,000,000 add185.06
+ [//]: # (![Branches](https://img.shields.io/badge/branches-55.47%25-red.svg?style=flat)) [//]: # (![Statements](https://img.shields.io/badge/statements-67%25-red.svg?style=flat)) @@ -814,52 +838,52 @@ avl2.print(); [//]: # (No deletion!!! Start of Replace Section)
avl-tree
-
test nametime taken (ms)executions per secsample deviation
10,000 add randomly72.4813.800.03
10,000 add & delete randomly144.146.940.03
10,000 addMany69.7114.350.02
10,000 get54.2118.450.01
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly51.2219.520.00
10,000 add & delete randomly110.409.060.00
10,000 addMany58.3917.136.35e-4
10,000 get50.5919.773.87e-4
binary-tree
-
test nametime taken (ms)executions per secsample deviation
1,000 add randomly15.8463.140.00
1,000 add & delete randomly24.6240.620.00
1,000 addMany17.8556.010.00
1,000 get20.8348.000.00
1,000 has20.7848.130.00
1,000 dfs186.065.370.02
1,000 bfs66.5815.020.02
1,000 morris298.233.350.02
+
test nametime taken (ms)executions per secsample deviation
1,000 add randomly13.8372.291.19e-4
1,000 add & delete randomly21.4946.542.34e-4
1,000 addMany15.9362.781.27e-4
1,000 get18.1954.981.79e-4
1,000 has18.2054.931.71e-4
1,000 dfs161.796.187.45e-4
1,000 bfs56.6817.644.77e-4
1,000 morris262.643.810.00
bst
-
test nametime taken (ms)executions per secsample deviation
10,000 add randomly55.0418.170.01
10,000 add & delete randomly129.857.700.01
10,000 addMany50.4019.840.01
10,000 get63.3915.780.01
+
test nametime taken (ms)executions per secsample deviation
10,000 add randomly51.5119.418.70e-4
10,000 add & delete randomly114.098.769.66e-4
10,000 addMany47.8620.902.77e-4
10,000 get51.9319.266.56e-4
rb-tree
-
test nametime taken (ms)executions per secsample deviation
100,000 add113.258.830.02
100,000 add & delete randomly305.283.280.03
100,000 getNode73.2013.660.03
100,000 add & iterator159.806.260.06
+
test nametime taken (ms)executions per secsample deviation
100,000 add86.6311.540.00
100,000 add & delete randomly218.884.570.01
100,000 getNode261.163.830.00
100,000 add & iterator117.648.500.00
comparison
-
test nametime taken (ms)executions per secsample deviation
SRC PQ 10,000 add0.175872.024.08e-5
CJS PQ 10,000 add0.204961.221.14e-4
MJS PQ 10,000 add0.741351.472.98e-4
SRC PQ 10,000 add & pop4.62216.490.00
CJS PQ 10,000 add & pop4.36229.400.00
MJS PQ 10,000 add & pop3.92255.230.00
+
test nametime taken (ms)executions per secsample deviation
SRC PQ 10,000 add0.146949.201.53e-6
CJS PQ 10,000 add0.146943.681.74e-6
MJS PQ 10,000 add0.571758.406.26e-6
SRC PQ 10,000 add & pop3.40293.943.50e-5
CJS PQ 10,000 add & pop3.42292.695.34e-5
MJS PQ 10,000 add & pop3.30303.013.97e-5
directed-graph
-
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.128557.702.46e-5
1,000 addEdge7.37135.700.00
1,000 getVertex0.051.91e+41.12e-5
1,000 getEdge22.7543.960.00
tarjan196.985.080.01
tarjan all217.254.600.03
topologicalSort177.305.640.02
+
test nametime taken (ms)executions per secsample deviation
1,000 addVertex0.109930.741.11e-6
1,000 addEdge6.13163.191.84e-4
1,000 getVertex0.052.15e+45.00e-7
1,000 getEdge23.5742.430.00
tarjan252.053.970.03
tarjan all221.154.520.00
topologicalSort181.075.520.00
hash-map
-
test nametime taken (ms)executions per secsample deviation
1,000,000 set153.746.500.07
1,000,000 Map set330.023.030.16
1,000,000 Set add258.643.870.06
1,000,000 set & get138.807.200.06
1,000,000 Map set & get352.632.840.05
1,000,000 Set add & has217.974.590.02
1,000,000 ObjKey set & get414.872.410.06
1,000,000 Map ObjKey set & get389.172.570.07
1,000,000 Set ObjKey add & has352.672.840.03
+
test nametime taken (ms)executions per secsample deviation
1,000,000 set122.908.140.04
Native Map 1,000,000 set215.974.630.02
Native Set 1,000,000 add179.115.580.02
1,000,000 set & get123.108.120.04
Native Map 1,000,000 set & get271.803.680.02
Native Set 1,000,000 add & has176.655.660.02
1,000,000 ObjKey set & get341.972.920.07
Native Map 1,000,000 ObjKey set & get316.863.160.04
Native Set 1,000,000 ObjKey add & has285.143.510.06
heap
-
test nametime taken (ms)executions per secsample deviation
100,000 add & pop90.6711.030.02
100,000 add & dfs40.3024.810.01
10,000 fib add & pop414.942.410.02
+
test nametime taken (ms)executions per secsample deviation
100,000 add & pop80.3712.440.00
100,000 add & dfs36.2027.630.00
10,000 fib add & pop362.242.760.00
doubly-linked-list
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push290.623.440.10
1,000,000 unshift253.883.940.10
1,000,000 unshift & shift259.653.850.14
1,000,000 insertBefore463.162.160.10
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push216.094.630.06
1,000,000 unshift220.684.530.02
1,000,000 unshift & shift172.935.780.04
1,000,000 insertBefore332.253.010.08
singly-linked-list
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push & shift250.274.000.08
10,000 push & pop261.133.830.03
10,000 insertBefore282.463.540.02
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push & shift222.994.480.10
10,000 push & pop214.824.660.01
10,000 insertBefore251.243.980.01
max-priority-queue
-
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll10.4995.290.00
+
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll8.91112.191.57e-4
priority-queue
-
test nametime taken (ms)executions per secsample deviation
100,000 add & pop110.639.040.01
+
test nametime taken (ms)executions per secsample deviation
100,000 add & pop101.709.830.00
deque
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push15.8962.920.00
1,000,000 push & pop26.4537.810.01
1,000,000 push & shift27.5236.340.00
1,000,000 unshift & shift28.8234.700.01
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push13.8072.471.56e-4
1,000,000 push & pop22.7244.022.02e-4
100,000 push & shift2.35425.675.80e-5
Native Array 100,000 push & shift2511.140.400.36
100,000 unshift & shift2.23447.893.30e-4
Native Array 100,000 unshift & shift4140.230.240.33
queue
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push51.2119.530.02
1,000,000 push & shift105.569.470.05
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push43.6522.910.01
100,000 push & shift4.99200.289.54e-5
Native Array 100,000 push & shift2335.630.430.33
Native Array 100,000 push & pop4.39227.810.00
stack
-
test nametime taken (ms)executions per secsample deviation
1,000,000 push43.5722.950.01
1,000,000 push & pop55.1818.120.01
+
test nametime taken (ms)executions per secsample deviation
1,000,000 push45.3822.040.01
1,000,000 push & pop49.5220.190.01
trie
-
test nametime taken (ms)executions per secsample deviation
100,000 push54.0818.490.01
100,000 getWords77.7712.860.02
+
test nametime taken (ms)executions per secsample deviation
100,000 push42.9923.260.00
100,000 getWords89.7811.140.00
[//]: # (No deletion!!! End of Replace Section) diff --git a/README_zh-CN.md b/README_zh-CN.md index 429384b..f5f4140 100644 --- a/README_zh-CN.md +++ b/README_zh-CN.md @@ -9,10 +9,10 @@ [//]: # (![npm bundle size](https://img.shields.io/bundlephobia/min/data-structure-typed)) -## 为什么 -

English | 简体中文

+## 为什么 + JavaScript和TypeScript的数据结构。 是否羡慕C++ [STL]() (std::)、Python的 [collections]() 和Java的 [java.util]()? @@ -22,12 +22,12 @@ JavaScript和TypeScript的数据结构。 **`基准测试`** 与C++ STL相比。**`API 标准`** 与ES6和Java对齐。**`易用性`** 可与Python媲美。 -### 提供了JavaScript/TypeScript中没有的数据结构 +### 提供了JS/TS中没有的数据结构 Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undirected Graph, BST, AVL Tree, Priority Queue, Queue, Tree Multiset, Linked List. -### 性能超越原生JavaScript/TypeScript +### 性能超越原生JS/TS **`Queue和原生Array, 在100,000数据规模下性能对比`** @@ -69,6 +69,31 @@ Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undi
+ +**`HashMap和原生Map/Set在100,000数据规模下的性能对比`** + + + + + + + + + + + + + + + + + + + + + +
MethodTime Taken (ms)
HashMap 1,000,000 set122.51
Native Map 1,000,000 set223.80
Native Set 1,000,000 add185.06
+ [//]: # (![Branches](https://img.shields.io/badge/branches-55.47%25-red.svg?style=flat)) [//]: # (![Statements](https://img.shields.io/badge/statements-67%25-red.svg?style=flat)) diff --git a/package.json b/package.json index 8e01109..9c3ce53 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "data-structure-typed", "version": "1.48.6", - "description": "Data Structures of Javascript & TypeScript. Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, HashMap, Directed Graph, Undirected Graph, Binary Search Tree(BST), AVL Tree, Priority Queue, Graph, Queue, Tree Multiset, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue, Stack. Benchmark compared with C++ STL. API aligned with ES6 and Java. Usability is comparable to Python", + "description": "Data Structures of Javascript & TypeScript. Heap, Binary Tree, Red Black Tree, Linked List, Deque, Trie, HashMap, Directed Graph, Undirected Graph, Binary Search Tree(BST), AVL Tree, Priority Queue, Graph, Queue, Tree Multiset, Singly Linked List, Doubly Linked List, Max Heap, Max Priority Queue, Min Heap, Min Priority Queue, Stack. Benchmark compared with C++ STL. API aligned with ES6 and Java. Usability is comparable to Python", "main": "dist/cjs/index.js", "module": "dist/mjs/index.js", "types": "dist/mjs/index.d.ts", 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 0b6f89e..d8f69f6 100644 --- a/test/performance/data-structures/binary-tree/rb-tree.test.ts +++ b/test/performance/data-structures/binary-tree/rb-tree.test.ts @@ -18,7 +18,7 @@ suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add`, () => { }); if (isCompetitor) { - suite.add(`${HUNDRED_THOUSAND.toLocaleString()} CPT add`, () => { + suite.add(`CPT ${HUNDRED_THOUSAND.toLocaleString()} add`, () => { for (let i = 0; i < arr.length; i++) { cOrderedMap.setElement(arr[i], arr[i]); } diff --git a/test/performance/data-structures/hash/hash-map.test.ts b/test/performance/data-structures/hash/hash-map.test.ts index 40a35dd..473b9e5 100644 --- a/test/performance/data-structures/hash/hash-map.test.ts +++ b/test/performance/data-structures/hash/hash-map.test.ts @@ -16,7 +16,7 @@ suite.add(`${MILLION.toLocaleString()} set`, () => { }); if (isCompetitor) { - suite.add(`${MILLION.toLocaleString()} CPT set`, () => { + suite.add(`CPT ${MILLION.toLocaleString()} set`, () => { const hm = new CHashMap(); for (let i = 0; i < MILLION; i++) { @@ -25,13 +25,13 @@ if (isCompetitor) { }); } -suite.add(`${MILLION.toLocaleString()} Map set`, () => { +suite.add(`Native Map ${MILLION.toLocaleString()} set`, () => { const hm = new Map(); for (let i = 0; i < MILLION; i++) hm.set(i, i); }); -suite.add(`${MILLION.toLocaleString()} Set add`, () => { +suite.add(`Native Set ${MILLION.toLocaleString()} add`, () => { const hs = new Set(); for (let i = 0; i < MILLION; i++) hs.add(i); @@ -49,7 +49,7 @@ suite.add(`${MILLION.toLocaleString()} set & get`, () => { }); if (isCompetitor) { - suite.add(`${MILLION.toLocaleString()} CPT set & get`, () => { + suite.add(`CPT ${MILLION.toLocaleString()} set & get`, () => { const hm = new CHashMap(); for (let i = 0; i < MILLION; i++) { @@ -61,7 +61,7 @@ if (isCompetitor) { }); } -suite.add(`${MILLION.toLocaleString()} Map set & get`, () => { +suite.add(`Native Map ${MILLION.toLocaleString()} set & get`, () => { const hm = new Map(); for (let i = 0; i < MILLION; i++) { @@ -72,7 +72,7 @@ suite.add(`${MILLION.toLocaleString()} Map set & get`, () => { } }); -suite.add(`${MILLION.toLocaleString()} Set add & has`, () => { +suite.add(`Native Set ${MILLION.toLocaleString()} add & has`, () => { const hs = new Set(); for (let i = 0; i < MILLION; i++) hs.add(i); @@ -94,7 +94,7 @@ suite.add(`${MILLION.toLocaleString()} ObjKey set & get`, () => { } }); -suite.add(`${MILLION.toLocaleString()} Map ObjKey set & get`, () => { +suite.add(`Native Map ${MILLION.toLocaleString()} ObjKey set & get`, () => { const hm = new Map<[number, number], number>(); const objs: [number, number][] = []; for (let i = 0; i < MILLION; i++) { @@ -107,7 +107,7 @@ suite.add(`${MILLION.toLocaleString()} Map ObjKey set & get`, () => { } }); -suite.add(`${MILLION.toLocaleString()} Set ObjKey add & has`, () => { +suite.add(`Native Set ${MILLION.toLocaleString()} ObjKey add & has`, () => { const hs = new Set<[number, number]>(); const objs: [number, number][] = []; for (let i = 0; i < MILLION; i++) { 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 1472ad7..339e620 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 @@ -17,7 +17,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => { if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT push`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => { const list = new CLinkedList(); for (let i = 0; i < LINEAR; i++) { @@ -35,7 +35,7 @@ suite.add(`${LINEAR.toLocaleString()} unshift`, () => { }); if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT unshift`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} unshift`, () => { const list = new CLinkedList(); for (let i = 0; i < LINEAR; i++) { diff --git a/test/performance/data-structures/priority-queue/priority-queue.test.ts b/test/performance/data-structures/priority-queue/priority-queue.test.ts index ca2bdc7..6fe6154 100644 --- a/test/performance/data-structures/priority-queue/priority-queue.test.ts +++ b/test/performance/data-structures/priority-queue/priority-queue.test.ts @@ -19,7 +19,7 @@ suite.add(`${HUNDRED_THOUSAND.toLocaleString()} add & pop`, () => { } }); if (isCompetitor) { - suite.add(`${HUNDRED_THOUSAND.toLocaleString()} CPT add & pop`, () => { + suite.add(`CPT ${HUNDRED_THOUSAND.toLocaleString()} add & pop`, () => { const pq = new CPriorityQueue(); for (let i = 0; i < HUNDRED_THOUSAND; i++) { diff --git a/test/performance/data-structures/queue/deque.test.ts b/test/performance/data-structures/queue/deque.test.ts index ac701f3..588ab41 100644 --- a/test/performance/data-structures/queue/deque.test.ts +++ b/test/performance/data-structures/queue/deque.test.ts @@ -13,7 +13,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => { }); if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT push`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => { const _deque = new CDeque(); for (let i = 0; i < LINEAR; i++) _deque.pushBack(i); }); @@ -33,7 +33,7 @@ suite.add(`${LINEAR.toLocaleString()} push & pop`, () => { for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i); for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift(); }) - .add(`${HUNDRED_THOUSAND.toLocaleString()} Array push & shift`, () => { + .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => { const _deque = new Array(); for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.push(i); @@ -45,7 +45,7 @@ suite.add(`${LINEAR.toLocaleString()} push & pop`, () => { for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i); for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.shift(); }) - .add(`${HUNDRED_THOUSAND.toLocaleString()} Array unshift & shift`, () => { + .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} unshift & shift`, () => { const _deque = new Array(); for (let i = 0; i < HUNDRED_THOUSAND; i++) _deque.unshift(i); diff --git a/test/performance/data-structures/queue/queue.test.ts b/test/performance/data-structures/queue/queue.test.ts index b6cf5ef..c476fa8 100644 --- a/test/performance/data-structures/queue/queue.test.ts +++ b/test/performance/data-structures/queue/queue.test.ts @@ -15,7 +15,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => { } }); if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT push`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => { const queue = new CQueue(); for (let i = 0; i < LINEAR; i++) { @@ -33,7 +33,7 @@ suite.add(`${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => { queue.shift(); } }); -suite.add(`${HUNDRED_THOUSAND.toLocaleString()} Array push & shift`, () => { +suite.add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & shift`, () => { const arr = new Array(); for (let i = 0; i < HUNDRED_THOUSAND; i++) { @@ -43,7 +43,7 @@ suite.add(`${HUNDRED_THOUSAND.toLocaleString()} Array push & shift`, () => { arr.shift(); } }) - .add(`${HUNDRED_THOUSAND.toLocaleString()} Array push & pop`, () => { + .add(`Native Array ${HUNDRED_THOUSAND.toLocaleString()} push & pop`, () => { const arr = new Array(); for (let i = 0; i < HUNDRED_THOUSAND; i++) { diff --git a/test/performance/data-structures/stack/stack.test.ts b/test/performance/data-structures/stack/stack.test.ts index e4a2742..4731c21 100644 --- a/test/performance/data-structures/stack/stack.test.ts +++ b/test/performance/data-structures/stack/stack.test.ts @@ -15,7 +15,7 @@ suite.add(`${LINEAR.toLocaleString()} push`, () => { } }); if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT push`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} push`, () => { const queue = new CStack(); for (let i = 0; i < LINEAR; i++) { @@ -34,7 +34,7 @@ suite.add(`${LINEAR.toLocaleString()} push & pop`, () => { } }); if (isCompetitor) { - suite.add(`${LINEAR.toLocaleString()} CPT push & pop`, () => { + suite.add(`CPT ${LINEAR.toLocaleString()} push & pop`, () => { const queue = new CStack(); for (let i = 0; i < LINEAR; i++) {