data-structure-typed/README_zh-CN.md
2024-10-11 22:50:11 +13:00

52 KiB
Raw Blame History

data-structure-typed

npm npm npm package minimized gzipped size (select exports) GitHub top language GITHUB Star eslint NPM

English | 简体中文

为什么

JavaScript和TypeScript的数据结构。

是否羡慕C++ STL (std::)、Python的 collections 和Java的 java.util

不再需要羡慕了JavaScript和TypeScript现在拥有 data-structure-typed。

基准测试 与C++ STL相比。API 标准 与ES6和Java对齐。易用性 可与Python媲美。

提供了JS/TS中没有的数据结构

Heap, Binary Tree, RedBlack Tree, Linked List, Deque, Trie, Directed Graph, Undirected Graph, BST, AVL Tree, Priority Queue, Queue, Tree Multiset.

性能超越原生JS/TS

方法名 耗时(毫秒) 数据规模 所属标准库
Queue.push & shift 5.83 100,000 data-structure-typed
Array.push & shift 2829.59 100,000 原生JS
Deque.unshift & shift 2.44 100,000 data-structure-typed
Array.unshift & shift 4750.37 100,000 原生JS
HashMap.set 122.51 1,000,000 data-structure-typed
Map.set 223.80 1,000,000 原生JS
Set.add 185.06 1,000,000 原生JS

安装和使用

现在你可以在 Node.js 和浏览器环境中使用它

CommonJSrequire export.modules =

ESModule   import export

Typescript   import export

UMD           var Deque = dataStructureTyped.Deque

npm

npm i data-structure-typed --save

yarn

yarn add data-structure-typed
import {
  BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
  AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultiMap,
  DirectedVertex, AVLTreeNode
} from 'data-structure-typed';

CDN

将下面的代码复制到 HTML 文档的头标签中。

开发环境


<script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.js'></script>

生产环境


<script src='https://cdn.jsdelivr.net/npm/data-structure-typed/dist/umd/data-structure-typed.min.js'></script>

将下面的代码复制到你的 HTML 的 script 标签中,你就可以开始你的开发了。

const { Heap } = dataStructureTyped;
const {
  BinaryTree, Graph, Queue, Stack, PriorityQueue, BST, Trie, DoublyLinkedList,
  AVLTree, MinHeap, SinglyLinkedList, DirectedGraph, TreeMultiMap,
  DirectedVertex, AVLTreeNode
} = dataStructureTyped;

生动示例

Binary Tree二叉树

试一下 ,或者你可以使用我们的可视化工具运行自己的代码 visual tool

Binary Tree DFS (二叉搜索树深度遍历)

试一下

AVL TreeAVL树

试一下

Tree Multi Map

试一下

Matrix

试一下

有向图

试一下

地图

试一下

代码片段

红黑树 代码示例

TS

import { RedBlackTree } from 'data-structure-typed';

const rbTree = new RedBlackTree<number>();
rbTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
rbTree.isAVLBalanced();    // true
rbTree.delete(10);
rbTree.isAVLBalanced();    // true
rbTree.print()
//         ___6________
//        /            \
//      ___4_       ___11________
//     /     \     /             \
//    _2_    5    _8_       ____14__
//   /   \       /   \     /        \
//   1   3       7   9    12__     15__
//                            \        \
//                           13       16

JS

import { RedBlackTree } from 'data-structure-typed';

const rbTree = new RedBlackTree();
rbTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
rbTree.isAVLBalanced();    // true
rbTree.delete(10);
rbTree.isAVLBalanced();    // true
rbTree.print()
//         ___6________
//        /            \
//      ___4_       ___11________
//     /     \     /             \
//    _2_    5    _8_       ____14__
//   /   \       /   \     /        \
//   1   3       7   9    12__     15__
//                            \        \
//                           13       16

二叉搜索树 (BST) 代码示例

import { BST, BSTNode } from 'data-structure-typed';

