Algorithms & data structures project
Algorithms and data structures are fundamental to efficient code and good software design. Creating and designing excellent algorithms is required for being an exemplary programmer. This repository's goal is to demonstrate how to correctly implement common data structures and algorithms in the simplest and most elegant ways.
Contributing
This repository is contribution friendly :smiley:. If you'd like to add or improve an algorithm, your contribution is welcome! Please be sure to check out the Wiki for instructions.
Other programming languages?
This repository provides algorithm implementations in Java, however, there are other forks that provide implementations in other languages, most notably:
Running an algorithm implementation
To compile and run any of the algorithms here, you need at least JDK version 8. Gradle can make things more convenient for you, but it is not required.
Running with Gradle (recommended)
This project supports the Gradle Wrapper. The Gradle wrapper automatically downloads Gradle the first time it runs, so expect a delay when running the first command below.
If you are on Windows, use gradlew.bat
instead of ./gradlew
below.
Run a single algorithm like this:
./gradlew run -Palgorithm=<algorithm-subpackage>.<algorithm-class>
Alternatively, you can run a single algorithm specifying the full class name
./gradlew run -Pmain=<algorithm-fully-qualified-class-name>
For instance:
./gradlew run -Palgorithm=search.BinarySearch
or
./gradlew run -Pmain=com.williamfiset.algorithms.search.BinarySearch
Compiling and running with only a JDK
Create a classes folder
cd Algorithms
mkdir classes
Compile the algorithm
javac -sourcepath src/main/java -d classes src/main/java/ <relative-path-to-java-source-file>
Run the algorithm
java -cp classes <class-fully-qualified-name>
Example
$ javac -d classes -sourcepath src/main/java src/main/java/com/williamfiset/algorithms/search/BinarySearch.java
$ java -cp classes com.williamfiset.algorithms.search.BinarySearch
Data Structures
Dynamic Programming
Dynamic Programming Classics
Dynamic Programming Problem Examples
Adhoc
Tiling problems
Geometry
Graph theory
Tree algorithms
Network flow
Main graph theory algorithms
- Articulation points/cut vertices (adjacency list) - O(V+E)
- Bellman-Ford (edge list, negative cycles, fast & optimized) - O(VE)
- :movie_camera: Bellman-Ford (adjacency list, negative cycles) - O(VE)
- Bellman-Ford (adjacency matrix, negative cycles) - O(V3)
- :movie_camera: Breadth first search (adjacency list) - O(V+E)
- Breadth first search (adjacency list, fast queue) - O(V+E)
- Bridges/cut edges (adjacency list) - O(V+E)
- Find connected components (adjacency list, union find) - O(Elog(E))
- Find connected components (adjacency list, DFS) - O(V+E)
- Depth first search (adjacency list, iterative) - O(V+E)
- Depth first search (adjacency list, iterative, fast stack) - O(V+E)
- :movie_camera: Depth first search (adjacency list, recursive) - O(V+E)
- :movie_camera: Dijkstra's shortest path (adjacency list, lazy implementation) - O(Elog(V))
- :movie_camera: Dijkstra's shortest path (adjacency list, eager implementation + D-ary heap) - O(ElogE/V(V))
- :movie_camera: Eulerian Path (directed edges) - O(E+V)
- :movie_camera: Floyd Warshall algorithm (adjacency matrix, negative cycle check) - O(V3)
- Graph diameter (adjacency list) - O(VE)
- :movie_camera: Kahn's algorithm (topological sort, adjacency list) - O(E+V)
- Kruskal's min spanning tree algorithm (edge list, union find) - O(Elog(E))
- :movie_camera: Kruskal's min spanning tree algorithm (edge list, union find, lazy sorting) - O(Elog(E))
- Kosaraju's strongly connected components algorithm (adjacency list) - O(V+E)
- :movie_camera: Prim's min spanning tree algorithm (lazy version, adjacency list) - O(Elog(E))
- Prim's min spanning tree algorithm (lazy version, adjacency matrix) - O(V2)
- :movie_camera: Prim's min spanning tree algorithm (eager version, adjacency list) - O(Elog(V))
- Steiner tree (minimum spanning tree generalization) - O(V3 + V2 2T + V 3T)
- :movie_camera: Tarjan's strongly connected components algorithm (adjacency list) - O(V+E)
- :movie_camera: Topological sort (acyclic graph, adjacency list) - O(V+E)
- Topological sort (acyclic graph, adjacency matrix) - O(V2)
- Traveling Salesman Problem (brute force) - O(n!)
- :movie_camera: Traveling Salesman Problem (dynamic programming, iterative) - O(n22n)
- Traveling Salesman Problem (dynamic programming, recursive) - O(n22n)
Linear algebra
Mathematics
Other
Search algorithms
Sorting algorithms
String algorithms
License
This repository is released under the MIT license. In short, this means you are free to use this software in any personal, open-source or commercial projects. Attribution is optional but appreciated.
Donate
Consider donating to support my creation of educational content: