C-Plus-Plus 算法仓库全览:DIRECTORY.md 分类索引的导航指南与模块速查
【免费下载链接】C-Plus-PlusCollection of various algorithms in mathematics, machine learning, computer science and physics implemented in C++ for educational purposes.项目地址: https://gitcode.com/gh_mirrors/cp/C-Plus-Plus
本文以仓库根目录下的 DIRECTORY.md 为索引骨架,系统拆解这份 24 大类、360 余个条目的算法目录:它既是阅读 TheAlgorithms/C-Plus-Plus 开源仓库的"导航地图",也是快速定位任意算法实现、理解仓库模块划分的第一手资料。读完本文,你将掌握从索引条目反查源码、按分类学习算法、以及结合 CMake 构建与 Doxygen 文档生态快速上手的完整方法。
一、DIRECTORY.md 是什么:一份算法仓库的完整地图
在任何一个大型开源算法仓库中,最大的痛点不是"有没有某个算法",而是"算法放在哪里、属于哪个分类、实现长什么样"。TheAlgorithms/C-Plus-Plus 仓库用一份纯 Markdown 的 DIRECTORY.md 解决了这个问题——它用 24 个##二级标题组织起 360 余个条目,每个条目都以* 算法名的列表形式给出,一行一个算法,直接映射到仓库中真实存在的源文件。
从文档结构与仓库布局对应关系看(DIRECTORY.md 的章节名与仓库根目录下的 24 个模块目录一一对应),这份索引与仓库物理结构是严格同步的:例如## Backtracking章节对应 backtracking/ 目录,## Sorting章节对应 sorting/ 目录。这意味着你完全可以把它当作仓库的"目录表(Table of Contents)"来使用:先看章节定位领域,再看条目定位具体算法,最后通过条目中的路径直接跳进源码。
与 README.md 的定位互补:README 回答"这个仓库是什么、有什么特性、如何贡献",而 DIRECTORY.md 回答"这个仓库里具体有什么、每个算法文件在哪"。README 中声明的仓库特性——MIT 许可、面向教学的开源实现集合、同一目标往往有多种不同策略与优化的实现、严格遵循 C++17、仅依赖 STL 无外部库、程序内置自检——都可以在 DIRECTORY.md 的条目分布中得到印证(例如动态规划一章同时收录了coin_change.cpp与coin_change_topdown.cpp两种实现策略)。
二、索引的组织方式:分类、条目与命名规律
2.1 三级结构:大类 → 条目 → 源码文件
DIRECTORY.md 的格式非常规整,可总结为三级导航结构:
| 层级 | Markdown 语法 | 含义 | 示例 |
|---|---|---|---|
| 大类 | ## 名称 | 算法领域分类,对应仓库根目录下的同名目录 | ## Dynamic Programming→dynamic_programming/ |
| 条目 | * 名称 | 单个算法或头文件,名称即算法的人读名称 | * [Sudoku Solver](https://link.gitcode.com/i/c8f013262596ac8ffb963144541e5ce7) |
| 源码 | 条目链接指向的.cpp/.hpp文件 | 完整可编译实现,含文档注释与自检 | backtracking/sudoku_solver.cpp |
条目名称采用"去扩展名、空格转驼峰"的命名规律,例如count_bits_flip.cpp对应条目Count Bits Flip,n_queens_all_solution_optimised.cpp对应N Queens All Solution Optimised。反过来,当你在源码目录里看到一个xxx.cpp文件时,也可以按此规律在 DIRECTORY.md 中反查它所属的分类。
2.2 子目录嵌套:以 Data Structures 的 Cll 为例
大部分条目是扁平的,但## Data Structures章节展示了嵌套子目录的表达方式——Cll作为一个缩进的小节出现,其下再挂 3 个条目:
* Cll * [Cll](https://link.gitcode.com/i/5f75d9e5a604530224db6ca63985430c) * [Cll](https://link.gitcode.com/i/85d47acd74a2fa84f65041d79eeeee87) * [Main Cll](https://link.gitcode.com/i/7d27a3da63ac8f16b9ed6e951b8f709e)这种嵌套对应仓库中真实的 data_structures/cll/ 子目录:实现文件cll.cpp、头文件cll.h、以及演示入口main_cll.cpp被拆成三个独立条目,说明索引不仅覆盖"一个文件一个算法"的独立实现,也覆盖"头文件 + 实现 + 示例"的模块化结构。这是阅读索引时值得注意的细节:条目不一定是完整可执行程序,也可能是头文件或测试文件,例如data_structures/queue.hpp、data_structures/test_queue.cpp、ciphers/uint128_t.hpp等。
2.3 同类算法的"多实现并存"现象
README 明确指出,仓库允许同一目标存在多种不同策略和优化的实现,这一设计在索引中随处可见:
- 回溯领域同时收录 n_queens.cpp、n_queens_all_solution_optimised.cpp、nqueen_print_all_solutions.cpp 三种 N 皇后解法;
- 排序领域为归并、快排、希尔、基数、选择等经典算法各准备了多份实现,如 quick_sort.cpp、quick_sort_3.cpp、quick_sort_iterative.cpp、random_pivot_quick_sort.cpp;
- 数据结构领域同时提供 queue_using_array.cpp 与 queue_using_linked_list.cpp 等不同底层实现的队列。
这为学习带来直接好处:你可以通过索引一次性找出某个算法的全部变体,横向比较它们的时间复杂度、代码风格与适用场景,这正是"以索引为纲进行对比学习"的典型用法。
三、24 大分类全景导读:从索引到每个模块
以下按 DIRECTORY.md 的章节顺序,逐类说明模块定位,并给出各分类的代表性条目与源码路径。每一类的目录结构与 DIRECTORY.md 章节一一对应,可据此快速展开阅读。
3.1 Backtracking(回溯)
收录 13 个条目,覆盖经典搜索与约束满足问题:约束传播(Graph Coloring)、路径搜索(Rat Maze)、组合枚举(Subset Sum、Subarray Sum)、博弈搜索(Minimax)以及模式匹配(Wildcard Matching)。N 皇后与数独(Sudoku Solver)的多版本并存尤其适合做回溯剪枝策略的对比练习。
3.2 Bit Manipulation(位运算)
10 个条目聚焦位级技巧:基础判断(Power Of 2、Set Kth Bit)、位计数(Count Of Set Bits)、距离度量(Hamming Distance)、编码(Gray Code),以及用位掩码压缩状态的 DP 应用(Travelling Salesman Using Bit Manipulation)。值得留意的是,实际目录中还存在 check_even_odd.cpp 等文件,说明索引与实际源码目录之间可能存在轻微滞后,以 DIRECTORY.md 为准导航、以目录清单为准核对,是最稳妥的组合用法。
3.3 Ciphers(密码学)
11 个条目构成一个小型密码学工具箱:古典替换密码(Caesar Cipher、Atbash Cipher、Vigenere Cipher)、编码(Base64 Encoding、Morse Code、A1Z26 Cipher)、现代密码协议(Elliptic Curve Key Exchange),以及两个大整数头文件 uint128_t.hpp 与 uint256_t.hpp,后者为超出内置整数范围的密码运算提供了基础类型。
3.4 Cpu Scheduling Algorithms(CPU 调度算法)
仅 2 个条目但主题集中,对应操作系统课程的核心内容:Fcfs Scheduling(先来先服务)与 Non Preemptive Sjf Scheduling(非抢占式短作业优先)。适合在学习进程调度时对照实现理解平均等待时间的差异。
3.5 Data Structures(数据结构)
索引中条目最多的模块之一(38 个条目),覆盖线性结构(Linked List、Doubly Linked List、各类 Stack/Queue 实现)、树结构(Avltree、Rb Tree、Treap、Tree 234)、高级结构(Bloom Filter、Skip List、Segment Tree、Sparse Table)、并查集(Disjoint Set、Dsu Path Compression、Dsu Union Rank)以及字典树三连(Trie Modern、Trie Tree、Trie Using Hashmap)。该模块还包含头文件(node.hpp、queue.hpp、stack.hpp)与测试文件(test_queue.cpp、test_stack.cpp),阅读时需区分"可独立运行的程序"与"供复用的组件"。
3.6 Divide And Conquer(分治)
两个重量级算法:Karatsuba Algorithm For Fast Multiplication(大整数快速乘法)与 Strassen Matrix Multiplication(矩阵快速乘法),都是突破朴素复杂度的经典分治范例,适合验证"通过减少子问题个数来降低总复杂度"的核心思想。
3.7 Dynamic Programming(动态规划)
32 个条目,是仓库中内容最丰富的领域之一,覆盖 DP 的几乎所有经典范式:背包系列(0 1 Knapsack、Unbounded 0 1 Knapsack)、区间 DP(Matrix Chain Multiplication、Palindrome Partitioning)、序列 DP(Longest Common Subsequence、Longest Increasing Subsequence 及其 O(n log n) 优化版、Edit Distance)、一维 DP(House Robber、Kadane、Catalan Numbers)、图论 DP(Bellman Ford、Floyd Warshall)以及状态压缩(Egg Dropping Puzzle)。同题多解在此体现得尤为明显(如coin_change的 bottom-up 与 topdown 两个版本),是理解"状态定义与转移方向"差异的理想素材。
3.8 Games 与 Graphics(游戏与图形)
这两个模块各含 1 个条目:Memory Game 是一个基于控制台/内存操作的小游戏示例;Spirograph 则用图形方式演示摆线绘制。它们展示了算法仓库中"趣味性"与"可视化"的一面,适合作为学习完基础语法后的综合练习参考。
3.9 Geometry(计算几何)
4 个条目构成计算几何基础套件:凸包算法两件套(Graham Scan Algorithm 与配套头文件 graham_scan_functions.hpp、Jarvis Algorithm)以及 Line Segment Intersection(线段相交判定)。注意 Graham Scan 也是"头文件 + 实现"的模块化结构示例。
3.10 Graph(图算法)
21 个条目,是仓库另一大核心模块,几乎覆盖图论课程全部主题:遍历(Breadth First Search、Depth First Search 及其栈实现版)、最短路(Dijkstra、Bidirectional Dijkstra)、最小生成树(Prim、Kruskal)、强连通与割点(Kosaraju、Bridge Finding With Tarjan Algorithm)、二分图(Is Graph Bipartite、Is Graph Bipartite2)、网络流(Max Flow With Ford Fulkerson And Edmond Karp Algo)、最大匹配(Hopcroft Karp)以及拓扑排序双版本(递归版 Topological Sort 与 Kahn 算法版 Topological Sort By Kahns Algo)。
3.11 Greedy Algorithms(贪心算法)
10 个条目:调度与匹配(Gale Shapley)、编码(Huffman)、最小生成树贪心视角(Boruvkas Minimum Spanning Tree、Kruskals Minimum Spanning Tree、Prims Minimum Spanning Tree)、以及 Dijkstra Greedy(与 graph 模块的 Dijkstra 实现互为印证)。贪心算法与 DP、图算法在仓库中形成交叉,恰好体现"同一问题多视角实现"的仓库特色。
3.12 Hashing(哈希)
7 个条目涵盖哈希技术的多个层次:冲突解决策略三件套(Chaining 链地址法、Linear Probing Hash Table 线性探测、Quadratic Probing Hash Table 二次探测、Double Hash Hash Table 双重哈希),以及三个密码学哈希算法实现(Md5、Sha1、Sha256)。想对比开放寻址与链地址的优劣、或学习哈希函数的迭代压缩过程,这个模块是最直接的入口。
3.13 Machine Learning(机器学习)
8 个条目以"从零实现"的方式覆盖经典 ML 算法:搜索(A Star Search)、线性模型(Adaline Learning、Ordinary Least Squares Regressor)、实例学习(K Nearest Neighbors,配套数据文件 iris.csv)、无监督(Kohonen Som Topology、Kohonen Som Trace)、神经网络(Neural Network)以及向量运算头文件 vector_ops.hpp。这些实现不依赖任何第三方 ML 框架,是理解算法数学原理的极佳参照。
3.14 Math(数学)
60 个条目,是仓库中数量最多的分类,按内容可进一步归组:
- 数论:素数判定与筛法(Check Prime、Eratosthenes、Sieve Of Eratosthenes、Miller Rabin)、GCD/LCM 系列(Gcd Iterative Euclidean、Gcd Recursive Euclidean、Least Common Multiple)、模运算(Modular Exponentiation、Modular Inverse Fermat Little Theorem)、数论函数(Eulers Totient Function、Number Of Positive Divisors);
- 组合数学:Binomial Calculate、N Choose R、Ncr Modulo P;
- 数列与递推:Fibonacci 家族(Fibonacci、Fibonacci Fast、Fibonacci Matrix Exponentiation)、N Bonacci、Linear Recurrence Matrix;
- 阶乘与大数:Factorial、Large Factorial、Large Number;
- 几何与数值工具:Area、Volume、Vector Cross Product、Complex Numbers。
3.15 Numerical Methods(数值方法)
23 个条目,构成一个小型数值分析库:方程求根(Bisection Method、False Position、Newton Raphson Method、Brent Method Extrema)、数值积分(Composite Simpson Rule、Midpoint Integral Method)、ODE 求解(Ode Forward Euler、Ode Midpoint Euler、Ode Semi Implicit Euler、Rungekutta)、线性代数(Gaussian Elimination、Lu Decompose 及头文件 lu_decomposition.h、Qr Decomposition 及 qr_decompose.h、Qr Eigen Values)、正交化(Gram Schmidt)以及信号处理(Fast Fourier Transform、Inverse Fast Fourier Transform)。
3.16 Operations On Datastructures(数据结构操作)
12 个条目专注于"对既有数据结构的操作技巧",与 Data Structures 模块互为补充:数组旋转(Array Left Rotation、Array Right Rotation)、链表操作(Get Size Of Linked List、Reverse A Linked List Using Recusion、Selectionsortlinkedlist)、集合运算(Intersection Of Two Arrays、Union Of Two Arrays)、树操作(Inorder Successor Of Bst、Reverse Binary Tree)以及字典树扩展(Trie Multiple Search)。
3.17 Others(其他)
28 个条目收录难以归入上述大类的实用小程序:数字与进制转换(Decimal To Binary、Decimal To Hexadecimal、Decimal To Roman Numeral)、缓存策略(Lru Cache、Lfu Cache)、经典益智(Tower Of Hanoi、Happy Number)、表达式与括号处理(Paranthesis Matching、Postfix Evaluation)、模式打印(Pascal Triangle、Spiral Print、Stairs Pattern)以及 Fast Integer Input 这类性能技巧。
3.18 Physics、Probability、Range Queries
- Physics(1 个条目):Ground To Ground Projectile Motion,抛体运动仿真,展示数值计算在物理模拟中的应用;
- Probability(7 个条目):概率论基础公式与常见分布实现,包括 Addition Rule、Bayes Theorem、Binomial Dist、Exponential Dist、Geometric Dist、Poisson Dist,以及数据结构化的 Windowed Median;
- Range Queries(7 个条目):区间查询全家桶——Fenwick Tree、Segtree、Sparse Table Range Queries、Prefix Sum Array、Heavy Light Decomposition、Mo(莫队算法)、Persistent Seg Tree Lazy Prop(可持久化线段树 + 懒标记)。从静态到动态、从离线到可持久化,这个模块是学习区间数据结构演进的绝佳序列。
3.19 Search 与 Sorting(搜索与排序)
- Search(16 个条目):线性搜索(Linear Search)、二分及其变体(Binary Search、Ternary Search、Jump Search、Exponential Search、Fibonacci Search、Interpolation Search)、特殊结构搜索(Hash Search、Sublist Search、Saddleback Search、Text Search)以及检测算法(Floyd Cycle Detection Algo);
- Sorting(44 个条目):覆盖全部经典排序——比较排序(Bubble Sort、Insertion Sort、Selection Sort Iterative、Merge Sort、Heap Sort、Quick Sort)、非比较排序(Counting Sort、Radix Sort、Bucket Sort、Pigeonhole Sort)、复杂/变种排序(Tim Sort、Shell Sort、Comb Sort、Stooge Sort、Strand Sort)以及趣味算法(Bogo Sort、Slow Sort)。44 个条目中的大量"同题异构",使 Sorting 成为对比不同排序策略复杂度的最佳分类。
3.20 Strings(字符串)
8 个条目覆盖字符串匹配与处理的主流算法:Brute Force String Searching(朴素匹配)、Knuth Morris Pratt(KMP)、Rabin Karp(滚动哈希)、Boyer Moore 与 Horspool(跳跃式匹配)、Z Function(Z 算法)、Manacher Algorithm(回文子串)、Duval(最小循环节/Lyndon 分解)。想系统学习字符串匹配的演进,按此目录顺序阅读即可形成完整知识链。
四、从索引到实践:如何用 DIRECTORY.md 定位并运行一个算法
DIRECTORY.md 的价值在于"索引 → 源码 → 运行"的闭环。以查找并运行一个排序算法为例:
第一步,定位:在## Sorting章节找到* [Merge Sort](https://link.gitcode.com/i/a81db98747ae338cb5559e022cb31728),得到源码路径sorting/merge_sort.cpp。
第二步,阅读:打开 sorting/merge_sort.cpp,可以看到仓库源码的通用编写规范(这一点与 CodingGuidelines.md 相呼应):文件头部的@brief、@details文档注释说明算法原理与复杂度;函数实现使用 STL(如std::vector、std::sort仅用于测试对比)且不依赖外部库;main()末尾带有自检逻辑(self_test()),确保实现正确性。
第三步,运行:仓库采用 CMake 构建,所有.cpp文件都会由各子目录的 CMakeLists 自动收集并编译成同名可执行文件。以 sorting/CMakeLists.txt 为例,它通过file(GLOB APP_SOURCES RELATIVE ... *.cpp)收集目录下全部源文件,再在foreach循环中为每个源文件add_executable并install到bin/sorting。因此无需为单个算法手写构建脚本:
# 在仓库根目录配置并构建(需 CMake 3.22+) cmake -B build -S . cmake --build build --target merge_sort # 直接运行编译产物 ./build/sorting/merge_sort根目录 CMakeLists.txt 还说明了整个仓库的构建约定:强制 C++17 标准(CMAKE_CXX_STANDARD 17)、开启-Wall -Wextra严格告警、提供USE_OPENMP选项(默认 ON)以启用 OpenMP 多线程加速(若找到 OpenMP 3.0 则各子目录可执行文件自动链接OpenMP::OpenMP_CXX)、并通过add_subdirectory一次性挂载全部 24 个模块目录。README 声明源码在 Windows(MSVC 19 2022)、macOS(AppleClang 15.0.15)、Ubuntu/Linux(GNU 13.3.0)三个平台均通过 CI 编译测试,因此上述构建流程在上述环境下均可复现。
五、DIRECTORY.md 与文档生态:索引如何进入 Doxygen 文档
DIRECTORY.md 不是孤立的文件,它与仓库的文档生成体系紧密相关。根目录 CMakeLists.txt 在检测到 Doxygen 时会注册一个名为doc的构建目标,使用 doc/Doxyfile 作为配置,从源码直接生成在线文档(README 中说明文档站点由仓库源码直接生成,包含源码片段、执行细节、程序流程图示与 STL 链接)。Doxyfile 中的关键配置与 DIRECTORY.md 的分工如下:
| Doxyfile 配置项 | 值 | 与索引的关系 |
|---|---|---|
PROJECT_NAME | TheAlgorithms/C++ | 文档站点标题,与仓库项目名一致 |
PROJECT_BRIEF | All the algorithms implemented in C++ | 站点简介 |
INPUT/RECURSIVE | 空 /YES | 由 CMake 的doxygen_add_docs注入源码目录并递归扫描,覆盖 DIRECTORY.md 中的全部条目 |
SOURCE_BROWSER/INLINE_SOURCES | YES/YES | 生成可浏览的源码页面,相当于把索引条目的"链接目标"变成可视化页面 |
EXCLUDE_PATTERNS | */build/* | 排除构建产物,保证索引对应的是真实源码 |
USE_MDFILE_AS_MAINPAGE | 空 | 主页面由 README(含#mainpage标记)承担,DIRECTORY.md 则以目录文件形式被索引 |
GENERATE_HTML/GENERATE_LATEX | YES/YES | 同时输出 HTML(build/html)与 LaTeX(build/latex)两种格式 |
HTML_HEADER/HTML_EXTRA_STYLESHEET | doc/html/header.html / doc/styles/doxygen-awesome.css | 自定义页面头与主题样式 |
HAVE_DOT | YES | 允许生成调用关系图等图形化内容 |
构建文档的目标命令为:
cmake --build build --target doc在 Doxygen 生成的站点中,读者既可以通过"Files"菜单浏览全部被文档化的文件(README 对此有明确说明),也可以对照 DIRECTORY.md 的分类心智模型快速定位目标算法——这正是索引文件在"人读"(仓库导航)与"机读"(文档生成)两个层面上的双重价值。
六、把 DIRECTORY.md 当作"可检索的知识地图"来用
对开发者、Agent 与 LLM 而言,DIRECTORY.md 还是一种高度结构化的知识检索入口,其价值体现在三个层面:
1. 按问题反查算法。遇到"最长上升子序列的 O(n log n) 解法"这类问题,直接在索引中检索Longest Increasing Subsequence,可同时命中 dynamic_programming/longest_increasing_subsequence.cpp、dynamic_programming/longest_increasing_subsequence_nlogn.cpp 与 search/longest_increasing_subsequence_using_binary_search.cpp 三个条目,一次获取三种视角。
2. 按知识体系系统学习。索引的分类本身就是一张算法课程大纲:Search → Sorting → Data Structures → Graph → Dynamic Programming → Greedy → Numerical Methods,顺着章节顺序阅读即可建立从基础到进阶的完整知识链路。
3. 作为代码检索的补充索引。虽然常规代码检索工具可以按文件名搜到n_queens.cpp,但 DIRECTORY.md 提供了语义化的别名(如N Queens All Solution Optimised),对不熟悉仓库命名规则的检索者而言命中率更高。
使用时有一点需要留意:从仓库实际目录清单与 DIRECTORY.md 条目的对照可以推断,索引可能存在少量滞后(例如 bit_manipulation 目录中实际存在而索引未收录的 check_even_odd.cpp,graph 目录中未出现在索引里的 number_of_paths.cpp 等)。因此导航以 DIRECTORY.md 为主,核对以实际目录清单为准,两者结合可避免遗漏。
七、结语:一份索引,串起整个算法仓库
DIRECTORY.md 虽是一份纯列表文件,却是 TheAlgorithms/C-Plus-Plus 仓库中最具导航价值的文档:它以 24 个大类、360 余个条目完整映射了仓库的物理结构与知识体系,从回溯、动态规划到图算法、数值方法,从经典排序到机器学习与密码学,一条链接直达一份可编译、可运行、带自检的 C++17 实现。配合 README.md 了解仓库定位、配合根目录与各子目录的 CMakeLists.txt 完成构建运行、配合 doc/Doxyfile 生成可视化文档,你就能以这份索引为起点,高效地把整个仓库变成自己的算法学习与实践工具箱。
【免费下载链接】C-Plus-PlusCollection of various algorithms in mathematics, machine learning, computer science and physics implemented in C++ for educational purposes.项目地址: https://gitcode.com/gh_mirrors/cp/C-Plus-Plus
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考