const bst = new BST<number>();
bst.add(11);
bst.add(3);
bst.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5]);
bst.size === 16;                // true
bst.has(6);                     // true
const node6 = bst.getNode(6);   // BSTNode
bst.getHeight(6) === 2;         // true
bst.getHeight() === 5;          // true
bst.getDepth(6) === 3;          // true

bst.getLeftMost()?.key === 1;   // true

bst.delete(6);
bst.get(6);                     // undefined
bst.isAVLBalanced();            // true
bst.bfs()[0] === 11;            // true
bst.print()
//       ______________11_____           
//      /                     \          
//   ___3_______            _13_____
//  /           \          /        \    
//  1_     _____8____     12      _15__
//    \   /          \           /     \ 
//    2   4_       _10          14    16
//          \     /                      
//          5_    9
//            \                          
//            7

const objBST = new BST<number, { height: number, age: number }>();

objBST.add(11, { "name": "Pablo", "age": 15 });
objBST.add(3, { "name": "Kirk", "age": 1 });

objBST.addMany([15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5], [
    { "name": "Alice", "age": 15 },
    { "name": "Bob", "age": 1 },
    { "name": "Charlie", "age": 8 },
    { "name": "David", "age": 13 },
    { "name": "Emma", "age": 16 },
    { "name": "Frank", "age": 2 },
    { "name": "Grace", "age": 6 },
    { "name": "Hannah", "age": 9 },
    { "name": "Isaac", "age": 12 },
    { "name": "Jack", "age": 14 },
    { "name": "Katie", "age": 4 },
    { "name": "Liam", "age": 7 },
    { "name": "Mia", "age": 10 },
    { "name": "Noah", "age": 5 }
  ]
);

objBST.delete(11);

AVL树 代码示例

import { AVLTree } from 'data-structure-typed';

const avlTree = new AVLTree<number>();
avlTree.addMany([11, 3, 15, 1, 8, 13, 16, 2, 6, 9, 12, 14, 4, 7, 10, 5])
avlTree.isAVLBalanced();    // true
avlTree.delete(10);
avlTree.isAVLBalanced();    // true

有向图代码示例

import { DirectedGraph } from 'data-structure-typed';

const graph = new DirectedGraph<string>();

graph.addVertex('A');
graph.addVertex('B');

graph.hasVertex('A');       // true
graph.hasVertex('B');       // true
graph.hasVertex('C');       // false

graph.addEdge('A', 'B');
graph.hasEdge('A', 'B');    // true
graph.hasEdge('B', 'A');    // false

graph.deleteEdgeSrcToDest('A', 'B');
graph.hasEdge('A', 'B');    // false

graph.addVertex('C');

graph.addEdge('A', 'B');
graph.addEdge('B', 'C');

const topologicalOrderKeys = graph.topologicalSort(); // ['A', 'B', 'C']

无向图代码示例

import { UndirectedGraph } from 'data-structure-typed';

const graph = new UndirectedGraph<string>();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
graph.addVertex('D');
graph.deleteVertex('C');
graph.addEdge('A', 'B');
graph.addEdge('B', 'D');

const dijkstraResult = graph.dijkstra('A');
Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.key) // ['A', 'B', 'D']


不同数据结构之间互相转换

const orgArr = [6, 1, 2, 7, 5, 3, 4, 9, 8];
const orgStrArr = ["trie", "trial", "trick", "trip", "tree", "trend", "triangle", "track", "trace", "transmit"];
const entries = [[6, 6], [1, 1], [2, 2], [7, 7], [5, 5], [3, 3], [4, 4], [9, 9], [8, 8]];

const queue = new Queue(orgArr);
queue.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]

const deque = new Deque(orgArr);
deque.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]

const sList = new SinglyLinkedList(orgArr);
sList.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]

const dList = new DoublyLinkedList(orgArr);
dList.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]

const stack = new Stack(orgArr);
stack.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]

const minHeap = new MinHeap(orgArr);
minHeap.print();
// [1, 5, 2, 7, 6, 3, 4, 9, 8]

