使用Swift学习数据结构和算法
- 主要分享最近学习的数据结构和排序算法
- 文章只涉及每一种数据结构通过代码实现的函数定义
- 涉及的每一种数据结构或者算法基本都通过代码实现了
- GitHub代码地址: 数据结构和算法
线性表
链表
- 链表是一种链式存储的线性结构, 所有元素的内存地址不一定是连续的
- 下表是为四种链表和测试项目中对应的类名
1 | class List<E: Comparable> { |
链表 | 类名 |
---|---|
单向链表 | SingleLinkList |
双向链表 | DoubleLinkList |
单向循环链表 | CircleSingleLineList |
双向循环链表 | CircleDoubleLinkList |
栈
- 栈是一种特殊的线性表, 只能在一端进行操作
- 栈遵循后进先出的原则, Last in First out
- Statck
1 | class Statck<E> { |
队列
- 队列是一种特殊的线性表, 只能在头尾两端进行操作
- 队列遵循后进先出的原则(单端队列), First in First out
- 下表是为队列和测试项目中对应的类名
1 | class Queue<E: Comparable> { |
队列 | 类名 |
---|---|
单端队列 | SingleQueue |
双端队列 | SingleDeque |
单端循环队列 | CircleQueue |
双端循环队列 | CircleDeque |
哈希表
- 哈希表也称之为散列表, 童年各国数组存储(非单纯的数组)
- 利用哈希函数生成key对应的index值为数组索引存储value值
- 两个不同的key值通过哈希函数可能得到相同的索引, 即哈希冲突
- 解决哈希冲突的常见方法
- 开放定址法: 按照一定规则向其他地址探测, 知道遇到空桶
- 再哈希法: 设计多个复杂的哈希函数
- 链地址法: 通过链表将同一index索引的与元素串起来, 测试项目中使用的这种方式
1 | class Map<K: Hashable, V: Comparable> { |
二叉树
- 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成
二叉树 | 类名 |
---|---|
二叉树 | BinaryTree |
二叉搜索树 | BinarySearchTree |
AVL树和红黑树是两种平衡二叉搜索树
平衡二叉搜索树 | 类名 |
---|---|
二叉平衡树 | BinaryBalanceTree |
二叉平衡搜索树 | BinaryBalanceSearchTree |
红黑树 | RedBlackTree |
集合
测试项目中分别用链表, 红黑树, 哈希表实现了三种集合
1 | class Set<E: Comparable & Hashable> { |
集合 | 类名 |
---|---|
双向链表集合 | ListSet |
红黑树集合 | TreeSet |
哈希表集合 | HashSet |
二叉堆
堆是一种树状的数据结构, 二叉堆只是其中一种, 除此之外还有
- 多叉堆
- 索引堆
- 二项堆
- ….
测试项目中是以二叉堆实现了最大堆和最小堆
1 | class AbstractHeap<E: Comparable> { |
二叉堆 | 类名 |
---|---|
二叉堆 | BinaryHeap |
最大堆 | MinHeap |
最小堆 | MaxHeap |
并查集
- 并查集也叫不相交集合, 有查找和合并两个核心操作
- 查找: 查找元素所在的集
- 合并: 将两个元素所在的集合并为一个集
1 | class UnionFind { |
并查集 | 类名 |
---|---|
Quick Find | UnionFind_QF |
Quick Union | UnionFind_QU |
QU基于size优化 | UnionFind_QU_Size |
QU基于size优化 | UnionFind_QU_Size |
QU基于rank优化 | UnionFind_QU_Rank |
QU基于rank的优化, 路径压缩 | UnionFind_QU_Rank_PC |
QU基于rank的优化, 路径分裂 | UnionFind_QU_Rank_PS |
QU基于rank的优化, 路径减半 | UnionFind_QU_Rank_PH |
泛型并查集 | GenericUnionFind |
图
- 图由顶点和边组成, 分有向图和无向图 —>
ListGraph
ListGraph
继承自Graph
1 | class Graph<V: Comparable & Hashable, E: Comparable & Hashable> { |
排序
排序 | 类名 |
---|---|
冒泡排序 | BubbleSorted2 |
选择排序 | SelectedSorted |
插入排序 | InsertionSorted1 |
归并排序 | MergeSort |
希尔排序 | ShellSort |
快速排序 | QuickSorted |
堆排序 | HeapSorted |
计数排序 | CountingSorted |
基数排序 | RadixSorted |
桶排序 | BucketSorted |
1 | /// 快速排序 |
总结
- 数据结构部分除了跳表和串其他的基本都实现了
- 算法部分除了排序, 其他都暂时还没有学习
- 这部分的学习就暂时告一段落, 接下来我要准备11月份的考试
- GitHub代码地址: 数据结构和算法