本仓库包含了多种基于 JavaScript 的算法与数据结构。javascript
每种算法和数据结构都有本身的 README 并提供相关说明以及进一步阅读和 YouTube 视频。java
数据结构是在计算机中组织和存储数据的一种特殊方式,它能够高效地访问和修改数据。更确切地说,数据结构是数据值的集合,它们之间的关系、函数或操做能够应用于数据。git
算法是如何解决一类问题的明确规范。 算法是一组精肯定义操做序列的规则。github
算法范式是基于类的设计的通用方法或方法的算法。 这是一个比算法概念更高的抽象,就像一个 算法是比计算机程序更高的抽象。算法
BF算法 - 查找全部可能性并选择最佳解决方案shell
贪心法 - 在当前选择最佳选项,不考虑之后状况npm
分治法 - 将问题分红较小的部分,而后解决这些部分编程
动态编程 - 使用之前找到的子解决方案构建解决方案数组
回溯法 - 相似于 BF算法 试图产生全部可能的解决方案,但每次生成解决方案测试若是它知足全部条件,那么只有继续生成后续解决方案。 不然回溯并继续寻找不一样路径的解决方案。markdown
B & B
安装依赖
npm install
复制代码npm install
执行测试
npm test
复制代码npm test
按照名称执行测试
npm test -- -t 'LinkedList'
复制代码npm test -- -t 'LinkedList'
Playground
你能够在./src/playground/playground.js
文件中操做数据结构与算法,并在./src/playground/__test__/playground.test.js
中编写测试。
而后,只需运行如下命令来测试你的 Playground 是否按无误:
npm test -- -t 'playground'
复制代码npm test -- -t 'playground'
大O符号中指定的算法的增加顺序。
如下是一些最经常使用的 大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) | 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 | 1 |
哈希表 | - | n | n | n |
二分查找树 | n | n | n | 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) |
名称 | 最优 | 平均 | 最坏 | 内存 | 稳定 |
---|---|---|---|---|---|
冒泡排序 | n | n^2 | n^2 | 1 | Yes |
插入排序 | n | n^2 | n^2 | 1 | Yes |
选择排序 | n^2 | n^2 | n^2 | 1 | No |
堆排序 | n log(n) | n log(n) | n log(n) | 1 | No |
归并排序 | n log(n) | n log(n) | n log(n) | n | Yes |
快速排序 | n log(n) | n log(n) | n^2 | log(n) | No |
希尔排序 | n log(n) | 取决于差距序列 | n (log(n))^2 | 1 | No |