const maxPQ = new MaxPriorityQueue(orgArr);
maxPQ.print();
// [9, 8, 4, 7, 5, 2, 3, 1, 6]

const biTree = new BinaryTree(entries);
biTree.print();
//         ___6___
//        /       \
//     ___1_     _2_
//    /     \   /   \
//   _7_    5   3   4
//  /   \
//  9   8

const bst = new BST(entries);
bst.print();
//     _____5___
//    /         \
//   _2_       _7_
//  /   \     /   \
//  1   3_    6   8_
//        \         \
//        4         9


const rbTree = new RedBlackTree(entries);
rbTree.print();
//     ___4___
//    /       \
//   _2_     _6___
//  /   \   /     \
//  1   3   5    _8_
//              /   \
//              7   9


const avl = new AVLTree(entries);
avl.print();
//     ___4___
//    /       \
//   _2_     _6___
//  /   \   /     \
//  1   3   5    _8_
//              /   \
//              7   9

const treeMulti = new TreeMultiMap(entries);
treeMulti.print();
//     ___4___
//    /       \
//   _2_     _6___
//  /   \   /     \
//  1   3   5    _8_
//              /   \
//              7   9

const hm = new HashMap(entries);
hm.print()
// [[6, 6], [1, 1], [2, 2], [7, 7], [5, 5], [3, 3], [4, 4], [9, 9], [8, 8]]

const rbTreeH = new RedBlackTree(hm);
rbTreeH.print();
//     ___4___
//    /       \
//   _2_     _6___
//  /   \   /     \
//  1   3   5    _8_
//              /   \
//              7   9

const pq = new MinPriorityQueue(orgArr);
pq.print();
// [1, 5, 2, 7, 6, 3, 4, 9, 8]

const bst1 = new BST(pq);
bst1.print();
//     _____5___
//    /         \
//   _2_       _7_
//  /   \     /   \
//  1   3_    6   8_
//        \         \
//        4         9

const dq1 = new Deque(orgArr);
dq1.print();
// [6, 1, 2, 7, 5, 3, 4, 9, 8]
const rbTree1 = new RedBlackTree(dq1);
rbTree1.print();
//    _____5___
//   /         \
//  _2___     _7___
// /     \   /     \
// 1    _4   6    _9
//      /         /
//      3         8


const trie2 = new Trie(orgStrArr);
trie2.print();
// ['trie', 'trial', 'triangle', 'trick', 'trip', 'tree', 'trend', 'track', 'trace', 'transmit']
const heap2 = new Heap(trie2, { comparator: (a, b) => Number(a) - Number(b) });
heap2.print();
// ['transmit', 'trace', 'tree', 'trend', 'track', 'trial', 'trip', 'trie', 'trick', 'triangle']
const dq2 = new Deque(heap2);
dq2.print();
// ['transmit', 'trace', 'tree', 'trend', 'track', 'trial', 'trip', 'trie', 'trick', 'triangle']
const entries2 = dq2.map((el, i) => [i, el]);
const avl2 = new AVLTree(entries2);
avl2.print();
//     ___3_______
//    /           \
//   _1_       ___7_
//  /   \     /     \
//  0   2    _5_    8_
//          /   \     \
//          4   6     9

API 文档 & 演示

API 文档

在线演示

演示项目代码仓库

包含的数据结构

Data Structure Unit Test Performance Test API Docs
Binary Tree View
Binary Search Tree (BST) View
AVL Tree View
Red Black Tree View
Tree Multimap View
Heap View
Priority Queue View
Max Priority Queue View
Min Priority Queue View
Trie View
Graph View
Directed Graph View
Undirected Graph View
Queue View
Deque View
Hash Map View
Linked List View
Singly Linked List View
Doubly Linked List View
Stack View
Segment Tree View
Binary Indexed Tree View

形象比喻与选型

