我的第一本算法书学习总结

本文是作者学习算法的总结,涵盖了算法基础、数据结构(如数组、链表、堆、二叉搜索树)和排序算法(冒泡、选择、插入、堆、归并、快速)的介绍,还包括了数组查找和图的搜索算法,如二分查找、广度优先搜索和深度优先搜索。此外,还提及了最短路径问题的贝尔曼-福特和狄克斯特拉算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法的基础知识

算法就是计算或解决问题的步骤。不同的算法有不同的时间复杂度和空间复杂度

一、数据结构

数据结构包括数据的逻辑结构和数据的存储结构
1.数组、链表、栈、队列、
2.哈希表
存储“键-值”数据
在哈希表中,我们可以利用哈希函数快速访问到数组中的目标数据,如果发生哈希冲突,就使用链表进行存储。
数组空间太小,哈希冲突就会增多,线性查找的频率就会提高;
数组空间太大,就会有很多空箱子,造成内存浪费
3.堆
堆是一种图的树形结构,被用于实现优先队列。优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺
序取出。
规则:子结点必定大于父结点
堆中最顶端的数据始终最小,所以无论数据量有多少,取出最小值的时间复杂度都为 O(1)
删除或者增加数据时,重构树的时间复杂度为 O(logn)
4.二叉搜索树
性质:
每个结点的值均大于其左子树上任意一个结点的值,均小于其右子树上任意一个结点的值。
时间复杂度O(logn)

二、排序

排序就是将输入的数字按照从小到大的顺序进行排列

1.冒泡排序
“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”
总的比较次数为 (n -1) +(n -2) +…+1 ≈ n2/2,时间复杂度为 O(n2)。
2.选择排序
“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”
总的比较次数为 (n -1) +(n -2) +…+1 ≈ n2/2,时间复杂度为 O(n2)。
3.插入排序
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。
时间复杂度为 O(n2)。
4.堆排序
堆排序的特点是利用了数据结构中的堆。
堆排序一开始需要将 n 个数据存进堆里,所需时间为 O(nlogn)
每轮取出最大的数据并重构堆所需要的时间为 O(logn)
整体来看堆排序的时间复杂度为 O(nlogn)。
5.归并排序
归并排序算法会把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子
序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个
有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。
时间复杂度为 O(nlogn)
6.快速排序
快速排序算法首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。
快速排序是一种“分治法”。它将原本的问题分成两个子问题(比基准值小的数和比基准值大的数),然后再分别解决这两个问题
时间复杂度为 O(nlogn)

三、数组的查找

1.线性查找O(n)
线性查找的操作很简单,只要在数组中从头开始依次往下查找即可
2.二分查找O(logn)
只能查找已经排好序的数据。
二分查找通过比较数组中间的数据与目标数据的大小,可以得知目标数据是在数组的左边还是右边。因此,比较一次就可以把查找范围缩小一半。

四、图的搜索

圆圈叫作“顶点”(也叫“结点”),连接顶点的线叫作“边”。也就是说,由顶点和连接每对顶点的边所构成的图形就是图。

图的搜索算法:
可分为广度优先搜索(候补顶点用队列)和深度优先搜索(候补顶点用栈结构)。
广度优先搜索选择的是最早成为候补的顶点,因为顶点离起点越近就越早成为候补,所以会从离起点近的地方开始按顺序搜索;而深度优先搜索选择的则是最新成为候补的顶点,所以会一路往下,沿着新发现的路径不断深入搜索。
虽然广度优先搜索和深度优先搜索在搜索顺序上有很大的差异,但是在操作步骤上却只有一点不同,那就是选择哪一个候补顶点作为下一个顶点的基准不同。

最短路径问题的算法:
1.贝尔曼 - 福特(Bellman-Ford)算法
将图的顶点数设为 n、边数设为 m。该算法经过 n 轮更新操作后就会停止,而在每轮更新操作中都需要对各个边进行 1 次确认,因此 1 轮更新所花费的时间就是 O(m),整体的时间复杂度就是 O(nm)。

2.狄克斯特拉(Dijkstra)算法
将图的顶点数设为 n、边数设为 m,那么如果事先不进行任何处理,该算法的时间复杂度就是 O( n2)。不过,如果对数据结构进行优化,那么时间复杂度就会变为O(m +nlogn)。

如果闭环中有负数权重,就不存在最短路径。贝尔曼 - 福特算法可以直接认定不存在最短路径,但在狄克斯特拉算法中,即便不存在最短路径,它也会算出一个错误的最短路径出来。因此,有负数权重时不能使用狄克斯特拉算法。
总的来说,就是不存在负数权重时,更适合使用效率较高的狄克斯特拉算法,而存在负数权重时,即便较为耗时,也应该使用可以得到正确答案的贝尔曼 - 福特算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值