- 教育
【免费下载链接】JavaScript
Algorithms and Data Structures implemented in JavaScript for beginners, following best practices.
本指南围绕仓库根目录下的 DIRECTORY.md 展开,它是 TheAlgorithms/JavaScript 仓库的“算法总索引”——以 21 个技术分类、约 370 个实现文件,完整映射了仓库内所有算法与数据结构的存放位置。读完本文,你将掌握如何按分类快速定位任意算法源码、如何通过配套测试验证其正确性、以及如何理解每个分类背后的编程主题与实现风格,从而把这份面向初学者的算法库真正用起来。
一、DIRECTORY.md 在仓库中的定位:算法库的“导航地图”
TheAlgorithms/JavaScript 是一个用 JavaScript 实现算法与数据结构的开源仓库,其 README.md 明确写道:这些实现“仅供教学演示(for demonstrative purposes only)”,并建议在性能与安全敏感场景使用专门的实现。仓库同时强调,贡献者应先阅读 CONTRIBUTING.md。
而 DIRECTORY.md 正是 README 中提到的算法清单(directory):它把仓库中每一个实现文件按技术主题归类,以“分类 → 文件”的二级目录形式呈现。对读者而言,它的价值有三:
- 快速检索:不需要逐个翻目录,直接按分类名定位你关心的算法文件;
- 学习路线图:分类本身就构成了一套 CS 课程式知识图谱——回溯、位运算、动态规划、图论、排序、字符串……;
- 贡献入口:想为仓库添加新算法时,先在 DIRECTORY.md 中确认是否已存在同类实现,避免重复。
从文件结构看,DIRECTORY.md 中的每一个条目都对应仓库根目录下的一个真实文件,例如* [BinarySearch](https://link.gitcode.com/i/ca785e223f61ddcc6e20e8eaedf5e352)即指向Search/BinarySearch.js。这意味着这份目录是机器可读、可点击、可校验的——它本身就是仓库“内容清单”的权威来源。
二、目录整体结构:21 个分类、约 370 个实现
逐行统计 DIRECTORY.md,仓库共有21 个顶层分类,合计约 370 个.js实现文件(含嵌套分类)。整体结构如下:
| 分类(顶层目录) | 实现文件数(约) | 主题 |
|---|---|---|
| Backtracking | 9 | 回溯算法(N 皇后、数独、骑士巡游等) |
| Bit-Manipulation | 9 | 位运算技巧 |
| Cache | 3 | 缓存策略(LRU、LFU、Memoize) |
| Cellular-Automata | 2 | 元胞自动机(生命游戏等) |
| Ciphers | 9 | 古典与现代加密算法 |
| Compression | 1 | 压缩算法(RLE) |
| Conversions | 29 | 进制、单位、日期等转换 |
| Data-Structures | 29 | 基础数据结构(含 8 个子分类) |
| Dynamic-Programming | 32 | 动态规划(含 Sliding-Window 子目录) |
| Geometry | 5 | 几何计算 |
| Graphs | 17 | 图算法 |
| Hashes | 3 | 哈希算法(MD5、SHA1、SHA256) |
| Maths | 96 | 数学算法(最大分类) |
| Navigation | 1 | 导航计算(Haversine) |
| Project-Euler | 26 | 欧拉计划题目解答 |
| Recursive | 12 | 递归实现 |
| Search | 13 | 搜索算法 |
| Sorts | 34 | 排序算法 |
| String | 40 | 字符串处理 |
| Timing-Functions | 3 | 时间/日期函数 |
| Trees | 3 | 树遍历与树状结构 |
其中Maths、String、Sorts是体量最大的三个分类,合计约占全仓库一半的实现;Data-Structures与Dynamic-Programming则采用了嵌套子分类结构(例如Data-Structures/Linked-List/、Dynamic-Programming/Sliding-Window/),体现“数据结构家族”与“DP 技法家族”的归类逻辑。
三、分类逐层解读:从回溯到树的实现图谱
3.1 Backtracking:经典搜索问题的回溯求解
该分类收录 9 个文件,全部是回溯法的教科书级案例:
- NQueens:N 皇后问题;
- Sudoku:数独求解;
- KnightTour:骑士巡游;
- RatInAMaze:迷宫寻路;
- MColoringProblem:图着色问题;
- SumOfSubset:子集和问题;
- GeneratePermutations 与 AllCombinationsOfSizeK:排列与组合生成;
- generateParentheses:括号生成。
配套测试位于 Backtracking/tests/,如 NQueens.test.js、Sudoku.test.js 等,与实现文件一一对应。
3.2 位运算与缓存:Bit-Manipulation 与 Cache
Bit-Manipulation 收录 9 个位操作技巧,例如 BinaryCountSetBits(统计置位数)、IsPowerOfTwo、IsPowerofFour、NextPowerOfTwo、GrayCodes(格雷码)、UniqueElementInAnArray(异或找唯一元素)等,测试位于 Bit-Manipulation/test/。
Cache 分类则聚焦缓存淘汰策略:LRUCache(最近最少使用)、LFUCache(最不经常使用)、Memoize(函数记忆化),对应测试见 Cache/test/。
3.3 Data-Structures:数据结构家族
该分类是嵌套最深的一个,8 个子分类共 29 个实现:
- Array:QuickSelect、Reverse、局部最大值相关实现等;
- Graph:Graph、Graph2、Graph3;
- Heap:BinaryHeap、MinPriorityQueue、KeyPriorityQueue;
- Linked-List:SinglyLinkedList、DoublyLinkedList、SinglyCircularLinkedList、CycleDetection 等 8 个文件;
- Queue:Queue、CircularQueue、QueueUsing2Stacks;
- Stack:Stack、StackES6、EvaluateExpression(表达式求值);
- Tree:BinarySearchTree、AVLTree、SegmentTree、Trie;
- Vectors:Vector2(二维向量)。
以 SinglyLinkedList.js 为例,该实现以Node类(data+next)与LinkedList类组织,类头注释直接列出全部 API:size, head, addLast, addFirst, addAt, removeFirst, removeLast, remove, removeAt, indexOf, isEmpty, elementAt, findMiddle, get, clean, rotateListRight——这份注释本身就是一份使用方法速查表。
3.4 图论与动态规划:Graphs 与 Dynamic-Programming
Graphs 分类收录 17 个图算法,覆盖最短路径(Dijkstra、BellmanFord、FloydWarshall、BreadthFirstShortestPath)、遍历(BreadthFirstSearch、DepthFirstSearchIterative、DepthFirstSearchRecursive)、最小生成树(KruskalMST、PrimMST)、连通性(Kosaraju、ConnectedComponents、NumberOfIslands)以及 LCA(LCABinaryLifting、BinaryLifting)等。
Dynamic-Programming 分类收录 32 个 DP 实现,除 ClimbingStairs、CoinChange、ZeroOneKnapsack、EditDistance、LongestCommonSubsequence、LongestIncreasingSubsequence、KadaneAlgo 等经典问题外,还设有Sliding-Window子分类(HouseRobber、LongestSubstringWithoutRepeatingCharacters、MaxConsecutiveOnesIII 等 5 个文件)。
3.5 Maths:规模最大的数学算法集
Maths 是 DIRECTORY.md 中最大的分类,约 96 个文件,覆盖面极广:
- 数论:PrimeCheck、PrimeFactors、SieveOfEratosthenes、LinearSieve、EulersTotientFunction、MobiusFunction、ExtendedEuclideanGCD、FindHcf、FindLcm;
- 斐波那契家族:Fibonacci 单个文件就导出了 7 种实现(见下文源码剖析);
- 级数与积分:SumOfGeometricProgression、MidpointIntegration、SimpsonIntegration、BisectionMethod、EulerMethod;
- 矩阵:MatrixMultiplication、MatrixExponentiationRecursive、Determinant、RowEchelon;
- 统计与机器学习基础:AverageMean、AverageMedian、MeanAbsoluteDeviation、MeanSquareError、Softmax;
- 其他:进制、数列(CollatzSequence、LucasSeries)、算法(ShorsAlgorithm、PiApproximationMonteCarlo)等。
3.6 排序、搜索与字符串:三大应用分类
- Sorts(34 个):从基础的 BubbleSort、InsertionSort、SelectionSort,到进阶的 QuickSort、MergeSort、HeapSort、RadixSort、TimSort,再到趣味实现 BogoSort、BeadSort、StoogeSort,以及 DutchNationalFlagSort、FisherYatesShuffle 等特殊场景排序,另有 TopologicalSort(拓扑排序);
- Search(13 个):包含 BinarySearch、LinearSearch、JumpSearch、ExponentialSearch、InterpolationSearch、TernarySearch、FibonacciSearch、RabinKarp(字符串匹配)、UnionFind(并查集)、SlidingWindow 等;
- String(40 个):覆盖字符串校验(ValidateEmail、ValidateCreditCard、CheckAnagram、CheckPangram)、大小写风格(CheckCamelCase、CheckKebabCase、CheckSnakeCase、CheckPascalCase)、模式匹配(KMPPatternSearching、BoyerMoore、ZFunction)、编辑距离(LevenshteinDistance)与 GUID 生成(GenerateGUID)等。
3.7 其余分类速览
- Ciphers(9):CaesarCipher、VigenereCipher、AffineCipher、Atbash、ROT13、XORCipher、MorseCode 等;
- Conversions(29):进制互转(BinaryToDecimal、HexToDecimal、ArbitraryBase)、单位换算(MeterToFeetConversion、LitersToUSGallons、OuncesToKilograms)、颜色转换(RGBToHex、HexToRGB、RgbHslConversion)等;
- Geometry(5):Circle、Cone、Sphere、Pyramid、ConvexHullGraham(凸包);
- Hashes(3):MD5、SHA1、SHA256;
- Project-Euler(26):Problem001 至 Problem044,覆盖欧拉计划前 44 题中的经典题目;
- Recursive(12):Factorial、TowerOfHanoi、FloodFill、PalindromePartitioning、KochSnowflake 等;
- Cellular-Automata / Compression / Navigation / Timing-Functions / Trees:分别收录 ConwaysGameOfLife、RLE、Haversine、GetMonthDays 与 ParseDate、FenwickTree(树状数组)与 BreadthFirstTreeTraversal 等。
四、源码级剖析:从目录条目到真实实现
DIRECTORY.md 的每个条目背后,都是可直接运行验证的源码。这里选取三个典型文件,展示目录条目对应的实现形态。
4.1 二分查找:递归 + 迭代双版本
Search/BinarySearch.js 同时导出了binarySearchRecursive与binarySearchIterative两个函数,二者共享同一个核心逻辑:通过mid = Math.floor(low + (high - low) / 2)计算中点(该写法可避免(low + high)溢出),命中返回下标,否则根据x与arr[mid]的大小关系缩小区间,未命中返回-1:
function binarySearchRecursive(arr, x, low = 0, high = arr.length - 1) { const mid = Math.floor(low + (high - low) / 2) if (high >= low) { if (arr[mid] === x) return mid if (x < arr[mid]) { return binarySearchRecursive(arr, x, low, mid - 1) } else { return binarySearchRecursive(arr, x, mid + 1, high) } } return -1 }配套测试 Search/test/BinarySearch.test.js 同时遍历两个版本,验证数字数组与字符串数组的命中/未命中四种场景(如func(arr, 3) === 2、func(arr, 11) === -1、func(stringArr, 'Charlie') === 2)。
4.2 斐波那契:7 种实现并存于单文件
Maths/Fibonacci.js 是目录“一文件多实现”的代表:它一口气导出了FibonacciIterative、FibonacciGenerator(生成器)、FibonacciRecursive、FibonacciRecursiveDP(记忆化递归)、FibonacciDpWithoutRecursion(自底向上 DP)、FibonacciMatrixExpo(矩阵快速幂,支持 BigInt)、FibonacciUsingFormula(通项公式)共 7 种写法,并且全部支持负数下标扩展。对应测试 Maths/test/Fibonacci.test.js 覆盖了正负输入、BigInt、生成器逐项取值等场景——这是学习“同一问题的多种解法对比”的绝佳素材。
4.3 快速排序:分治策略的最小实现
Sorts/QuickSort.js 展示了本仓库简洁的编码风格:取首元素为 pivot,遍历划分LESSER/GREATER两个数组,再递归拼接:
function quickSort(items) { const length = items.length if (length <= 1) return items const PIVOT = items[0] const GREATER = [] const LESSER = [] for (let i = 1; i < length; i++) { if (items[i] > PIVOT) GREATER.push(items[i]) else LESSER.push(items[i]) } return [...quickSort(LESSER), PIVOT, ...quickSort(GREATER)] }五、目录与测试、工程配置的对应关系
DIRECTORY.md 中的绝大多数分类都配有同名测试目录,例如Sorts/test/、Maths/test/、Graphs/test/、String/test/,测试文件命名与实现文件一一对应(如 Sorts/test/QuickSort.test.js 对应 Sorts/QuickSort.js)。这种“实现 + 测试”成对组织的结构,是理解算法行为最直接的方式。
从工程配置看(package.json):
- 仓库采用ES Modules(
"type": "module"),所有源码与测试均使用import / export语法; - 测试框架为Vitest(
"test": "vitest run",监听模式为"test-watch": "vitest"),配置见 vitest.config.ts(开启globals: true,覆盖率报告支持 text/json/html); - 代码风格由Prettier统一(
"style": "npx prettier . --write"、"check-style": "npx prettier . --check"),与 README 中 standard.js 风格徽章呼应; - 运行环境要求Node.js >= 20.6.0(见
engines字段)。
因此,你可以这样快速上手任何一个目录条目:
# 1. 安装依赖(在仓库根目录) npm install # 2. 运行全部测试 npm test # 3. 只跑某一个算法的测试(例如二分查找) npx vitest run Search/test/BinarySearch.test.js # 4. 检查代码风格 npm run check-style六、如何利用 DIRECTORY.md 规划学习路径
DIRECTORY.md 本身就像一张按难度与主题组织的课程表,建议按以下顺序消费:
- 从基础分类开始:
Maths(约 96 个)与Conversions(29 个)包含大量简单、自包含的函数,适合熟悉 ES Module 导入导出与测试写法; - 进阶到数据结构:进入
Data-Structures的链表、栈、队列、堆、树子分类,配合各子目录test/下的测试理解类的行为契约; - 再攻算法专题:按
Sorts→Search→Backtracking→Dynamic-Programming→Graphs的顺序,从单个算法逐步过渡到组合优化与图论问题; - 用 Project-Euler 做实战检验:目录中 26 个 Project-Euler 题解可当作综合练习题,每个文件对应一个独立题目;
- 贡献新算法时先查目录:若要新增实现,先在 DIRECTORY.md 中检索同名或同类条目(例如新增排序算法前先看
Sorts分类是否已存在),并遵循 CONTRIBUTING.md 的规范补充对应测试。
结语
DIRECTORY.md 远不止是一份文件清单:它是 TheAlgorithms/JavaScript 仓库的知识组织方式——21 个分类、约 370 个实现、成对的测试目录、统一的 ESM 与 Prettier 风格,共同构成了一套面向初学者的、可运行可验证的算法学习体系。无论你是想检索一个具体算法、按主题系统学习,还是准备为仓库贡献新实现,从这份目录出发都是最快的路径。
- 教育
【免费下载链接】JavaScript
Algorithms and Data Structures implemented in JavaScript for beginners, following best practices.
相关推荐
TheAlgorithms Java 算法仓库 DIRECTORY.md 全解析:一张覆盖 40+ 算法领域的代码地图
TheAlgorithms Java 算法仓库 DIRECTORY.md 全解析:一张覆盖 40+ 算法领域的代码地图 本篇文章以仓库根目录下的 DIRECTO
示例工程算法现代JavaScript算法实现:10个常用算法的JavaScript版本终极指南
现代JavaScript算法实现:10个常用算法的JavaScript版本终极指南 现代JavaScript算法实现是每个前端开发者必备的技能,掌握这些算法不仅
JavaScript算法与数据结构宝库:TheAlgorithms项目深度解析
JavaScript算法与数据结构宝库:TheAlgorithms项目深度解析 TheAlgorithms/JavaScript项目是一个专注于用JavaScr
教育
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考