分类 数据结构 选型原因 大白话描述 图示
线性结构 Array 需要快速随机访问,固定大小,元素类型相同 一排编号的兔子。如果你想找到名叫Pablo的兔子你可以直接喊出Pablo的号码0680通过数组索引直接找到元素时间复杂度O(1)。但是如果你不知道Pablo的号码你仍然需要逐个搜索时间复杂度O(n)。此外如果你想在Pablo后面添加一只名叫Vicky的兔子你需要重新为Vicky之后的所有兔子编号时间复杂度O(n))。 array
Linked List 需要频繁插入删除,大小可变 一排兔子每只兔子抓着前面兔子的尾巴每只兔子只知道它后面兔子的名字。你想找一只名叫Pablo的兔子你必须从第一只兔子开始搜索。如果不是Pablo你就继续顺着那只兔子的尾巴找下一只。所以你可能需要搜索n次才能找到Pablo时间复杂度O(n)。如果你想在Pablo和Vicky之间插入一只名叫Remi的兔子这很简单。你只需让Vicky放开Pablo的尾巴让Remi抓住Pablo的尾巴然后让Vicky抓住Remi的尾巴时间复杂度O(1))。 singly linked list
Singly Linked List 只需要单向遍历,内存占用较少 与链表描述相同。 singly linked list
Doubly Linked List 需要双向遍历,允许从尾部快速删除 一排兔子每只兔子抓着前面兔子的尾巴每只兔子知道相邻两只兔子的名字。这为单向链表提供了向前搜索的能力仅此而已。例如如果你直接来到队列中的Remi兔子那里问她Vicky在哪里她会说在我后面抓着我尾巴的那只如果你问她Pablo在哪里她会说就在前面。 doubly linked list
Queue 需要先进先出FIFO的处理顺序 一排编号的兔子第一只兔子身上贴着便利贴。对于这个贴有便利贴的队列每当我们想从队列前面移除一只兔子时我们只需要将便利贴移到下一只兔子的脸上而不需要实际移除兔子以避免重新为后面所有的兔子编号从前面移除也是O(1)时间复杂度。对于队列尾部我们不需要担心因为每只新添加到尾部的兔子直接被赋予一个新编号O(1)时间复杂度),不需要重新为之前所有的兔子编号。 queue
Deque 需要在两端都能快速插入和删除 一排分组编号的兔子,第一只兔子身上贴着便利贴。对于这个队列,我们按组管理。每次从队列前面移除一只兔子时,我们只将便利贴移到下一只兔子身上。这样,我们不需要每次移除第一只兔子时都重新为后面所有的兔子编号。只有当一个组的所有成员都被移除时,我们才重新分配编号和分组。尾部的处理也是类似的。这是一种延迟和批量操作的策略,以抵消数组数据结构在中间插入或删除元素时需要移动所有后续元素的缺点。 deque
Stack 需要后进先出LIFO的处理顺序 一排兔子在一个死胡同隧道里,兔子只能从隧道入口(末端)被移除,新兔子也只能从入口(末端)被添加。 stack
树结构 Binary Tree 需要层次结构,每个节点最多有两个子节点 顾名思义,它是一棵每个节点最多有两个子节点的树。当你添加连续的数据如[4, 2, 6, 1, 3, 5, 7]时,它将是一个完全二叉树。当你添加像[4, 2, 6, null, 1, 3, null, 5, null, 7]这样的数据时,你可以指定任何左或右子节点是否为空,树的形状是完全可控的。 binary tree
Binary Search Tree 需要快速查找、插入和删除,但不要求严格平衡 一个由双向链表组成的树状兔子群落每只兔子最多有两条尾巴。这些兔子有纪律且听话按照一定的顺序排列在自己的位置上。二叉树中最重要的数据结构核心是插入、删除、修改、查找的时间复杂度为O(log n)。BST中存储的数据是结构化和有序的不是严格的1、2、3、4、5这样的顺序而是保持左子树中的所有节点小于节点右子树中的所有节点大于节点。这种顺序为插入、删除、修改和搜索提供了O(log n)的时间复杂度。将O(n)降低到O(log n)是计算机领域最常见的算法复杂度优化效率提升是指数级的。它也是将无序数据组织成有序数据的最有效方式大多数排序算法只能保持O(n log n)。当然我们提供的二叉搜索树支持以升序和降序组织数据。请记住基本的BST没有自平衡能力如果你顺序添加已排序的数据到这个数据结构中它将退化成一个列表从而失去O(log n)的能力。当然我们的addMany方法经过特殊处理以防止退化。但是对于实际应用请尽可能使用红黑树或AVL树因为它们天生就具有自平衡功能。 binary search tree
Red Black Tree 需要自平衡的二叉搜索树,保证最坏情况下的性能 一个由双向链表组成的树状兔子群落,每只兔子最多有两条尾巴。这些兔子不仅听话,而且聪明,会自动按照一定的顺序排列自己的位置。一种自平衡的二叉搜索树。每个节点都标有红黑标记。确保没有任何路径比其他路径长两倍以上(保持一定的平衡以提高搜索、添加和删除的速度)。 red-black tree
AVL Tree 需要严格平衡的二叉搜索树,读取操作频繁 一个由双向链表组成的树状兔子群落每只兔子最多有两条尾巴。这些兔子不仅听话和聪明会自动按照一定的顺序排列自己的位置而且遵循非常严格的规则。一种自平衡的二叉搜索树。每个节点都标有平衡因子表示其左右子树的高度差。平衡因子的绝对值不超过1保持更严格的平衡使得搜索效率高于红黑树但插入和删除操作会更复杂相对效率较低 avl tree
Trie 需要高效地存储和搜索字符串,特别是前缀匹配 一种特殊的树结构,用于高效存储和检索字符串数据集中的键。这种结构特别适用于实现字典和支持前缀搜索。 (图示暂缺)
Heap 需要快速获取最大或最小元素 一种特殊的完全二叉树通常存储在数组中其中索引为i的节点的子节点位于索引2i+1和2i+2处。自然地任何节点的父节点位于⌊(i1)/2⌋处。 heap
Priority Queue 需要按优先级处理元素 实际上就是一个堆。 priority queue
图结构 Graph 需要表示复杂的关系网络 有向图和无向图的基类,提供一些公共方法。 graph
Directed Graph 需要表示单向关系 一个网络状的兔子群每只兔子最多可以有n条尾巴单向链表 directed graph
Undirected Graph 需要表示双向关系 一个网络状的兔子群每只兔子最多可以有n条尾巴双向链表 undirected graph
哈希结构 HashMap 需要快速的键值对查找 一种基于键的哈希值来存储数据的结构允许以接近O(1)的时间复杂度进行插入、删除和查找操作。 (图示暂缺)
集合结构 Multiset 需要存储重复元素并快速统计元素出现次数 一种允许重复元素的集合,通常用于需要快速统计元素出现次数的场景。 (图示暂缺)

