该存储库包含许多流行算法和数据结构的基于 JavaScript 的示例。
每个算法和数据结构都有自己单独的自述文件,其中包含相关解释和供进一步阅读的链接(包括 YouTube 视频的链接)。
阅读其他语言版本: 简体中文、 繁体中文、 한국어、 日本语、 波兰语、 法语、 西班牙语、 葡萄牙语、 Русский、 土耳其语、 意大利语、 印度尼西亚语、 Українська、 阿拉伯语、 Tiếng Việt、 德语
☝ 请注意,该项目仅用于学习和研究目的,并不用于生产。
数据结构是在计算机中组织和存储数据的特殊方式,以便可以有效地访问和修改数据。更准确地说,数据结构是数据值、它们之间的关系以及可应用于数据的函数或操作的集合。
B
- 初级,A
- 高级
B
链表B
双向链表B
队列B
堆B
哈希表B
堆- 最大和最小堆版本B
优先队列A
特里树A
树A
图(有向图和无向图)A
不相交集- 联合查找数据结构或合并查找集A
布隆过滤器A
LRU 缓存- 最近最少使用 (LRU) 缓存
算法是如何解决一类问题的明确规范。它是一组精确定义操作序列的规则。
B
- 初级,A
- 高级
- 数学
B
位操作- 设置/获取/更新/清除位,乘以/除以二,取负数等。B
二进制浮点- 浮点数的二进制表示形式。B
阶乘B
斐波那契数- 经典和封闭形式版本B
质因数- 找到质因数并使用哈代-拉马努金定理计算它们B
素性测试(试除法)B
欧几里得算法- 计算最大公约数 (GCD)B
最小公倍数(LCM)B
埃拉托斯特尼筛法- 查找任意给定极限内的所有素数B
是二的幂- 检查数字是否是二的幂(朴素算法和按位算法)B
帕斯卡三角形B
复数- 复数及其基本运算B
弧度和度数- 弧度到度数以及向后转换B
快速供电B
霍纳方法- 多项式评估B
矩阵- 矩阵和基本矩阵运算(乘法、转置等)B
欧几里得距离- 两点/向量/矩阵之间的距离A
整数分区A
平方根- 牛顿法A
刘辉 π 算法- 基于 N 边形的近似 π 计算A
离散傅立叶变换- 将时间函数(信号)分解为组成它的频率
- 套
- 弦乐
B
汉明距离- 符号不同的位置数B
Palindrome - 检查字符串反向是否相同A
Levenshtein Distance - 两个序列之间的最小编辑距离A
Knuth–Morris–Pratt 算法(KMP 算法)- 子串搜索(模式匹配)A
Z算法-子串搜索(模式匹配)A
Rabin Karp 算法- 子串搜索A
最长公共子串A
正则表达式匹配
- 搜索次数
- 排序
- 链表
- 树木
- 图表
B
深度优先搜索(DFS)B
广度优先搜索(BFS)B
克鲁斯卡尔算法- 寻找加权无向图的最小生成树(MST)A
Dijkstra 算法- 找到从单个顶点到所有图顶点的最短路径A
贝尔曼-福特算法- 找到从单个顶点到所有图顶点的最短路径A
Floyd-Warshall 算法- 找到所有顶点对之间的最短路径A
检测循环- 适用于有向图和无向图(基于 DFS 和不相交集的版本)A
Prim 算法- 寻找加权无向图的最小生成树 (MST)A
拓扑排序-DFS方法A
衔接点- Tarjan 算法(基于 DFS)A
Bridges - 基于 DFS 的算法A
欧拉路径和欧拉电路- 弗勒里算法 - 访问每条边一次A
哈密顿循环- 访问每个顶点一次A
强连通分量- Kosaraju 算法A
旅行商问题- 访问每个城市并返回出发城市的最短路径
- 密码学
B
Polynomial Hash - 基于多项式的滚动哈希函数B
Rail Fence Cipher - 用于编码消息的转置密码算法B
凯撒密码- 简单替换密码B
Hill Cipher - 基于线性代数的替换密码
- 机器学习
B
NanoNeuron - 7 个简单的 JS 函数,说明机器如何实际学习(前向/后向传播)B
k-NN - k 最近邻分类算法B
k-Means - k-Means 聚类算法
- 图像处理
B
Seam Carving - 内容感知图像调整大小算法
- 统计数据
B
加权随机- 根据项目的权重从列表中选择随机项目
- 进化算法
A
遗传算法- 遗传算法如何应用于训练自动泊车汽车的示例
- 未分类
B
河内塔B
方阵旋转- 就地算法B
跳跃游戏——回溯、动态规划(自上而下+自下而上)和贪心例子B
独特路径- 回溯、动态规划和基于帕斯卡三角的示例B
Rain Terraces - 捕获雨水问题(动态规划和暴力版本)B
递归楼梯- 计算到达顶部的方法(4 个解决方案)B
买入卖出股票的最佳时机- 分而治之和一次性示例A
N 皇后问题A
骑士之旅
算法范式是一类算法设计的基础的通用方法或方法。它是比算法概念更高的抽象,就像算法是比计算机程序更高的抽象一样。
- 蛮力- 查看所有可能性并选择最佳解决方案
- 贪心——选择当前最好的选择,不考虑未来
B
跳跃游戏A
未绑定背包问题A
Dijkstra 算法- 找到到所有图顶点的最短路径A
Prim 算法- 寻找加权无向图的最小生成树 (MST)A
克鲁斯卡尔算法- 寻找加权无向图的最小生成树(MST)
- 分而治之——将问题分成更小的部分,然后解决这些部分
- 动态规划- 使用先前找到的子解决方案构建解决方案
- 回溯- 与蛮力类似,尝试生成所有可能的解决方案,但每次生成下一个解决方案时,您都会测试它是否满足所有条件,然后才继续生成后续解决方案。否则,就原路返回,走另一条寻找解决方案的道路。通常使用状态空间的 DFS 遍历。
- 分支与界限- 记住在回溯搜索的每个阶段找到的最低成本解决方案,并使用迄今为止找到的最低成本解决方案的成本作为问题的最低成本解决方案的成本下限,在为了丢弃成本大于迄今为止找到的最低成本解决方案的部分解决方案。通常将 BFS 遍历与状态空间树的 DFS 遍历结合使用。
安装所有依赖项
npm install
运行 ESLint
您可能想运行它来检查代码质量。
npm run lint
运行所有测试
npm test
按名称运行测试
npm test -- 'LinkedList'
故障排除
如果 linting 或测试失败,请尝试删除该node_modules
文件夹并重新安装 npm 软件包:
rm -rf ./node_modules
npm i
另请确保您使用的是正确的 Node 版本 ( >=16
)。如果您使用nvm进行 Node 版本管理,您可以nvm use
从项目的根文件夹运行,并且将会选择正确的版本。
操场
您可以在文件中使用数据结构和算法,./src/playground/playground.js
并在./src/playground/__test__/playground.test.js
.
然后只需运行以下命令来测试您的 Playground 代码是否按预期工作:
npm test -- 'playground'
Big O 表示法用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类。在下图中,您可能会发现以 Big O 表示法指定的最常见算法增长阶数。
资料来源:Big O 备忘单。
下面列出了一些最常用的 Big O 表示法以及它们与不同大小的输入数据的性能比较。
大 O 表示法 | 类型 | 10 个元素的计算 | 100 个元素的计算 | 1000 个元素的计算 |
---|---|---|---|---|
复杂度(1) | 持续的 | 1 | 1 | 1 |
O(logN) | 对数 | 3 | 6 | 9 |
在) | 线性 | 10 | 100 | 1000 |
O(N log N) | n 对数(n) | 30 | 600 | 9000 |
O(N^2) | 二次 | 100 | 10000 | 1000000 |
O(2^N) | 指数 | 1024 | 1.26e+29 | 1.07e+301 |
在!) | 阶乘 | 3628800 | 9.3e+157 | 4.02e+2567 |
数据结构 | 使用权 | 搜索 | 插入 | 删除 | 评论 |
---|---|---|---|---|---|
大批 | 1 | n | n | n | |
堆 | n | n | 1 | 1 | |
队列 | n | n | 1 | 1 | |
链表 | n | n | 1 | n | |
哈希表 | - | n | n | n | 如果是完美的哈希函数,成本将是 O(1) |
二叉搜索树 | n | n | n | n | 如果是平衡树,成本将为 O(log(n)) |
B树 | 日志(n) | 日志(n) | 日志(n) | 日志(n) | |
红黑树 | 日志(n) | 日志(n) | 日志(n) | 日志(n) | |
AVL树 | 日志(n) | 日志(n) | 日志(n) | 日志(n) | |
布隆过滤器 | - | 1 | 1 | - | 搜索时可能出现误报 |
姓名 | 最好的 | 平均的 | 最差 | 记忆 | 稳定的 | 评论 |
---|---|---|---|---|---|---|
冒泡排序 | n | n 2 | n 2 | 1 | 是的 | |
插入排序 | n | n 2 | n 2 | 1 | 是的 | |
选择排序 | n 2 | n 2 | n 2 | 1 | 不 | |
堆排序 | n 对数(n) | n 对数(n) | n 对数(n) | 1 | 不 | |
归并排序 | n 对数(n) | n 对数(n) | n 对数(n) | n | 是的 | |
快速排序 | n 对数(n) | n 对数(n) | n 2 | 日志(n) | 不 | 快速排序通常使用 O(log(n)) 堆栈空间就地完成 |
希尔排序 | n 对数(n) | 取决于缺口序列 | n (log(n)) 2 | 1 | 不 | |
计数排序 | n+r | n+r | n+r | n+r | 是的 | r - 数组中最大的数字 |
基数排序 | n*k | n*k | n*k | n+k | 是的 | k - 最长密钥的长度 |
支持这个项目的人们 ∑ = 1
trekhleb.dev上还有一些有关 JavaScript 和算法的项目和文章