🇺🇦 乌克兰正在受到俄罗斯军队的袭击。平民正在被杀害。居民区正在遭到轰炸。
- 通过乌克兰国家银行帮助乌克兰
- 通过储蓄生命基金帮助乌克兰
- 有关乌克兰 war.ukraine.ua 和外交部的更多信息
该存储库包含许多流行算法和数据结构的基于 JavaScript 的示例。
每种算法和数据结构都有自己单独的自述文件,其中包含相关的解释和进一步阅读的链接(包括YouTube视频的链接)。
用其他语言阅读: 简体中文, 繁體中文, 한국어, 日本語, 波兰语, 法语, 西班牙语, 葡萄牙语, Русский, Türkçe, 意大利语, 印度尼西亚语, Українська, 阿拉伯语, 越南, 德语
数据结构是在计算机中组织和存储数据的一种特殊方式,以便可以有效地访问和修改数据。更准确地说,数据结构是数据值、它们之间的关系以及可应用于数据的函数或操作的集合。
B- 初级, - 高级
A
B链表
B双向链表
B队列
B叠
B哈希表
B堆 - 最大和最小堆版本
B优先级队列
A特里
A树
A图形(有向和无向)
A不相交集 - 联合-查找数据结构或合并-查找集合
A布隆过滤器
ALRU 缓存 - 最近最少使用的 (LRU) 缓存
算法是如何解决一类问题的明确规范。它是一组精确定义操作序列的规则。
B- 初级, - 高级
A
B位操作 - 设置/获取/更新/清除位,乘法/除以二,使负数等。
B二进制浮点数 - 浮点数的二进制表示形式。
B阶乘
B斐波那契数 - 经典和封闭形式版本
B素因数 - 找到素因数并使用哈代-拉马努金定理对其进行计数
B素数检验(试验除法)
B欧几里得算法 - 计算最大公约数 (GCD)
B最小公倍数 (LCM)
B埃拉托色尼筛 - 找到任何给定极限的所有素数
B是 2 的幂 - 检查数字是否是 2 的幂(朴素和按位算法)
B帕斯卡三角形
B复数 - 复数及其基本运算
B弧度和度 - 弧度到度和向后转换
B快速供电
B霍纳方法 - 多项式求值
B矩阵 - 矩阵和基本矩阵运算(乘法、换位等)
B欧几里得距离 - 两点/向量/矩阵之间的距离
A整数分区
A平方根 - 牛顿法
A刘辉π算法 - 基于N-gons的近似π计算
A离散傅里叶变换 - 将时间函数(信号)分解为构成它的频率
B汉明距离 - 符号不同的位置数
B回文 - 反向检查字符串是否相同
ALevenshtein 距离 - 两个序列之间的最小编辑距离
A高德纳-莫里斯-普拉特算法(KMP算法) - 子字符串搜索(模式匹配)
AZ 算法 - 子字符串搜索(模式匹配)
A拉宾卡普算法 - 子字符串搜索
A最长的公共子字符串
A正则表达式匹配
B深度优先搜索 (DFS)
B广度优先搜索 (BFS)
B克鲁斯卡尔算法 - 查找加权无向图的最小生成树 (MST)
ADijkstra 算法 - 从单个顶点找到到所有图形顶点的最短路径
A贝尔曼-福特算法 - 从单个顶点找到到所有图形顶点的最短路径
A弗洛伊德-沃歇尔算法 - 找到所有顶点对之间的最短路径
A检测周期 - 适用于有向图和无向图(基于 DFS 和不相交集的版本)
APrim 算法 - 查找加权无向图的最小生成树 (MST)
A拓扑排序 - DFS 方法
A关节点 - Tarjan算法(基于DFS)
A网桥 - 基于 DFS 的算法
A欧拉路径和欧拉回路 - 弗勒里算法 - 精确访问每条边一次
A哈密顿循环 - 精确访问每个顶点一次
A强连接组件 - Kosaraju 算法
A旅行推销员问题 - 访问每个城市并返回始发城市的最短路线
BNanoNeuron - 7个简单的JS函数,说明机器如何实际学习(向前/向后传播)
Bk-NN - k-最近邻分类算法
Bk 均值 - k 均值聚类算法
B接缝雕刻 - 内容感知图像大小调整算法
B加权随机 - 根据项目的权重从列表中选择随机项目
A遗传算法 - 如何应用遗传算法训练自动泊车的示例
算法范式是一种通用方法或方法,它是一类算法设计的基础。它是高于算法概念的抽象,就像算法是高于计算机程序的抽象一样。
B跳跃游戏
A未绑定背包问题
ADijkstra 算法 - 找到所有图形顶点的最短路径
APrim 算法 - 查找加权无向图的最小生成树 (MST)
A克鲁斯卡尔算法 - 查找加权无向图的最小生成树 (MST)
安装所有依赖项
npm install
运行 ESLint
你可能需要运行它来检查代码质量。
npm run lint
运行所有测试
npm test
按名称运行测试
npm test -- 'LinkedList'
故障 排除
如果 linting 或测试失败,请尝试删除该文件夹并重新安装 npm 包:
node_modules
rm -rf ./node_modules npm i
还要确保你使用的是正确的节点版本 ()。如果你使用 nvm 进行节点版本管理,则可以从项目的根文件夹运行,并且将选取正确的版本。
>=16
nvm use
操场
你可以在文件中使用数据结构和算法,并在 中为其编写测试。
./src/playground/playground.js
./src/playground/__test__/playground.test.js
然后只需运行以下命令即可测试你的操场代码是否按预期工作:
npm test -- 'playground'
大 O 表示法用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长对算法进行分类。在下面的图表中,你可能会找到以 Big O 表示法指定的算法最常见的增长顺序。
资料来源:大O备忘单。
以下是一些最常用的 Big O 符号列表,以及它们与不同大小的输入数据的性能比较。
大O表示法 | 类型 | 10 个元素的计算 | 100 个元素的计算 | 1000 个元素的计算 |
---|---|---|---|---|
O(1) | 不断 | 1 | 1 | 1 |
O(对数 N) | 对数的 | 3 | 6 | 9 |
O(N) | 线性 | 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 |
O(N! | 阶乘 | 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 | n2 | n2 | 1 | 是的 | |
插入排序 | n | n2 | n2 | 1 | 是的 | |
选择排序 | n2 | n2 | n2 | 1 | 不 | |
堆排序 | n 日志(n) | n 日志(n) | n 日志(n) | 1 | 不 | |
合并排序 | n 日志(n) | n 日志(n) | n 日志(n) | n | 是的 | |
快速排序 | n 日志(n) | n 日志(n) | n2 | 日志(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
更多关于 JavaScript 和算法的项目和文章 trekhleb.dev