不同编程语言中的数据结构对应关系

Data Structure Typed C++ STL java.util Python collections
Heap<E> priority_queue<T> PriorityQueue<E> heapq
Deque<E> deque<T> ArrayDeque<E> deque
Queue<E> queue<T> Queue<E> -
HashMap<K, V> unordered_map<K, V> HashMap<K, V> defaultdict
DoublyLinkedList<E> list<T> LinkedList<E> -
SinglyLinkedList<E> - - -
BinaryTree<K, V> - - -
BST<K, V> - - -
RedBlackTree<E> set<T> TreeSet<E> -
RedBlackTree<K, V> map<K, V> TreeMap<K, V> -
TreeMultiMap<K, V> multimap<K, V> - -
TreeMultiMap<E> multiset<T> - -
Trie - - -
DirectedGraph<V, E> - - -
UndirectedGraph<V, E> - - -
PriorityQueue<E> priority_queue<T> PriorityQueue<E> -
Array<E> vector<T> ArrayList<E> list
Stack<E> stack<T> Stack<E> -
HashMap<E> unordered_set<T> HashSet<E> set
- unordered_multiset - Counter
LinkedHashMap<K, V> - LinkedHashMap<K, V> OrderedDict
- unordered_multimap<K, V> - -
- bitset<N> - -

