npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

dsa-toolbox

v1.0.2-alpha

Published

A powerful toolkit for data structures and algorithms in TypeScript, designed for optimal performance and versatility. The toolkit provides implementations of various data structures and algorithms, with a focus on search and sort operations, caching, and

Downloads

520

Readme

DSA Toolbox 📚

Welcome to DSA Toolbox, a comprehensive library of data structures and algorithms designed to streamline your development process! This library is built for JavaScript and TypeScript, offering both fundamental and advanced data structures, search algorithms, sort algorithms, and more.

Whether you're building a lightweight application or handling large datasets, DSA Toolbox provides an optimized library to make your coding journey efficient and fun.

✨ Features

DSA Toolbox offers a variety of powerful toolbox:

🔎 Search Algorithms

  • Binary Search
  • Exponential Search
  • Hybrid Search
  • Linear Search
  • Ternary Search

🧮 Sort Algorithms

  • HeapSort
  • MergeSort
  • TimSort

🔄 Cache Algorithms

  • LFU (Least Frequently Used)
  • LRU (Least Recently Used)

🏗️ Data Structures

  • Heaps: MaxHeap, MinHeap
  • Linked Lists: Singly Linked List, Doubly Linked List
  • Queues & Stacks
  • Treaps (Binary Search Tree with heap properties)
  • Trees: AVL Tree, Red-Black Tree, Binary Search Tree, B-Tree, Trie
  • Probabilistic Structures: Bloom Filter, HyperLogLog, CountMinSketch, SkipList, MinHash, SimHash, TDigest

Benchmarks

Data Structures Benchmarks

| (index) | dataStructure | operation | size | time (ms) | |---------|----------------------|-------------------|---------|--------------------| | 0 | Native Array | Insert | 1000 | 0.0042 | | 1 | Native Array | Search | 1000 | 0.0015 | | 2 | Native Array | Delete | 1000 | 0.0008 | | 3 | Queue | Insert (Enqueue) | 1000 | 0.1306 | | 4 | Queue | Delete (Dequeue) | 1000 | 0.1355 | | 5 | Stack | Insert (Push) | 1000 | 0.1216 | | 6 | Stack | Delete (Pop) | 1000 | 0.1128 | | 7 | Binary Search Tree | Insert | 1000 | 0.3302 | | 8 | Binary Search Tree | Search | 1000 | 0.0431 | | 9 | Binary Search Tree | Delete | 1000 | 0.0308 | | 10 | Red-Black Tree | Insert | 1000 | 0.8018 | | 11 | Red-Black Tree | Search | 1000 | 0.0202 | | 12 | Red-Black Tree | Delete | 1000 | 0.0791 | | 13 | AVL Tree | Insert | 1000 | 0.6278 | | 14 | AVL Tree | Search | 1000 | 0.0117 | | 15 | AVL Tree | Delete | 1000 | 0.0189 | | 16 | Trie | Insert | 1000 | 0.3451 | | 17 | Trie | Search | 1000 | 0.0157 | | 18 | Trie | Delete | 1000 | 0.0184 | | 19 | Min Heap | Insert | 1000 | 0.1854 | | 20 | Min Heap | Extract | 1000 | 0.3252 | | 21 | Max Heap | Insert | 1000 | 0.1810 | | 22 | Max Heap | Extract | 1000 | 0.3187 | | 23 | B-Tree | Insert | 1000 | 0.4755 | | 24 | B-Tree | Search | 1000 | 0.0155 | | 25 | B-Tree | Delete | 1000 | 0.0783 | | 26 | Native Array | Insert | 10000 | 0.1975 | | 27 | Native Array | Search | 10000 | 0.0025 | | 28 | Native Array | Delete | 10000 | 0.0007 | | 29 | Queue | Insert (Enqueue) | 10000 | 0.2820 | | 30 | Queue | Delete (Dequeue) | 10000 | 0.1872 | | 31 | Stack | Insert (Push) | 10000 | 0.1817 | | 32 | Stack | Delete (Pop) | 10000 | 0.1647 | | 33 | Binary Search Tree | Insert | 10000 | 1.6758 | | 34 | Binary Search Tree | Search | 10000 | 0.0039 | | 35 | Binary Search Tree | Delete | 10000 | 0.0036 | | 36 | Red-Black Tree | Insert | 10000 | 3.0843 | | 37 | Red-Black Tree | Search | 10000 | 0.0051 | | 38 | Red-Black Tree | Delete | 10000 | 0.0178 | | 39 | AVL Tree | Insert | 10000 | 1.7637 | | 40 | AVL Tree | Search | 10000 | 0.0028 | | 41 | AVL Tree | Delete | 10000 | 0.0040 | | 42 | Trie | Insert | 10000 | 1.2017 | | 43 | Trie | Search | 10000 | 0.0059 | | 44 | Trie | Delete | 10000 | 0.0045 | | 45 | Min Heap | Insert | 10000 | 0.4538 | | 46 | Min Heap | Extract | 10000 | 0.8098 | | 47 | Max Heap | Insert | 10000 | 0.3135 | | 48 | Max Heap | Extract | 10000 | 0.7455 | | 49 | B-Tree | Insert | 10000 | 2.5483 | | 50 | B-Tree | Search | 10000 | 0.0098 | | 51 | B-Tree | Delete | 10000 | 0.0772 | | 52 | Native Array | Insert | 100000 | 0.1380 | | 53 | Native Array | Search | 100000 | 0.0166 | | 54 | Native Array | Delete | 100000 | 0.0010 | | 55 | Queue | Insert (Enqueue) | 100000 | 1.9742 | | 56 | Queue | Delete (Dequeue) | 100000 | 0.3029 | | 57 | Stack | Insert (Push) | 100000 | 0.7822 | | 58 | Stack | Delete (Pop) | 100000 | 0.1848 | | 59 | Binary Search Tree | Insert | 100000 | 20.2091 | | 60 | Binary Search Tree | Search | 100000 | 0.0126 | | 61 | Binary Search Tree | Delete | 100000 | 0.0031 | | 62 | Red-Black Tree | Insert | 100000 | 95.1039 | | 63 | Red-Black Tree | Search | 100000 | 0.0193 | | 64 | Red-Black Tree | Delete | 100000 | 0.0112 | | 65 | AVL Tree | Insert | 100000 | 29.1355 | | 66 | AVL Tree | Search | 100000 | 0.0110 | | 67 | AVL Tree | Delete | 100000 | 0.0036 | | 68 | Trie | Insert | 100000 | 33.3004 | | 69 | Trie | Search | 100000 | 0.0455 | | 70 | Trie | Delete | 100000 | 0.0880 | | 71 | Min Heap | Insert | 100000 | 4.6971 | | 72 | Min Heap | Extract | 100000 | 9.8937 | | 73 | Max Heap | Insert | 100000 | 3.2794 | | 74 | Max Heap | Extract | 100000 | 9.2720 | | 75 | B-Tree | Insert | 100000 | 50.4755 | | 76 | B-Tree | Search | 100000 | 0.0125 | | 77 | B-Tree | Delete | 100000 | 0.0196 | | 78 | Native Array | Insert | 1000000 | 2.0249 | | 79 | Native Array | Search | 1000000 | 0.1391 | | 80 | Native Array | Delete | 1000000 | 0.000 |

