Swift通用算法库

988 阅读4分钟

DSA

Data Structure & Algorithm, 算法之美, Swift语言实现.

代码还在更新中, 都是提升技术的必修算法知识, 喜欢的朋友可以start一下. 项目地址: github.com/cocos543/DS…

安装方法

下载代码, 打开 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)

image

最好时间复杂度O(n^2), 最坏时间复杂度O(n^2), 平均时间复杂度O(n^2), 空间复杂度O(1)

image

最好时间复杂度O(nlogn), 最坏时间复杂度O(nlogn), 平均时间复杂度O(nlogn), 空间复杂度O(n)

image

时间复杂度O(n), 空间复杂度O(n)

不稳定的排序算法

最好时间复杂度O(nlogn), 最坏时间复杂度O(n^2), 平均时间复杂度O(nlogn), 空间复杂度O(1)

image

时间复杂度O(n), 空间复杂度O(1)

分区函数算法示意图

image

查找

二分查找

时间复杂度O(logn), 空间复杂度O(1)

image

时间复杂度O(logn), 空间复杂度O(1)

四种二分查找的变形算法

  1. 查找第一个值等于给定值的元素 ✓

  2. 查找最后一个值等于给定值的元素 ✓

  3. 查找第一个大于等于给定值的元素 ✓

  4. 查找最后一个小于等于给定值的元素 ✓

哈希表

冲突解决方式

特点:

  1. 支持动态扩容策略
  2. 性能稳定, 每次删除, 插入, 查询的时间复杂度都是O(1)
  3. 合理使用内存空间, 不浪费

时间复杂度O(1), 空间复杂度O(n)

image

  1. 动态生成满二叉树 ✓
  2. 可视化打印满二叉树 ✓
  3. 二叉树前中后序遍历(递归) ✓
  4. 层序遍历 ✓
  5. 检测二叉树深度 ✓

image

  1. 查找, 插入, 删除 (假设元素不重复) ✓

时间复杂度O(logn), 空间复杂度O(1)

image

  1. 插入数据 ✓

时间复杂度O(logn), 空间复杂度O(1)

  1. 删除堆顶 ✓

时间复杂度O(logn), 空间复杂度O(1)

  1. 堆排序 ✓

时间复杂度O(n*logn), 空间复杂度O(1)

image
image
image

插入, 删除, 查找时间复杂度O(n), 空间复杂度根前缀重合度有关.

  1. 子节点使用哈希表存储
  2. 支持任意字符构建字典树
  3. 支持字符串增删查找

image

实现多模式串匹配算法, 时间复杂度O(n), 空间复杂度O(1)

  1. 基于trie树实现
  2. 支持多模式串匹配, 可用于关键词过滤

存储结构

image

图的搜索

字符串

时间复杂度: 性能是KMP算法的3-4倍, 最坏时间复杂度是O(n), 3n-5n;

复杂度推导: 实在太复杂, 能力有限, 有兴趣可以看附件推荐的论文; 下面给出代码实现中两个重要数组的示意图, 用于大幅提升算法性能.

image
image

时间复杂度O(n+m), n是主串长度, m是模式串长度. KMP算法的核心预处理数组如下示意图

image

回溯算法

动态规划

附件