内建的经典算法

算法 功能描述 迭代类型
二叉树深度优先搜索(DFS) 以深度优先的方式遍历二叉树,从根节点开始,首先访问左子树,然后是右子树,使用递归。 递归 + 迭代
二叉树广度优先搜索(BFS) 以广度优先的方式遍历二叉树,从根节点开始,逐层从左到右访问节点。 迭代
图的深度优先搜索 以深度优先的方式遍历图,从给定节点开始,尽可能深地沿一条路径探索,然后回溯以探索其他路径。用于寻找连通分量、路径等。 递归 + 迭代
二叉树Morris遍历 Morris遍历是一种中序遍历二叉树的算法空间复杂度为O(1)。它允许在没有额外栈或递归的情况下遍历树。 迭代
图的广度优先搜索 以广度优先的方式遍历图,从给定节点开始,首先访问与起始节点直接相连的节点,然后逐层扩展。用于寻找最短路径等。 递归 + 迭代
图的Tarjan算法 在图中找到强连通分量,通常使用深度优先搜索实现。 递归
图的Bellman-Ford算法 从单一源点找到最短路径,可以处理负权边 迭代
图的Dijkstra算法 从单一源点找到最短路径,不能处理负权边 迭代
图的Floyd-Warshall算法 找到所有节点对之间的最短路径 迭代
图的getCycles 在图中找到所有循环或检测循环的存在。 递归
图的getCutVertices 在图中找到切点,这些是移除后会增加图中连通分量数量的节点。 递归
图的getSCCs 在图中找到强连通分量,这些是任意两个节点都可以相互到达的子图。 递归
图的getBridges 在图中找到桥,这些是移除后会增加图中连通分量数量的边。 递归
图的拓扑排序 对有向无环图(DAG)进行拓扑排序,以找到节点的线性顺序,使得所有有向边都从较早的节点指向较晚的节点。 递归

软件工程标准

严格尊重计算机科学理论和软件开发规范我们的LinkedList就是传统意义的LinkedList数据结构而不是用Deque去代替以便标榜性能测试数据。当然我们也同时实现了基于动态数组的Deque。

原则 描述
实用性 遵循ES6和ESNext标准提供统一且考虑周到的可选参数简化方法名称。
可扩展性 遵循OOP面向对象编程原则允许所有数据结构继承。
模块化 包括数据结构模块化和独立的NPM包。
效率 所有方法都提供时间和空间复杂度可与原生JS性能相媲美。
可维护性 遵循开源社区开发标准完整文档持续集成并遵循TDD测试驱动开发模式。
可测试性 自动化和定制单元测试、性能测试和集成测试。
可移植性 计划移植到Java、Python和C++目前已完成80%。
可复用性 完全解耦最小化副作用遵循OOP。
安全性 精心设计的成员变量和方法的安全性。读写分离。数据结构软件不需要考虑其他安全方面。
可扩展性 数据结构软件不涉及负载问题。

基准测试

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
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
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
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
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
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
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
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
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 addBefore463.162.160.10
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 addBefore282.463.540.02
max-priority-queue
test nametime taken (ms)executions per secsample deviation
10,000 refill & poll10.4995.290.00
priority-queue
test nametime taken (ms)executions per secsample deviation
100,000 add & pop110.639.040.01
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
queue
test nametime taken (ms)executions per secsample deviation
1,000,000 push51.2119.530.02
1,000,000 push & shift105.569.470.05
stack
test nametime taken (ms)executions per secsample deviation
1,000,000 push43.5722.950.01
1,000,000 push & pop55.1818.120.01
trie
test nametime taken (ms)executions per secsample deviation
100,000 push54.0818.490.01
100,000 getWords77.7712.860.02