Suggested Applications:

  • Small Data: For datasets around 1,000 elements, Native Arrays, Queues, and Stacks provide excellent performance.
  • Medium Data: Up to 10,000 elements, use AVL Tree for balanced tree operations and Min/Max Heap for priority-based insert/extract operations.
  • Large Data: At 100,000 elements, consider using B-Trees or Red-Black Trees for optimized insertion and search performance.
  • Extra Large Data: Beyond 1,000,000 elements, B-Trees, with their balanced and efficient nature, are superior for handling large datasets, especially for search and delete operations.

Algorithms Benchmarks

| (index) | algorithm | operation | size | time (ms) | |---------|----------------------|-----------|----------|---------------| | 0 | Heap Sort | Sort | 1000 | 1.1344 | | 1 | Merge Sort | Sort | 1000 | 0.6770 | | 2 | Tim Sort | Sort | 1000 | 0.5847 | | 3 | Native Sort | Sort | 1000 | 0.1421 | | 4 | Binary Search | Search | 1000 | 0.0278 | | 5 | Exponential Search | Search | 1000 | 0.0265 | | 6 | Hybrid Search | Search | 1000 | 0.0377 | | 7 | Linear Search | Search | 1000 | 0.0218 | | 8 | Ternary Search | Search | 1000 | 0.0259 | | 9 | Heap Sort | Sort | 10000 | 2.6921 | | 10 | Merge Sort | Sort | 10000 | 3.4185 | | 11 | Tim Sort | Sort | 10000 | 2.1583 | | 12 | Native Sort | Sort | 10000 | 1.2181 | | 13 | Binary Search | Search | 10000 | 0.0050 | | 14 | Exponential Search | Search | 10000 | 0.0062 | | 15 | Hybrid Search | Search | 10000 | 3.5105 | | 16 | Linear Search | Search | 10000 | 0.0740 | | 17 | Ternary Search | Search | 10000 | 0.0067 | | 18 | Heap Sort | Sort | 100000 | 18.3146 | | 19 | Merge Sort | Sort | 100000 | 24.6636 | | 20 | Tim Sort | Sort | 100000 | 12.3915 | | 21 | Native Sort | Sort | 100000 | 15.6272 | | 22 | Binary Search | Search | 100000 | 0.0200 | | 23 | Exponential Search | Search | 100000 | 0.1084 | | 24 | Hybrid Search | Search | 100000 | 30.4123 | | 25 | Linear Search | Search | 100000 | 0.6435 | | 26 | Ternary Search | Search | 100000 | 0.0108 | | 27 | Heap Sort | Sort | 1000000 | 272.6623 | | 28 | Merge Sort | Sort | 1000000 | 246.9195 | | 29 | Tim Sort | Sort | 1000000 | 140.5443 | | 30 | Native Sort | Sort | 1000000 | 184.8578 | | 31 | Binary Search | Search | 1000000 | 0.0271 | | 32 | Exponential Search | Search | 1000000 | 0.7834 | | 33 | Hybrid Search | Search | 1000000 | 375.9163 | | 34 | Linear Search | Search | 1000000 | 0.6445 | | 35 | Ternary Search | Search | 1000000 | 0.0094 |

