[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-3969":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":47,"readmeContent":48,"aiSummary":49,"trendingCount":16,"starSnapshotCount":16,"syncStatus":50,"lastSyncTime":51,"discoverSource":52},3969,"Algorithms","williamfiset\u002FAlgorithms","williamfiset","A collection of algorithms and data structures","",null,"Java",18634,4512,398,31,0,3,9,34,11,45,"MIT License",false,"master",true,[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"adjacency","adjacency-matrix","algorithm","algorithms","dijkstra","dynamic-programming","edmonds-karp-algorithm","geometry","graph-theory","linear-algebra","mathematics","matrix-multiplication","maxflow","nlog","search-algorithm","search-algorithms","sorting-algorithms","strings","traveling-salesman","tree-algorithms","2026-06-12 02:00:56","[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT)\n[![Bazel Tests](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Factions\u002Fworkflows\u002Fmain.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Factions\u002Fworkflows\u002Fmain.yml)\n![README Checker](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Fworkflows\u002FREADME%20URL%20Checker\u002Fbadge.svg)\n[![Sponsor](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSponsor-GitHub-ea4aaa.svg)](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fwilliamfiset)\n\n# Algorithms & data structures project\n\nAlgorithms 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.\n\n🎬 Many of the algorithms and data structures in this repo have companion video explanations on the [William Fiset YouTube channel](https:\u002F\u002Fwww.youtube.com\u002F@WilliamFiset-videos) — so if the code alone doesn't click, grab some popcorn and watch the videos!\n\n# Running an algorithm implementation\n\nTo compile and run any of the algorithms here, you need at least JDK version 8 and [Bazel](https:\u002F\u002Fbazel.build\u002F)\n\n## Running with Bazel (recommended)\n\nThis project uses [Bazel](https:\u002F\u002Fbazel.build\u002F) as its build system. Install Bazel by following the [official installation guide](https:\u002F\u002Fbazel.build\u002Finstall).\n\nRun a single algorithm like this:\n\n```bash\nbazel run \u002F\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002F\u003Csubpackage>:\u003CClassName>\n```\n\nFor instance:\n\n```bash\nbazel run \u002F\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch:BinarySearch\n```\n\nRun all tests:\n\n```bash\nbazel test \u002F\u002Fsrc\u002Ftest\u002F...\n```\n\nRun tests for a specific package:\n\n```bash\nbazel test \u002F\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting:all\n```\n\n## Compiling and running with only a JDK\n\nIf you don't want to use Bazel, you can compile and run with just the JDK:\n\n### Create a classes folder\n\n```bash\ncd Algorithms\nmkdir classes\n```\n\n### Compile the algorithm\n\n```bash\njavac -sourcepath src\u002Fmain\u002Fjava -d classes src\u002Fmain\u002Fjava\u002F\u003Crelative-path-to-java-source-file>\n```\n\n### Run the algorithm\n\n```bash\njava -cp classes \u003Cclass-fully-qualified-name>\n```\n\n### Example\n\n```bash\n$ javac -d classes -sourcepath src\u002Fmain\u002Fjava src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch\u002FBinarySearch.java\n$ java -cp classes com.williamfiset.algorithms.search.BinarySearch\n```\n\n# Data Structures\n\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=q4fnJZr8ztY) [Balanced Trees](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fbalancedtree)\n  - [AVL Tree (recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fbalancedtree\u002FAVLTreeRecursive.java)\n  - [Red Black Tree (recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fbalancedtree\u002FRedBlackTree.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JfSdGQdAzq8) [Binary Search Tree](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fbinarysearchtree\u002FBinarySearchTree.java)\n- [Splay Tree](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fbinarysearchtree\u002FSplayTree.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=PEnFFiQe1pM) [Dynamic Array](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fdynamicarray)\n  - [Dynamic array (integer only, fast)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fdynamicarray\u002FIntArray.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=RgITNht_f4Q) [Fenwick Tree](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Ffenwicktree)\n  - [Fenwick Tree (range query, point updates)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Ffenwicktree\u002FFenwickTreeRangeQueryPointUpdate.java)\n  - [Fenwick Tree (range update, point query)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Ffenwicktree\u002FFenwickTreeRangeUpdatePointQuery.java)\n- [Fibonacci Heap](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Ffibonacciheap)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=2E54GqF0H4s) [Hashtable](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fhashtable)\n  - [Hashtable (double hashing)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fhashtable\u002FHashTableDoubleHashing.java)\n  - [Hashtable (linear probing)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fhashtable\u002FHashTableLinearProbing.java)\n  - [Hashtable (quadratic probing)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fhashtable\u002FHashTableQuadraticProbing.java)\n  - [Hashtable (separate chaining)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fhashtable\u002FHashTableSeparateChaining.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=-Yn5DU0_-lw) [Linked List](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Flinkedlist\u002FDoublyLinkedList.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=wptevk0bshY) [Priority Queue](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fpriorityqueue)\n  - [Min Binary Heap](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fpriorityqueue\u002FBinaryHeap.java)\n  - [Min Indexed Binary Heap (sorted key-value pairs, similar to hash-table)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fpriorityqueue\u002FMinIndexedBinaryHeap.java)\n  - [Min D-Heap](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fpriorityqueue\u002FMinDHeap.java)\n  - [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=DT8xZ0Uf8wo) [Min Indexed D-Heap (sorted key-value pairs, similar to hash-table)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fpriorityqueue\u002FMinIndexedDHeap.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KxzhEQ-zpDc) [Queue](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fqueue)\n  - [Queue (integer only, fixed size, fast)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fqueue\u002FIntQueue.java)\n  - [Queue (linked list, generic)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fqueue\u002FQueue.java)\n- [Segment Tree](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsegmenttree)\n  - [Segment tree (array based, compact)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsegmenttree\u002FCompactSegmentTree.java)\n  - [Segment tree (pointer implementation)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsegmenttree\u002FNode.java)\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002FuUatD9AudXo) [Sparse Table](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsparsetable\u002FSparseTable.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=L3ud3rXpIxA) [Stack](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fstack)\n  - [Stack (integer only, fixed size, fast)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fstack\u002FIntStack.java)\n  - [Stack (linked list, generic)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fstack\u002FListStack.java)\n  - [Stack (array, generic)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fstack\u002FArrayStack.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=zqKlL3ZpTqs) [Suffix Array](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsuffixarray)\n  - [Suffix Array (O(n²logn) construction)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsuffixarray\u002FSuffixArraySlow.java)\n  - [Suffix Array (O(nlog²(n)) construction)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsuffixarray\u002FSuffixArrayMed.java)\n  - [Suffix Array (O(nlog(n)) construction)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Fsuffixarray\u002FSuffixArrayFast.java)\n- [Trie](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Ftrie\u002FTrie.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=ibjEGG7ylHk) [Union Find](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdatastructures\u002Funionfind\u002FUnionFind.java)\n\n# Dynamic Programming\n\n## Dynamic Programming Classics\n\n- [Coin change problem](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FCoinChange.java) **- O(nW)**\n- [Edit distance (iterative)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FEditDistanceIterative.java) **- O(nm)**\n- [Edit distance (recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FEditDistanceRecursive.java) **- O(nm)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=cJ21moQpofY) [Knapsack 0\u002F1](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FKnapsack_01.java) **- O(nW)**\n- [Knapsack unbounded (0\u002F∞)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FKnapsackUnbounded.java) **- O(nW)**\n- [Maximum contiguous subarray](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FMaximumSubarray.java) **- O(n)**\n- [Longest Common Subsequence (LCS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FLongestCommonSubsequence.java) **- O(nm)**\n- [Longest Increasing Subsequence (LIS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FLongestIncreasingSubsequence.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n- [Longest Palindrome Subsequence (LPS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FLongestPalindromeSubsequence.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=cY4HiiFHO1o) [Traveling Salesman Problem (dynamic programming, iterative)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTspDynamicProgrammingIterative.java) **- O(n\u003Csup>2\u003C\u002Fsup>2\u003Csup>n\u003C\u002Fsup>)**\n- [Traveling Salesman Problem (dynamic programming, recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTspDynamicProgrammingRecursive.java) **- O(n\u003Csup>2\u003C\u002Fsup>2\u003Csup>n\u003C\u002Fsup>)**\n- [Minimum Weight Perfect Matching (iterative, complete graph)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002FMinimumWeightPerfectMatching.java) **- O(n\u003Csup>2\u003C\u002Fsup>2\u003Csup>n\u003C\u002Fsup>)**\n\n## Dynamic Programming Problem Examples\n\n### Adhoc\n\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=_tur2nPkIKo) [Magic Cows](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002Fexamples\u002Fmagicalcows\u002FMagicalCows.java)\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002FoQQO_n57SB0) [Narrow Art Gallery](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002Fexamples\u002Fnarrowartgallery\u002FNarrowArtGalleryRecursive.java)\n\n### Tiling problems\n\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002Fyn2jnmlepY8) [Tiling Dominoes](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002Fexamples\u002Ftilingdominoes\u002FTilingDominoes.java)\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=CecjOo4Zo-g) [Tiling Dominoes and Trominoes](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002Fexamples\u002Fdominoandtrominotiling)\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002FpPgBZqY_Xh0) [Mountain Scenes](https:\u002F\u002Fgithub.com\u002Fwilliamfiset\u002FAlgorithms\u002Fblob\u002Fmaster\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fdp\u002Fexamples\u002Fscenes\u002FScenes.java)\n\n# Geometry\n\n- [Angle between 2D vectors](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FAngleBetweenVectors2D.java) **- O(1)**\n- [Circle-circle intersection point(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FCircleCircleIntersectionPoints.js) **- O(1)**\n- [Circle-line intersection point(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineCircleIntersection.js) **- O(1)**\n- [Circle-line segment intersection point(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineSegmentCircleIntersection.js) **- O(1)**\n- [Circle-point tangent line(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FPointCircleTangent.java) **- O(1)**\n- [Closest pair of points (line sweeping algorithm)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FClosestPairOfPoints.java) **- O(nlog(n))**\n- [Collinear points test (are three 2D points on the same line)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FCollinearPoints.java) **- O(1)**\n- [Convex hull (Graham Scan algorithm)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FConvexHullGrahamScan.java) **- O(nlog(n))**\n- [Convex hull (Monotone chain algorithm)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FConvexHullMonotoneChainsAlgorithm.java) **- O(nlog(n))**\n- [Convex polygon area](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FConvexPolygonArea.java) **- O(n)**\n- [Convex polygon contains points](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FConvexPolygonContainsPoint.java) **- O(log(n))**\n- [Triangle area algorithms](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FTriangleArea.java) **- O(1)**\n- [Line segment-circle intersection point(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineSegmentCircleIntersection.js) **- O(1)**\n- [Line segment-line segment intersection](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineSegmentLineSegmentIntersection.java) **- O(1)**\n\n\u003Cdetails>\n\u003Csummary>More geometry algorithms\u003C\u002Fsummary>\n\n- [Angle between 3D vectors](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FAngleBetweenVectors3D.java) **- O(1)**\n- [Convex polygon cut](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FConvexPolygonCutWithLineSegment.java) **- O(n)**\n- [Coplanar points test (are four 3D points on the same plane)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FCoplanarPoints.java) **- O(1)**\n- [Line class (handy infinite line class)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLine.java) **- O(1)**\n- [Line-circle intersection point(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineCircleIntersection.js) **- O(1)**\n- [Line segment to general form (ax + by = c)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLineSegmentToGeneralForm.java) **- O(1)**\n- [Longitude-Latitude geographic distance](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FLongitudeLatitudeGeographicDistance.java) **- O(1)**\n- [Point is inside triangle check](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FPointInsideTriangle.java) **- O(1)**\n- [Point rotation about point](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FPointRotation.java) **- O(1)**\n- [[UNTESTED] Circle-circle intersection area](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FCircleCircleIntersectionArea.java) **- O(1)**\n- [[UNTESTED] Circular segment area](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgeometry\u002FCircularSegmentArea.java) **- O(1)**\n\n\u003C\u002Fdetails>\n\n# Graph theory\n\n### Tree algorithms\n\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=2FFq2_je7Lg) [Rooting an undirected tree](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Ftreealgorithms\u002FRootingTree.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=OCKvEMF0Xac) [Identifying isomorphic trees](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Ftreealgorithms\u002FTreeIsomorphism.java) **- O(V*log(V))**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=nzF_9bjDzdc) [Tree center(s)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Ftreealgorithms\u002FTreeCenter.java) **- O(V+E)**\n- [Tree diameter](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Ftreealgorithms\u002FTreeDiameter.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=sD1IoalFomA) [Lowest Common Ancestor (LCA, Euler tour)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Ftreealgorithms\u002FLowestCommonAncestorEulerTour.java) **- O(1) queries, O(nlogn) preprocessing**\n\n### Network flow\n\n- [Bipartite graph verification (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FBipartiteGraphCheckAdjacencyList.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=LdOnanfc5TM) [Max flow & Min cut (Ford-Fulkerson with DFS, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FFordFulkersonDfsSolverAdjacencyList.java) **- O(fE)**\n- [Max flow & Min cut (Ford-Fulkerson with DFS, adjacency matrix)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FFordFulkersonDFSAdjacencyMatrix.java) **- O(fV\u003Csup>2\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=RppuJYwlcI8) [Max flow & Min cut (Edmonds-Karp, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FEdmondsKarpAdjacencyList.java) **- O(VE\u003Csup>2\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002F1ewLrXUz4kk) [Max flow & Min cut (Capacity scaling, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FCapacityScalingSolverAdjacencyList.java) **- O(E\u003Csup>2\u003C\u002Fsup>log\u003Csub>2\u003C\u002Fsub>(U))**\n- [:movie_camera:](https:\u002F\u002Fyoutu.be\u002FM6cm8UeeziI) [Max flow & Min cut (Dinic's, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FDinics.java) **- O(EV\u003Csup>2\u003C\u002Fsup>) or O(E√V) for bipartite graphs**\n- [Maximum Cardinality Bipartite Matching (augmenting path algorithm, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FMaximumCardinalityBipartiteMatchingAugmentingPathAdjacencyList.java) **- O(VE)**\n- [Min Cost Max Flow (Bellman-Ford, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FMinCostMaxFlowWithBellmanFord.java) **- O(E\u003Csup>2\u003C\u002Fsup>V\u003Csup>2\u003C\u002Fsup>)**\n- [Min Cost Max Flow (Johnson's algorithm, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002Fnetworkflow\u002FMinCostMaxFlowJohnsons.java) **- O(E\u003Csup>2\u003C\u002Fsup>Vlog(V))**\n\n### Main graph theory algorithms\n\n- [Articulation points\u002Fcut vertices (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FArticulationPointsAdjacencyList.java) **- O(V+E)**\n- [Bellman-Ford (edge list, negative cycles, fast & optimized)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FBellmanFordEdgeList.java) **- O(VE)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=lyw4FaxrwHg) [Bellman-Ford (adjacency list, negative cycles)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FBellmanFordAdjacencyList.java) **- O(VE)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=oDqjPvD54Ss) [Breadth first search (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FBreadthFirstSearchAdjacencyList.java) **- O(V+E)**\n- [Bridges\u002Fcut edges (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FBridgesAdjacencyList.java) **- O(V+E)**\n- [Boruvkas (adjacency list, min spanning tree algorithm)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FBoruvkas.java) **- O(Elog(V))**\n- [Find connected components (adjacency list, union find)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FConnectedComponentsUnionFind.java) **- O(V+E)**\n- [Find connected components (adjacency list, DFS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FConnectedComponentsDfs.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=7fujbpJ0LB4) [Depth first search (adjacency list, recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FDepthFirstSearchAdjacencyListRecursive.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=pSqmAO-m7Lk) [Dijkstra's shortest path (adjacency list, lazy implementation)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FDijkstrasShortestPathAdjacencyList.java) **- O(Elog(V))**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=pSqmAO-m7Lk) [Dijkstra's shortest path (adjacency list, eager implementation + D-ary heap)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FDijkstrasShortestPathAdjacencyListWithDHeap.java) **- O(Elog\u003Csub>E\u002FV\u003C\u002Fsub>(V))**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=8MpoO2zA2l4) [Eulerian Path (directed edges)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FEulerianPathDirectedEdgesAdjacencyList.java) **- O(E+V)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=4NQ3HnhyNfQ) [Floyd Warshall algorithm (adjacency matrix, negative cycle check)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FFloydWarshallSolver.java) **- O(V\u003Csup>3\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=cIBFEhD77b4) [Kahn's algorithm (topological sort, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FKahns.java) **- O(E+V)**\n- [Kruskal's min spanning tree algorithm (edge list, union find)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FKruskalsEdgeList.java) **- O(Elog(E))**\n- [Kosaraju's strongly connected components algorithm (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FKosaraju.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=jsmMtJpPnhU) [Prim's min spanning tree algorithm (lazy version, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FLazyPrimsAdjacencyList.java) **- O(Elog(E))**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=xq3ABa-px_g) [Prim's min spanning tree algorithm (eager version, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FEagerPrimsAdjacencyList.java) **- O(Elog(V))**\n- [Steiner tree (minimum spanning tree generalization)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FSteinerTree.java) **- O(V\u003Csup>3\u003C\u002Fsup> + V\u003Csup>2\u003C\u002Fsup> · 2\u003Csup>T\u003C\u002Fsup> + V · 3\u003Csup>T\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=wUgWX0nc4NY) [Tarjan's strongly connected components algorithm (adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTarjanSccSolverAdjacencyList.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=eL-KzMXSXXI) [Topological sort (acyclic graph, adjacency list)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTopologicalSortAdjacencyList.java) **- O(V+E)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=cY4HiiFHO1o) [Traveling Salesman Problem (dynamic programming, iterative)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTspDynamicProgrammingIterative.java) **- O(n\u003Csup>2\u003C\u002Fsup>2\u003Csup>n\u003C\u002Fsup>)**\n- [Traveling Salesman Problem (dynamic programming, recursive)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fgraphtheory\u002FTspDynamicProgrammingRecursive.java) **- O(n\u003Csup>2\u003C\u002Fsup>2\u003Csup>n\u003C\u002Fsup>)**\n\n# Linear algebra\n\n- [Freivald's algorithm (matrix multiplication verification)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FFreivaldsAlgorithm.java) **- O(kn\u003Csup>2\u003C\u002Fsup>)**\n- [Gaussian elimination (solve system of linear equations)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FGaussianElimination.java) **- O(cr\u003Csup>2\u003C\u002Fsup>)**\n- [Gaussian elimination (modular version, prime finite field)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FModularLinearAlgebra.java) **- O(cr\u003Csup>2\u003C\u002Fsup>)**\n- [Linear recurrence solver (finds nth term in a recurrence relation)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FLinearRecurrenceSolver.java) **- O(m\u003Csup>3\u003C\u002Fsup>log(n))**\n- [Matrix determinant (Laplace\u002Fcofactor expansion)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FMatrixDeterminantLaplaceExpansion.java) **- O((n+2)!)**\n- [Matrix inverse](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FMatrixInverse.java) **- O(n\u003Csup>3\u003C\u002Fsup>)**\n- [Matrix multiplication](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FMatrixMultiplication.java) **- O(n\u003Csup>3\u003C\u002Fsup>)**\n- [Matrix power](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FMatrixPower.java) **- O(n\u003Csup>3\u003C\u002Fsup>log(p))**\n- [Square matrix rotation](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Flinearalgebra\u002FRotateSquareMatrixInplace.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n\n# Mathematics\n\n- [Chinese remainder theorem](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FChineseRemainderTheorem.java)\n- [Prime number sieve (sieve of Eratosthenes)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FSieveOfEratosthenes.java) **- O(nlog(log(n)))**\n- [Prime number sieve (sieve of Eratosthenes, compressed)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FCompressedPrimeSieve.java) **- O(nlog(log(n)))**\n- [Totient function (phi function, relatively prime number count)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FEulerTotientFunction.java) **- O(√n)**\n- [Extended euclidean algorithm](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FExtendedEuclideanAlgorithm.java) **- ~O(log(a + b))**\n- [Greatest Common Divisor (GCD)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FGcd.java) **- ~O(log(a + b))**\n- [Fast Fourier transform (quick polynomial multiplication)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FFastFourierTransform.java) **- O(nlog(n))**\n- [Fast Fourier transform (quick polynomial multiplication, complex numbers)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FFastFourierTransformComplexNumbers.java) **- O(nlog(n))**\n- [Primality check](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FPrimalityCheck.java) **- O(√n)**\n- [Least Common Multiple (LCM)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FLcm.java) **- ~O(log(a + b))**\n- [Modular inverse](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FModularInverse.java) **- ~O(log(a + b))**\n- [Modular exponentiation](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FModPow.java) **- O(log(n))**\n- [Prime factorization (pollard rho)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FPrimeFactorization.java) **- O(n\u003Csup>1\u002F4\u003C\u002Fsup>)**\n- [Relatively prime check (coprimality check)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fmath\u002FRelativelyPrime.java) **- ~O(log(a + b))**\n\n# Other\n\n- [Bit manipulations](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FBitManipulations.java) **- O(1)**\n- [List permutations](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FPermutations.java) **- O(n!)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=RnlHPR0lyOE) [Power set (set of all subsets)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FPowerSet.java) **- O(n · 2\u003Csup>n\u003C\u002Fsup>)**\n- [Set combinations](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FCombinations.java) **- O(n choose r)**\n- [Set combinations with repetition](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FCombinationsWithRepetition.java) **- O((n+r-1) choose r)**\n- [Sliding Window Minimum\u002FMaximum](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FSlidingWindowMaximum.java) **- O(1)**\n- [Square Root Decomposition](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FSquareRootDecomposition.java) **- O(1) point updates, O(√n) range queries**\n- [Unique set combinations](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fother\u002FUniqueCombinations.java) **- O(n choose r)**\n\n# Search algorithms\n\n- [Binary search (real numbers)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch\u002FBinarySearch.java) **- O(log(n))**\n- [Interpolation search (discrete numbers)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch\u002FInterpolationSearch.java) **- O(n) or O(log(log(n))) with uniform input**\n- [Ternary search (real numbers)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch\u002FTernarySearch.java) **- O(log(n))**\n- [Ternary search (discrete numbers)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsearch\u002FTernarySearchDiscrete.java) **- O(log(n))**\n\n# Sorting algorithms\n\n- [Bubble sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FBubbleSort.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n- [Bucket sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FBucketSort.java) **- Θ(n + k)**\n- [Counting sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FCountingSort.java) **- O(n + k)**\n- [Heapsort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FHeapsort.java) **- O(nlog(n))**\n- [Insertion sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FInsertionSort.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=-3u1C1URNZY) [Mergesort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FMergeSort.java) **- O(nlog(n))**\n- [Quicksort (in-place, Hoare partitioning)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FQuickSort.java) **- Θ(nlog(n))**\n- [Quicksort3 (Dutch National Flag algorithm)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FQuickSort3.java) **- Θ(nlog(n))**\n- [Selection sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FSelectionSort.java) **- O(n\u003Csup>2\u003C\u002Fsup>)**\n- [Tim sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FTimSort.java) **- O(nlog(n))**\n- [Radix sort](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fsorting\u002FRadixSort.java) **- O(n\\*w)**\n\n# String algorithms\n\n- [Booth's algorithm (finds lexicographically smallest string rotation)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FBoothsAlgorithm.java) **- O(n)**\n- [Knuth-Morris-Pratt algorithm (finds pattern matches in text)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FKMP.java) **- O(n+m)**\n- [Longest Common Prefix (LCP) array](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FLongestCommonPrefixArray.java) **- O(nlog(n)) bounded by SA construction, otherwise O(n)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Ic80xQFWevc) [Longest Common Substring (LCS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FLongestCommonSubstring.java) **- O(nlog(n)) bounded by SA construction, otherwise O(n)**\n- [:movie_camera:](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=OptoHwC3D-Y) [Longest Repeated Substring (LRS)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FLongestRepeatedSubstring.java) **- O(nlog(n))**\n- [Manacher's algorithm (finds all palindromes in text)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FManachersAlgorithm.java) **- O(n)**\n- [Rabin-Karp algorithm (finds pattern match positions in text)](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FRabinKarp.java) **- O(n+m)**\n- [Substring verification with suffix array](src\u002Fmain\u002Fjava\u002Fcom\u002Fwilliamfiset\u002Falgorithms\u002Fstrings\u002FSubstringVerificationSuffixArray.java) **- O(nlog(n)) SA construction and O(mlog(n)) per query**\n\n# License\n\nThis repository is released under the [MIT license](https:\u002F\u002Fopensource.org\u002Flicenses\u002FMIT). In short, this means you are free to use this software in any personal, open-source or commercial projects. Attribution is optional but appreciated.\n\n# Sponsor\n\nConsider sponsoring to support my creation of educational content:\n\n[![Sponsor](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSponsor-GitHub-ea4aaa.svg)](https:\u002F\u002Fgithub.com\u002Fsponsors\u002Fwilliamfiset)\n","该项目是一个算法和数据结构的集合，旨在展示如何以最简单优雅的方式实现常见的数据结构和算法。核心功能包括图论、动态规划、字符串处理、排序算法等在内的多种算法实现，并且提供了如AVL树、红黑树等平衡树的数据结构。技术特点上，项目使用Java语言编写，支持通过Bazel构建系统进行编译与测试，也允许仅使用JDK来运行。此外，许多算法和数据结构都有配套的YouTube视频教程，帮助理解代码背后的概念。适用于需要加强算法基础的学习者、软件开发者以及对高效编码感兴趣的任何人。",2,"2026-06-01 02:52:49","top_language"]