Skip to content

Latest commit

 

History

History
346 lines (289 loc) · 22.4 KB

README.zh-CN.md

File metadata and controls

346 lines (289 loc) · 22.4 KB

JavaScript 算法与数据结构

🇺🇦 乌克兰正在被俄罗斯军队攻击。平民正在遭到杀害。民用区域正在被轰炸。


CI codecov repo size

本仓库包含了许多基于 JavaScript 的流行算法和数据结构的示例实现。

每种算法和数据结构都有自己的 README,其中包含相关说明和进一步阅读的链接(包括 YouTube 视频链接)。

其他语言版本: English

☝ 请注意,本项目仅用于学习和研究目的,适用于生产环境。

数据结构

数据结构是一种在计算机中组织和存储数据的特定方式,以便能够高效地访问和修改数据。更确切地说,数据结构是数据值的集合,以及这些值之间的关系,以及可以应用于数据的函数或操作。

请记住,每种数据结构都有其权衡。在选择某种数据结构时,你应该更关注为什么选择它,而不是如何实现它。

B - 初级, A - 高级

算法

算法是解决一类问题的明确规范。算法是一组精确定义操作序列的规则。

B - 初级, A - 高级

按主题分类

按算法范式分类

算法范式是一种通用方法或解决问题的方法。这是一种比算法更高层次的抽象,就像算法是比计算机程序更高层次的抽象一样。

如何使用本仓库

安装所有依赖

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 中为其编写测试。

然后,只需运行以下命令来测试你的游乐场代码是否按预期工作:

npm test -- 'playground'

有用信息

参考资料

大 O 表示法

大 O 表示法用于对算法的运行时间或空间需求增长的分类,随着输入规模的增长而变化。 在下面的图表中,您可以找到按大 O 表示法指定的最常见增长阶。

Big O 图表

来源:Big O Cheat Sheet

以下是一些最常用的大 O 符号及其针对不同大小输入数据的性能比较列表。

大 O 表示法 类型 10 个元素的计算次数 100 个元素的计算次数 1000 个元素的计算次数
O(1) 常数 1 1 1
O(log N) 对数 3 6 9
O(N) 线性 10 100 1000
O(N log N) n log(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 树 log(n) log(n) log(n) log(n)
红黑树 log(n) log(n) log(n) log(n)
AVL 树 log(n) log(n) log(n) log(n)
布隆过滤器 - 1 1 - 查找过程中可能出现假阳性

数组排序算法的复杂性

名称 最佳情况 平均情况 最坏情况 内存 稳定 备注
冒泡排序 n n2 n2 1
插入排序 n n2 n2 1
选择排序 n2 n2 n2 1
堆排序 n log(n) n log(n) n log(n) 1
归并排序 n log(n) n log(n) n log(n) n
快速排序 n log(n) n log(n) n2 log(n) 快速排序通常是原地排序,使用 O(log(n))的栈空间
希尔排序 n log(n) 取决于间隙序列 n (log(n))2 1
计数排序 n + r n + r n + r n + r r - 数组中最大的数
基数排序 n * k n * k n * k n + k k - 最长键的长度

项目支持者

您可以通过 ❤️️ GitHub 或 ❤️️ Patreon 支持该项目。

支持该项目的人们 ∑ = 1

作者

@trekhleb

trekhleb.dev 上还有更多关于 JavaScript 和算法的项目文章