Sorting Algorithms:

  • Heap Sort: Ideal for priority queues and constrained memory environments.
  • Merge Sort: Best for linked lists and large datasets on disk where stable sorting is needed.
  • Tim Sort: Great for real-time systems and partially sorted data, widely used in production environments.
  • Native Sort: Versatile for general-purpose sorting with built-in optimization.

Searching Algorithms:

  • Binary Search: Perfect for quick lookups in large, sorted datasets (e.g., databases).
  • Exponential Search: Useful for unbounded or sparse datasets to find a starting range for binary search.
  • Hybrid Search: Adapts well to changing dataset sizes, ideal for large applications and databases.
  • Linear Search: Suited for small, unsorted datasets where search is infrequent.
  • Ternary Search: Good for distinct, ordered data ranges, often in optimization or game algorithms.

🛠️ Usage

To install the DSA Toolbox:

pnpm add dsa-toolbox 

Then you can import the Data Structure or the Algorithm you want to use:

import {
  binarySearch,
  exponentialSearch,
  hybridSearch,
  linearSearch,
  ternarySearch,
  heapSort,
  mergeSort,
  timSort,
  LFUCache,
  LRUCache,
  MaxHeap,
  MinHeap,
  DoublyLinkedList,
  LinkedList,
  HyperLogLog,
  CountMinSketch,
  BloomFilter,
  SkipList,
  TDigest,
  MinHash,
  SimHash,
  Queue,
  Stack,
  Treap,
  AVLTree,
  BTree,
  BinarySearchTree,
  RedBlackTree,
  Trie,
} from 'dsa-toolbox';

binarySearch(sortedData, target, { compareFn: (a, b) => a - b, isSorted: true });
ternarySearch(data, target, 0, sortedData.length - 1, {
        compareFn: (a, b) => a - b,
        isSorted: false,
    });

const queue = new Queue<number>();
data.forEach((item) => queue.enqueue(item));

const avlTree = new AVLTree<number>();
avlTree.insert(10);
avlTree.insert(20);
avlTree.insert(5);
avlTree.insert(4);
avlTree.insert(15);
avlTree.search(10);

More usage examples can be found here:

  • https://github.com/helabenkhalfallah/dsa-toolbox/blob/main/benchmark-algo.ts
  • https://github.com/helabenkhalfallah/dsa-toolbox/blob/main/benchmark-ds.ts
  • In tests files, for example:
    • https://github.com/helabenkhalfallah/dsa-toolbox/blob/main/src/data-structures/trees/avl/AVLTree-test.ts
    • https://github.com/helabenkhalfallah/dsa-toolbox/blob/main/src/data-structures/trees/b-tree/BTree-test.ts

📚 Documentation & References

For detailed explanations of each data structure and algorithm, please visit:


Code coverage

| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | |--------------------------------------------|---------|----------|---------|---------|--------------------------------------------------------------------------------------------| | All files | 90.84 | 90.44 | 96.34 | 90.84 | | | algorithms/search | 96.9 | 92.85 | 100 | 96.9 | | | BinarySearch.ts | 100 | 100 | 100 | 100 | | | ExponentialSearch.ts | 100 | 87.5 | 100 | 100 | 70 | | HybridSearch.ts | 93.33 | 87.5 | 100 | 93.33 | 121-122 | | LinearSearch.ts | 100 | 100 | 100 | 100 | | | TernarySearch.ts | 96 | 92.3 | 100 | 96 | 82 | | algorithms/sort | 99.44 | 95.23 | 100 | 99.44 | | | HeapSort.ts | 100 | 100 | 100 | 100 | | | MergeSort.ts | 100 | 100 | 100 | 100 | | | TimSort.ts | 99.24 | 93.47 | 100 | 99.24 | 128 | | commons | 85.71 | 100 | 75 | 85.71 | | | ComparableNode.ts | 85.71 | 100 | 75 | 85.71 | 50-51 | | data-structures/cache | 100 | 94.59 | 100 | 100 | | | LFU.ts | 100 | 90.9 | 100 | 100 | 75,148 | | LRU.ts | 100 | 100 | 100 | 100 | | | data-structures/heaps | 97.14 | 93.87 | 88.88 | 97.14 | | | MaxHeap.ts | 97.14 | 96 | 88.88 | 97.14 | 138-139 | | MinHeap.ts | 97.14 | 91.66 | 88.88 | 97.14 | 139-140 | | data-structures/linked-list | 97.04 | 89.06 | 100 | 97.04 | | | DoublyLinkedList.ts | 95.65 | 88.57 | 100 | 95.65 | 87-89,91 | | LinkedList.ts | 98.7 | 89.65 | 100 | 98.7 | 75 | | data-structures/probabilistic/cardinality | 84.61 | 87.5 | 87.5 | 84.61 | | | HyperLogLog.ts | 84.61 | 87.5 | 87.5 | 84.61 | 61-63,75-81 | | data-structures/probabilistic/frequency | 100 | 100 | 100 | 100 | | | CountMinSketch.ts | 100 | 100 | 100 | 100 | | | data-structures/probabilistic/membership | 100 | 100 | 100 | 100 | | | BloomFilter.ts | 100 | 100 | 100 | 100 | | | data-structures/probabilistic/ordered | 97.87 | 97.22 | 100 | 97.87 | | | SkipList.ts | 97.87 | 97.22 | 100 | 97.87 | 102-103 | | data-structures/probabilistic/quantile | 97.97 | 91.42 | 100 | 97.97 | | | TDigest.ts | 97.97 | 91.42 | 100 | 97.97 | 61,85 | | data-structures/probabilistic/similarity | 100 | 100 | 100 | 100 | | | MinHash.ts | 100 | 100 | 100 | 100 | | | SimHash.ts | 100 | 100 | 100 | 100 | | | data-structures/queue | 100 | 100 | 100 | 100 | | | Queue.ts | 100 | 100 | 100 | 100 | | | data-structures/stack | 100 | 100 | 100 | 100 | | | Stack.ts | 100 | 100 | 100 | 100 | | | data-structures/treaps | 82.41 | 88.88 | 92.85 | 82.41 | | | Treap.ts | 82.41 | 88.88 | 92.85 | 82.41 | 84-85,111-115,163,168-176 | | data-structures/trees/avl | 90.62 | 84.31 | 100 | 90.62 | | | AVLTree.ts | 90.62 | 84.31 | 100 | 90.62 | 118-119,169,196-198,201-203 | | data-structures/trees/b-tree | 68.71 | 75 | 76.47 | 68.71 | | | BTree.ts | 68.71 | 75 | 76.47 | 68.71 | 67,114-115,119-120,146-147,169-171,182-192,203-208,220-221,232-243,252-261,270-279,294-295 | | data-structures/trees/bst | 93.4 | 93.61 | 100 | 93.4 | | | BinarySearchTree.ts | 93.4 | 93.61 | 100 | 93.4 | 132-134,137-139 | | data-structures/trees/red-black | 76.07 | 81.81 | 100 | 76.07 | | | RedBlackTree.ts | 76.07 | 81.81 | 100 | 76.07 | 107-114,274,278-279,318-344,347-373,379,395-396,398-399,442-443 | | data-structures/trees/trie | 100 | 96 | 100 | 100 | | | Trie.ts | 100 | 96 | 100 | 100 | 89 |


🚀 Contributing

For contributions, we invite you to read our Contributing Guide to get started and ensure a smooth process.


Happy coding with the DSA Toolbox! 🎉