mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-11-10 11:09:43 +08:00
10 KiB
10 KiB
JavaScript Algorithms and Data Structures
Code Examples
Data Structures
- Linked List
- Queue
- Stack
- Hash Table
- Heap
- Priority Queue
- Trie
- Tree
- Binary Search Tree
- AVL Tree
- B-Tree
- 2-3 Tree
- Red-Black Tree
- Suffix Tree
- Segment Tree or Interval Tree
- Binary Indexed Tree or Fenwick Tree
- Graph
Algorithms
- Math
- Factorial
- Fibonacci Number
- Cartesian Product - product of multiple sets
- Power Set - all subsets of the set
- Permutations (with and without repetitions)
- Combinations (with and without repetitions)
- Primality Test (trial division method)
- Euclidean Algorithm - calculate the Greatest Common Divisor (GCD)
- Least Common Multiple (LCM)
- Fisher–Yates Shuffle - random permutation of a finite sequence
- String
- Levenshtein Distance - minimum edit distance between two sequences
- Hamming Distance - number of positions at which the symbols are different
- Knuth–Morris–Pratt Algorithm - substring search
- Rabin Karp Algorithm - substring search
- Longest Common Subsequence (LCS)
- Longest Common Substring
- Search
- Sorting
- Tree
- Depth-First Search (DFS)
- Breadth-First Search (BFS)
- Graph
- Depth-First Search (DFS)
- Breadth-First Search (BFS)
- Detect Cycle
- Topological Sorting
- Dijkstra Algorithm to Find Shortest Path
- Eulerian path, Eulerian circuit
- Bellman Ford
- Strongly Connected Component algorithm
- Shortest Path Faster Algorithm (SPFA)
- Minimum Spanning Tree
- Prim’s algorithm
- Kruskal’s algorithm
- Dynamic Programming
- Levenshtein Distance - minimum edit distance between two sequences
- Longest Common Subsequence (LCS)
- Longest Common Substring
- Increasing subsequence
- Knapsack problem
- Maximum subarray
- Maximum sum path
- Integer Partition
- Longest Increasing subsequence
- Shortest common supersequence
- Uncategorized
- Union-Find
- Maze
Running Tests
Run all tests
npm test
Run tests by name
npm test -- -t 'LinkedList'
Playground
You may play with data-structures and algorithms in ./src/playground/playground.js
file and write
tests for it in ./src/playground/__test__/playground.test.js
.
Then just simply run the following command to test if your playground code works as expected:
npm test -- -t 'playground'
Useful links
▶ Data Structures and Algorithms on YouTube
Useful Information
Big O Notation
Order of growth of algorithms specified in Big O notation.
Source: Big O Cheat Sheet.
Below is the list of some of the most used Big O notations and their performance comparisons against different sizes of the input data.
Big O Notation | Computations for 10 elements | Computations for 100 elements | Computations for 1000 elements |
---|---|---|---|
O(1) | 1 | 1 | 1 |
O(log N) | 3 | 6 | 9 |
O(N) | 10 | 100 | 1000 |
O(N log N) | 30 | 60 | 9000 |
O(N^2) | 100 | 10000 | 1000000 |
O(2^N) | 1024 | 1.26e+29 | 1.07e+301 |
O(N!) | 3628800 | 9.3e+157 | 4.02e+2567 |
Data Structure Operations Complexity
Data Structure | Access | Search | Insertion | Deletion |
---|---|---|---|---|
Array | 1 | n | n | n |
Stack | n | n | 1 | 1 |
Queue | n | n | 1 | 1 |
Linked List | n | n | 1 | 1 |
Hash Table | - | n | n | n |
Binary Search Tree | n | n | n | n |
B-Tree | log(n) | log(n) | log(n) | log(n) |
Red-Black Tree | log(n) | log(n) | log(n) | log(n) |
AVL Tree | log(n) | log(n) | log(n) | log(n) |
Array Sorting Algorithms Complexity
Name | Best | Average | Worst | Memory | Stable |
---|---|---|---|---|---|
Bubble sort | n | n^2 | n^2 | 1 | Yes |
Insertion sort | n | n^2 | n^2 | 1 | Yes |
Selection sort | n^2 | n^2 | n^2 | 1 | No |
Heap sort | n log(n) | n log(n) | n log(n) | 1 | No |
Merge sort | n log(n) | n log(n) | n log(n) | n | Yes |
Quick sort | n log(n) | n log(n) | n^2 | log(n) | No |
Shell sort | n log(n) | depends on gap sequence | n (log(n))^2 | 1 | No |