- 最后更新 2019年07月02日
- 首次更新 2019年05月22日
Data Structure & Algorithm, 算法之美, Swift语言实现
安装方法
下载代码, 打开 DSA.xcworkspace , 运行AlgorithmDemo target即可, 或者运行DSA_SwiftTests中的测试用例.
其中DSA工程编译之后会生成 DSA.framework, 可独立使用.
说明
1. 复杂度分析时, 由于编程语言的差异, 当兼容OC时, Swift无法使用inout关键字, 导致数组会产生copy, 和算法无关, 空间复杂度分析时忽略该因素
2. 由于要兼容OC, 无法使用Swift的泛型编程, 因此库中传入的数据均为Any类型, OC对应类型为id
3. 代码持续更新中, bug持续修复中...
目录最后补上
- 反转单向链表 ✓
时间复杂度O(n), 空间复杂度O(1)
- 链表中环的检测 ✓
时间复杂度O(n), 空间复杂度O(1)
- 合并两个有序链表 ✓
时间复杂度O(n), 空间复杂度O(1)
- 删除链表倒数第N个节点 ✓
时间复杂度O(n), 空间复杂度O(1)
- 求链表的中间节点 ✓
时间复杂度O(n), 空间复杂度O(1)
- 顺序队列 ✓
操作时间复杂度O(1), 空间复杂度O(1)
最好时间复杂度O(n), 最坏时间复杂度O(n^2), 平均时间复杂度O(n^2), 空间复杂度O(1)
- 选择排序 ✓
最好时间复杂度O(n^2), 最坏时间复杂度O(n^2), 平均时间复杂度O(n^2), 空间复杂度O(1)
- 归并排序 ✓
最好时间复杂度O(nlogn), 最坏时间复杂度O(nlogn), 平均时间复杂度O(nlogn), 空间复杂度O(n)
时间复杂度O(n), 空间复杂度O(n)
- 快速排序 ✓
最好时间复杂度O(nlogn), 最坏时间复杂度O(n^2), 平均时间复杂度O(nlogn), 空间复杂度O(1)
时间复杂度O(n), 空间复杂度O(1)
- 二分查找 ✓
- 求解平方根 ✓
时间复杂度O(logn), 空间复杂度O(1)
-
查找第一个值等于给定值的元素 ✓
-
查找最后一个值等于给定值的元素 ✓
-
查找第一个大于等于给定值的元素 ✓
-
查找最后一个小于等于给定值的元素 ✓
特点:
- 支持动态扩容策略
- 性能稳定, 每次删除, 插入, 查询的时间复杂度都是O(1)
- 合理使用内存空间, 不浪费
- 二叉树 ✓
- 动态生成满二叉树 ✓
- 可视化打印满二叉树 ✓
- 二叉树前中后序遍历(递归) ✓
- 层序遍历 ✓
- 检测二叉树深度 ✓
- 查找, 插入, 删除 (假设元素不重复) ✓
时间复杂度O(logn), 空间复杂度O(1)
- 插入数据 ✓
时间复杂度O(logn), 空间复杂度O(1)
- 删除堆顶 ✓
时间复杂度O(logn), 空间复杂度O(1)
- 堆排序 ✓
时间复杂度O(n*logn), 空间复杂度O(1)
- Trie树 ✓
插入, 删除, 查找时间复杂度O(n), 空间复杂度根前缀重合度有关.
- 子节点使用哈希表存储
- 支持任意字符构建字典树
- 支持字符串增删查找
实现多模式串匹配算法, 时间复杂度O(n), 空间复杂度O(1)
- 基于trie树实现
- 支持多模式串匹配, 可用于关键词过滤
- 邻接表实现 ✓
时间复杂度: 性能是KMP算法的3-4倍, 最坏时间复杂度是O(n), 3n-5n;
复杂度推导: 实在太复杂, 能力有限, 有兴趣可以看附件推荐的论文; 下面给出代码实现中两个重要数组的示意图, 用于大幅提升算法性能.
- KMP匹配算法 ✓
时间复杂度O(n+m), n是主串长度, m是模式串长度. KMP算法的核心预处理数组如下示意图