首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
数据结构与算法 - Swift 实现
Lebron
创建于2022-11-19
订阅专栏
《Data Structures & Algorithms in Swift》的学习笔记。
等 1 人订阅
共17篇文章
创建于2022-11-19
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
【数据结构与算法 - Swift实现】01 - 数组和字典
在学习其他更复杂的数据结构之前,我们先简单看看Swift标准库自带的数组和字典。 数组是我们在开发中经常用到的,是一个有序的集合。可以通过索引来获取其中的元素。例如: 从数组中取出元素所需时间为常量时间O(1),因为数组是在一块连续的内存中保存的,索引就是他的位置,不管数组有多…
【数据结构与算法 - Swift实现】02 - 链表
与数组一样,链表也是存储元素的集合。 单向链表的节点存储了下一个节点的地址。如下图: 双向链表的节点存储了上一个和下一个节点的地址。如下图: 单向链表占用更少的内存,因为它不用存储上一个节点的地址;但如果我们需要访问上一个节点,单向链表会非常麻烦,需要从头开始找,而双向链表会非…
【数据结构与算法 - Swift实现】03 - 栈 (Stack)
栈在开发中是很常见的,例如 iOS 中的 UINavigationController 就是通过栈数据结构来管理它的子控制器。 栈,非常简单而又很有用。当向栈中添加数据时,直接放在栈的上面;要移除数据时,直接把最上面的那个移除掉。它主要有两个操作: 所以我们只能在栈的顶部对元素…
【数据结构与算法 - Swift实现】04 - 队列 (Queue)
队列在生活中非常常见。排队等位吃饭、在火车站买票、通过高速路口等,这些生活中的现象很好的描述了队列的特点:先进先出 (FIFO, first in first out),排在最前面的先出来,后面来的只能排在最后面。 这里我们利用 Swift 的数组来实现。 上面代码先插入四个元…
【数据结构与算法 - Swift实现】05 - 树 (Tree)
虽然我们在iOS开发中,很少接触树结构,但他是一种极其重要的数据结构。树也分很多种类:1)二叉树;2)二叉搜索树;3)平衡搜索树等。 在这篇文章里,我们先实现一个简单的树。 在写代码之前,先学习一些树结构中的专业术语。 树,是由节点组成的,每个节点存储了一些数据和他的子节点。图…
【数据结构与算法 - Swift实现】06 - 二叉树 (Binary Tree)
二叉树的遍历算法有三种:1)中序遍历;2)前序遍历;3)后序遍历。 遍历顺序:对当前节点的左子节点进行中序遍历 --> 当前节点 --> 对当前节点的右子节点进行中序遍历,简称左根右。 遍历顺序:当前节点 --> 对当前节点的左子节点进行前序遍历 --> 对当前节点的右子节点进…
【数据结构与算法 - Swift实现】07 - 二叉搜索树 (Binary Search Tree)
二叉搜索树 (BST)可以提高查找、插入和删除的效率,时间复杂度都为O(log n)。成为二叉搜索树必须满足下面两个条件: 我们先来看看二叉搜索树和数组在查找、插入和删除操作的效率对比。假设我们有下列数组和二叉搜索树: 数组:需要拿数组的每个元素与6去对比,时间复杂度为O(n)…
【数据结构与算法 - Swift实现】08 - 平衡二叉搜索树 (AVL Tree)
AVL树,第一个自平衡的二叉搜索树,是Adelson-Velsky 和 Evgenii Landis 在1962年提出的,所以 AVL来自于他们名字的简称。 完美平衡:从上到下,除了最下面一层节点外,其他节点都有左右子节点。这是最理想的平衡状态。在实际中是比较难达到的。 不错的…
【数据结构与算法 - Swift实现】09 - 数据结构 堆 (Heap)
堆,其实是一个完整的二叉树(除了叶节点外,其他节点都有左右子节点)。堆有以下两种形式: 最大堆:根部元素的值最大,越往下,值越小。例如 最小堆:根部元素的值最小,越往下,值越大。例如: 虽然堆本质上是属于二叉树,但是我们不实用节点来实现,而是使用数组。因为堆中的元素有一定的优先…
【数据结构与算法 - Swift实现】10 - 优先队列 (Priority Queue)
在【数据结构与算法 - Swift实现】04 - 队列 (Queue)文章里面,我们已经讲过队列,采用先进先出的规则。这边文章我们要学习的是优先队列,根据优先级的高低来决定出队的顺序。 在上一篇文章【数据结构与算法 – Swift实现】09 – 数据结构 堆 (Heap)中,我…
【数据结构与算法 - Swift实现】11 - 二分查找 (Binary Search)
二分查找是高效搜索算法中的一员,时间复杂度为O(log n)。使用搜索算法前,需要满足两个条件: 集合中的元素必须可以使用索引直接访问,在 Swift 中,这个集合必须是RandomAccessCollection类型。 欢迎加入我管理的Swift开发群:536353151。
【数据结构与算法 - Swift实现】12 - 时间复杂度为O(n^2)的排序算法
时间复杂度为O(n^2)的排序算法性能并不好,但作为刚入门算法的同学来说,还是有必要学习一下的。这里我们会讲到三种排序算法:1)冒泡排序;2)选择排序;3)插入排序。 第二个和第三个继续比较,第三个数 14 大于第二个数 8,无需交换。 第三个和第四个比较,14 与 5 交换,…
【数据结构与算法 - Swift实现】13 - 归并排序 (Merge Sort)
归并排序算法是一个效率很高的排序算法,时间复杂度为 O(n log n)。它的算法思想是先分组,各小组排好序后,再把结果合并。 到目前为止,每个子数组只有一个元素,不能再继续往下分组,分组的操作到此完成。 完成排序。 while 循环结束后,如果左右子数组还有剩下的元素,则直接…
【数据结构与算法 - Swift实现】14 - 快速排序 (Quicksort)
像归并排序一样,快速排序也是通过分组的思想来实现。 快速排序中最重要的环节是支点(pivot)的选择,也就是我们如何去把数组进行分组。支点把数组分成三个部分:[小于支点的元素 | 支点 | 大于支点的元素]。 这篇文章将会选择两种分组方式来实现快速排序:1)lomuto 划分,…
【数据结构与算法 - Swift实现】15 - 图表 (Graph)
图是由顶点和顶点之间边组成的一种数据结构。如下图所示: 在加权图中,每一条边都有一个权重,我们可以利用这个权重来计算除图中两个顶点的最小路径。 图中顶点代表一个地点,边代表从一个地点到另外一个地点的路线,而权重代表机票的费用。根据这个图,我们可以计算出从武汉到纽约机票最少的路线…
【数据结构与算法 - Swift实现】16 - 广度优先搜索和深度优先搜索
广度优先搜索和深度优先搜索是在图的基础上来讨论的,它们都是图的顶点的遍历方式。下面我们一个个来研究一下。 广度优先搜索可以用来解决这些问题:1)生成最小生成树;2)寻找顶点之间所有可能的路径;3)寻找顶点之间的最短路径。 我们把从一个起点开始的边的终点称为邻居,那么广度优先搜索…
【数据结构与算法 - Swift实现】17 - 迪克斯特拉 (Dijkstra) 算法
Dijkstra算法,中文叫狄克斯特拉算法,在地图中寻找两个地点之间的最短或者最快路径非常有用。狄克斯特拉算法是一个贪婪算法,也就是在处理过程中每一步都选择最佳路径。 在狄克斯特拉算法中,我们首先要先选定一个起点,假设起点为 A。 表格中的后面的四个 nil 意思是暂时没有顶点…