嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法
javascript-algorithms 是一个基于 JavaScript 的算法与数据结构仓库,包含了多种常用算法和数据结构的实现。每种算法和数据结构都有自己的 README,包含相关说明和链接,以便进一步阅读。
丰富语言支持
这个项目支持多种语言,包括英语、中文(繁体和简体)、韩语、日语、波兰语、法语、西班牙语、葡萄牙语、俄语、土耳其语、意大利语、印尼语、乌克兰语、阿拉伯语、越南语、德语和乌兹别克语。这使得来自世界各地的开发者都能享受到这个项目带来的便利。
数据结构
数据结构是计算机中组织和存储数据的一种特殊方式,使得数据可以高效地被访问和修改。javascript-algorithms 仓库中包含以下数据结构:
- 链表:一种线性数据结构,由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
- 双向链表:一种线性数据结构,由一系列节点组成,每个节点包含数据域和指向前后节点的指针。
- 队列:一种先进先出 (FIFO) 的数据结构,元素在队列尾部插入,在队列头部删除。
- 栈:一种后进先出 (LIFO) 的数据结构,元素在栈顶插入和删除。
- 哈希表(散列):一种数据结构,用于存储键值对,通过哈希函数快速访问数据。
- 堆:一种特殊的树形数据结构,常用于实现优先队列。
- 优先队列:一种队列,元素按照优先级顺序排列,优先级高的元素先出队。
- 字典树:一种树形数据结构,用于存储字符串,可以快速查找字符串是否存在。
- 树:一种分层数据结构,用于模拟具有层次关系的数据。
- 图:一种复杂的数据结构,用于存储节点和节点之间的关系。
- 并查集:一种数据结构,用于处理一些不交集的合并及查询问题。
- 布隆过滤器:一种数据结构,用于测试一个元素是否属于集合,具有极高的空间效率和查询速度。
算法
算法是如何解决一类问题的明确规范。javascript-algorithms 仓库中包含以下算法:
数学
- 位运算:对二进制位进行操作,实现高效的数值计算。
- 阶乘:计算一个数的阶乘。
- 斐波那契数:计算斐波那契数列中的数。
- 素数检测:判断一个数是否为素数。
- 欧几里得算法:计算两个数的最大公约数。
- 最小公倍数:计算两个数的最小公倍数。
- 素数筛:找出一定范围内的所有素数。
- 判断 2 次方数:判断一个数是否为 2 的幂。
- 杨辉三角形:生成杨辉三角形。
- 复数:进行复数运算。
- 弧度和角:进行弧度和角的转换。
- 快速算次方:快速计算一个数的幂。
- 整数拆分:将一个整数拆分成几个整数的和。
- 割圆术:近似计算圆周率。
- 离散傅里叶变换:将时间信号解析成构成它的频率。
集合
- 笛卡尔积:计算多个集合的笛卡尔积。
- 洗牌算法:随机置换一个序列。
- 幂集:找出一个集合的所有子集。
- 排列:找出一个集合的所有排列。
- 组合:找出一个集合的所有组合。
- 最长公共子序列:找出两个序列的最长公共子序列。
- 最长递增子序列:找出一个序列的最长递增子序列。
- 最短公共父序列:找出两个序列的最短公共父序列。
- 背包问题:解决背包问题。
- 最大子数列问题:找出一个序列的最大子数列。
- 组合求和:找出一个集合中可以组成特定和的所有组合。
字符串
- 汉明距离:计算两个字符串的汉明距离。
- 莱温斯坦距离:计算两个字符串的莱温斯坦距离。
- Knuth–Morris–Pratt 算法:实现字符串匹配。
- 字符串快速查找:实现字符串匹配。
- Rabin Karp 算法:实现字符串匹配。
- 最长公共子串:找出两个字符串的最长公共子串。
- 正则表达式匹配:实现正则表达式匹配。
搜索
- 线性搜索:在数组中线性搜索一个元素。
- 跳转搜索/块搜索:在有序数组中搜索一个元素。
- 二分查找:在有序数组中二分查找一个元素。
- 插值搜索:在均匀分布的有序数组中搜索一个元素。
排序
- 冒泡排序:实现冒泡排序算法。
- 选择排序:实现选择排序算法。
- 插入排序:实现插入排序算法。
- 堆排序:实现堆排序算法。
- 归并排序:实现归并排序算法。
- 快速排序:实现快速排序算法。
- 希尔排序:实现希尔排序算法。
- 计数排序:实现计数排序算法。
- 基数排序:实现基数排序算法。
链表
- 正向遍历:遍历链表。
- 反向遍历:反向遍历链表。
树
- 深度优先搜索:在树中深度优先搜索一个节点。
- 广度优先搜索:在树中广度优先搜索一个节点。
图
- 深度优先搜索:在图中深度优先搜索一个节点。
- 广度优先搜索:在图中广度优先搜索一个节点。
- 克鲁斯克尔演算法:找出加权无向图的最小生成树。
- 戴克斯特拉算法:找出图中所有顶点的最短路径。
- 贝尔曼-福特算法:找出图中所有顶点的最短路径。
- 弗洛伊德算法:找出所有顶点对之间的最短路径。
- 判圈算法:判断图中是否存在环。
- 普林演算法:找出加权无向图的最小生成树。
- 拓扑排序:对有向图进行拓扑排序。
- 关节点:找出图中的关节点。
- 桥:找出图中的桥。
- 欧拉回径与一笔画问题:找出图中的欧拉回径。
- 哈密顿图:判断图是否为哈密顿图。
- 强连通分量:找出图中的强连通分量。
- 旅行推销员问题:解决旅行推销员问题。
加密
- 多项式 hash:实现基于多项式的 rolling hash 函数。
机器学习
- NanoNeuron:实现一个简单的神经网络。
未分类
- 汉诺塔:解决汉诺塔问题。
- 旋转矩阵:旋转矩阵。
- 跳跃游戏:解决跳跃游戏问题。
- 独特路径:解决独特路径问题。
- 雨水收集:解决雨水收集问题。
- 递归楼梯:解决递归楼梯问题。
- 八皇后问题:解决八皇后问题。
- 骑士巡逻:解决骑士巡逻问题。
算法范式
算法范式是一种通用方法,基于一类算法的设计。javascript-algorithms 仓库中包含以下算法范式:
- BF 算法:查找/搜索所有可能性并选择最佳解决方案。
- 贪心法:在当前选择最佳选项,不考虑以后情况。
- 分治法:将问题分成较小的部分,然后解决这些部分。
- 动态规划:使用以前找到的子解决方案构建解决方案。
- 回溯法:类似于 BF 算法,但每次生成解决方案测试如果它满足所有条件,那么只有继续生成后续解决方案。否则回溯并继续寻找不同路径的解决方案。
- Branch & Bound:记住在回溯搜索的每个阶段找到的成本最低的解决方案,并使用到目前为止找到的成本最小值作为下限。以便丢弃成本大于最小值的解决方案。
大o表示法
大o表示法用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长对算法进行分类。在下图中,您可能会找到以大o表示法指定的算法的最常见增长顺序。
项目地址
https://github.com/trekhleb/javascript-algorithms