This repository contains Python based examples of many popular algorithms and data structures.
Each algorithm and data structure has its own separate README with related explanations and links for further reading (sometimes including ones to YouTube videos).
☝ Note that this project is meant to be used for learning and researching purposes only and it is not meant to be used for production.
An algorithm is an unambiguous specification of how to solve a class of problems. It is a set of rules that precisely define a sequence of operations.
B - Beginner, A - Advanced
- Math
BBit Manipulation - set/get/update/clear bits, multiplication/division by two, make negative etc.BFactorialBFibonacci Number - classic and closed-form versionsBPrimality Test (trial division method)BEuclidean Algorithm - calculate the Greatest Common Divisor (GCD)BLeast Common Multiple (LCM)BSieve of Eratosthenes - finding all prime numbers up to any given limitBIs Power of Two - check if the number is power of two (naive and bitwise algorithms)BPascal's TriangleBComplex Number - complex numbers and basic operations with themBRadian & Degree - radians to degree and backwards conversionBFast PoweringAInteger PartitionALiu Hui π Algorithm - approximate π calculations based on N-gonsADiscrete Fourier Transform - decompose a function of time (a signal) into the frequencies that make it up
- Sets
BCartesian Product - product of multiple setsBFisher–Yates Shuffle - random permutation of a finite sequenceAPower Set - all subsets of a set (bitwise and backtracking solutions)APermutations (with and without repetitions)ACombinations (with and without repetitions)ALongest Common Subsequence (LCS)ALongest Increasing SubsequenceAShortest Common Supersequence (SCS)AKnapsack Problem - "0/1" and "Unbound" onesAMaximum Subarray - "Brute Force" and "Dynamic Programming" (Kadane's) versionsACombination Sum - find all combinations that form specific sum
- Strings
BHamming Distance - number of positions at which the symbols are differentALevenshtein Distance - minimum edit distance between two sequencesAKnuth–Morris–Pratt Algorithm (KMP Algorithm) - substring search (pattern matching)AZ Algorithm - substring search (pattern matching)ARabin Karp Algorithm - substring searchALongest Common SubstringARegular Expression Matching
- Searches
BLinear SearchBJump Search (or Block Search) - search in sorted arrayBBinary Search - search in sorted arrayBInterpolation Search - search in uniformly distributed sorted array
- Sorting
BBubble SortBSelection SortBInsertion SortBHeap SortBMerge SortBQuicksort - in-place and non-in-place implementationsBShellsortBCounting SortBRadix Sort
- Linked Lists
- Trees
BDepth-First Search (DFS)BBreadth-First Search (BFS)
- Graphs
BDepth-First Search (DFS)BBreadth-First Search (BFS)BKruskal’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphADijkstra Algorithm - finding shortest paths to all graph vertices from single vertexABellman-Ford Algorithm - finding shortest paths to all graph vertices from single vertexAFloyd-Warshall Algorithm - find shortest paths between all pairs of verticesADetect Cycle - for both directed and undirected graphs (DFS and Disjoint Set based versions)APrim’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphATopological Sorting - DFS methodAArticulation Points - Tarjan's algorithm (DFS based)ABridges - DFS based algorithmAEulerian Path and Eulerian Circuit - Fleury's algorithm - Visit every edge exactly onceAHamiltonian Cycle - Visit every vertex exactly onceAStrongly Connected Components - Kosaraju's algorithmATravelling Salesman Problem - shortest possible route that visits each city and returns to the origin city
- Cryptography
BPolynomial Hash - rolling hash function based on polynomial
- Uncategorized
BTower of HanoiBSquare Matrix Rotation - in-place algorithmBJump Game - backtracking, dynamic programming (top-down + bottom-up) and greedy examplesBUnique Paths - backtracking, dynamic programming and Pascal's Triangle based examplesBRain Terraces - trapping rain water problem (dynamic programming and brute force versions)AN-Queens ProblemAKnight's Tour
An algorithmic paradigm is a generic method or approach which underlies the design of a class of algorithms. It is an abstraction higher than the notion of an algorithm, just as an algorithm is an abstraction higher than a computer program.
- Brute Force - look at all the possibilities and selects the best solution
BLinear SearchBRain Terraces - trapping rain water problemAMaximum SubarrayATravelling Salesman Problem - shortest possible route that visits each city and returns to the origin cityADiscrete Fourier Transform - decompose a function of time (a signal) into the frequencies that make it up
- Greedy - choose the best option at the current time, without any consideration for the future
BJump GameAUnbound Knapsack ProblemADijkstra Algorithm - finding shortest path to all graph verticesAPrim’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graphAKruskal’s Algorithm - finding Minimum Spanning Tree (MST) for weighted undirected graph
- Divide and Conquer - divide the problem into smaller parts and then solve those parts
BBinary SearchBTower of HanoiBPascal's TriangleBEuclidean Algorithm - calculate the Greatest Common Divisor (GCD)BMerge SortBQuicksortBTree Depth-First Search (DFS)BGraph Depth-First Search (DFS)BJump GameBFast PoweringAPermutations (with and without repetitions)ACombinations (with and without repetitions)
- Dynamic Programming - build up a solution using previously found sub-solutions
BFibonacci NumberBJump GameBUnique PathsBRain Terraces - trapping rain water problemALevenshtein Distance - minimum edit distance between two sequencesALongest Common Subsequence (LCS)ALongest Common SubstringALongest Increasing SubsequenceAShortest Common SupersequenceA0/1 Knapsack ProblemAInteger PartitionAMaximum SubarrayABellman-Ford Algorithm - finding shortest path to all graph verticesAFloyd-Warshall Algorithm - find shortest paths between all pairs of verticesARegular Expression Matching
- Backtracking - similarly to brute force, try to generate all possible solutions, but each time you generate next solution you test if it satisfies all conditions, and only then continue generating subsequent solutions. Otherwise, backtrack, and go on a different path of finding a solution. Normally the DFS traversal of state-space is being used.
BJump GameBUnique PathsBPower Set - all subsets of a setAHamiltonian Cycle - Visit every vertex exactly onceAN-Queens ProblemAKnight's TourACombination Sum - find all combinations that form specific sum
- Branch & Bound - remember the lowest-cost solution found at each stage of the backtracking search, and use the cost of the lowest-cost solution found so far as a lower bound on the cost of a least-cost solution to the problem, in order to discard partial solutions with costs larger than the lowest-cost solution found so far. Normally BFS traversal in combination with DFS traversal of state-space tree is being used.