数据结构与算法
文章平均质量分 89
该专栏主要是用于记录我在某平台学习数据结构与算法过程中遇到的问题以及总结。希望能够帮助想要学习算法知识的朋友
本文大部分是将学习笔记merge 过来的,可能会有部分问题,还请大家帮忙提出,我会及时更改
谢艺华
主要深耕于 linux 后端开发,热衷于体系能力(包括不限于C、C++、linux、编译原理、数据结构和算法、网络、操作系统
)的沉淀,分享工作中重要的知识点和具有代表性的案例分析。
欢迎志同道合的朋友与我一起前进
展开
-
【追求卓越06】算法--递归
将f(m)的结果进行hash保存,在处理f(n)时,现在hash表中查看是否存在该value。本章我不再介绍简单的概念,主要讲解递归算法的优缺点和如何用递归写代码。本节,我们主要介绍了大家熟知的递归算法以及它存在的一些问题:栈溢出,空间复杂度高,函数调用耗时多,以及对应的解决方式。别人能够很快的分析出来,那是人家经过了大量的练习。但是如果你要使用递归处理下面的问题,你可以很快的给出结果吗?这样你才能对一个具体的问题,分析出递归公式以及终止条件。递归说简单也简单,说难也很难。循环,我更喜欢使用递归算法。原创 2023-11-22 16:20:27 · 957 阅读 · 0 评论 -
【追求卓越13】算法--深度和广度优先算法
对于有向图,如果顶点i到顶点j之间,有一条从i指向j的边,我们就将Array[i][j]置为1;假设图的顶点个数是V,边的个数是E。*对于访问过的顶点,我们不再处理,因为广度优先算法是按层搜索的,即使遇到访问过的顶点,那一定不是最短路径,故可以忽略*空间上的消耗主要是queue,prev,visit三个数组,但它们的长度不会多于V,故空间复杂度是O(V)之前我学习算法图解的时候,我写过一个广度优先算法的程序,只不过当时并没有说明图的概念,完全用数组来实现。比如,图中的A,B,C,D,E,F六个顶点。原创 2023-11-22 16:46:25 · 965 阅读 · 0 评论 -
【追求卓越12】算法--堆排序
建堆的时间复杂度是O(n),排序的时间复杂度是O(nlogn)(实际上应该是logn+log(n-1)+log(n-2)+...+log(1),这里方便,我们记录为O(logn))。故插入第一个数据的消耗的时间为log1,第二个数据消耗的时间为log2...以此推测,第n个数据消耗时间为logn。堆化的过程,其实也简单,只要循着插入节点,向上对比,进行交换即可。假设每个元素都需要进行插入,那么就是堆化n个元素,堆化的时间复杂度是O(logK),故使用过堆求top K的问题,其时间复杂度是O(nlogk)。原创 2023-11-22 16:42:37 · 938 阅读 · 0 评论 -
【追求卓越11】算法--二叉树
在上图中,A节点就是B节点的父节点,B节点是A节点的子节点。我们把没有父节点的节点称作为根节点,也就是图中的E节点。树的种类有很多,工作中,我们常接触的就是二叉树。我们把根节点存储在下标i=1的位置,那左子节点存储的下标2 * i=2的位置,右子节点存储的下标2 * i+1的位置。其中3号树中,叶子节点在最底下两层,最后一层的叶子节点都是靠左排列,并且除了最后一层,其他层的节点个数达到最大数,这种树称作。二叉查找树要求,在树中任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值。原创 2023-11-22 16:38:54 · 982 阅读 · 0 评论 -
【追求卓越10】算法--跳表
、原创 2023-11-22 16:34:53 · 1026 阅读 · 0 评论 -
【追求卓越09】算法--散列表(哈希表)
本章我们主要介绍一些散列表相关的概念:散列函数,散列冲突,散列值,关键值,以及散列冲突的解决方式。散列函数设计的好坏决定了散列冲突的概率,也决定了散列表的性能。想要设计一个好的散列表,需要从散列函数,装载因子,散列冲突解决方案着手。关于散列函数,我们不能设计的太复杂,并且尽量使散列值均匀分布,这样尽可能减少散列冲突,即便散列冲突,链表长度也较为均匀。关于装载因子,我们需要设置一个合理的装载因子上限,并在动态扩容的过程中,需要考虑均分搬移数据关于散列冲突解决方案,有开放地址法和链表法。原创 2023-11-22 16:32:54 · 1204 阅读 · 0 评论 -
【追求卓越08】算法--排序算法
注意:基数排序对要排序的数据是有要求的,需要可以分割出独立的“位”来比较,而且位之间有递进的关系,如果 a 数据的高位比 b 数据大,那剩下的低位就不用比较了。而且,计数排序只能给非负整数排序,如果要排序的数据是其他类型的,要将其在不改变相对大小的情况下,转化为非负整数。比如 5,8,5,2,9 这样一组数据,使用选择排序算法来排序的话,第一次找到最小元素 2,与第一个 5 交换位置,那第一个 5 和中间的 5 顺序就变了,所以就不稳定了。每个桶内的数据值都是相同的,省掉了桶内排序的时间。原创 2023-11-22 16:28:08 · 1418 阅读 · 0 评论 -
【追求卓越07】算法--二分查找
当数组没有频繁的插入删除操作,我们先排序再二分查找,这样也是可以接受的。本章我们开始介绍了二分查找,分析了代码实现,以及一些二分查找的变体。二分查找依赖有序的数组,对于太大或太小的数组都不太适用(太小没必要,太大没有空间)。通过上面代码的实现,我相信大家对二分查找有了一定的了解。但是心细的朋友肯定会发现,这个代码只能确认数组中是否有目标值,若有相同的元素,则不能确定返回第一个。因为当数据量很大时,也就说明需要一个很大的数组,这是一个很高的要求。二分查找的时间复杂度是O(logn),是一个非常高效的算法。原创 2023-11-22 16:23:16 · 954 阅读 · 0 评论 -
【追求卓越05】算法--复杂度
对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。并且在拥有良好的思维习惯之后(学习数据结构和算法的过程非常锻炼自己的思维能力),我相信在写代码的时候,我们会潜移默化的考虑到代码的效率问题(优秀工程师与一般工程师的区别)。最坏情况时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度。原创 2023-11-22 16:17:36 · 1047 阅读 · 1 评论 -
【追求卓越04】数据结构--栈与队列
针对作用域和生面周期变化的,我觉得栈可以很好的实现。进入一个函数时,在栈中记录入口(作用域界限),之后进行压栈操作,在该函数内部只能访问界限以内的数据。队列和栈都是抽象的数据结构,是一个操作受限的线性表。今天我们开始学习栈与队列的内容,我觉得栈并不难,所以篇幅也就不会那么多了。在虚拟空间中,栈是用户空间中的一种数据结构,它主要用于保存局部变量。在上面的队列中,当tail等于队列长度时,就需要进行数据搬移。因此栈没有固定的存储形式,比如数据是需要存储地址连续,链表存储地址可以不连续。以及队列大小设置的依据。原创 2023-11-22 16:12:26 · 1072 阅读 · 1 评论 -
【追求卓越03】数据结构--链表练习题
据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。链表是我们工作和面试的中常常会遇到的知识点,只有长时间的练习和思考才能游刃有余。该问题拓展很多,这里我给出的问题,有100个人,每数到3,就剔除,输出剔除顺序。节点,第一次相遇节点分别出发。原创 2023-11-22 16:09:47 · 1006 阅读 · 0 评论 -
【追求卓越02】数据结构--链表
比如在一个有序的链表中,我们可以保存上一次查询节点,判断查询值的大小,采取向上还是从下查询的方式。双向链表虽然我们接触的不多,但在项目中,双向链表比单链表使用的更加广泛。其实这就是一个空间换时间的例子,双向链表虽然比单向链表要高效,但是它比单向链表多一个指针变量。因为数组的存储空间是连续的,所以能够很好的适应CPU缓存机制。对于第二种情况,给定一个需要删除节点之后,仅需要将该节点的前节点指向该节点的下一个节点即可。其实第二种情况,是我们经常会遇到的,比如LinkedHashMap容器,就是使用了双向链表。原创 2023-11-22 16:05:22 · 1223 阅读 · 0 评论 -
【追求卓越01】数据结构--数组
为了减少搬移数据的次数,我们可以将删除的变量进行标记(已使用或未使用),当内存不足时,再进行释放。我相信代码的错误点,大家肯定是知道的————数组越界访问。我相信对于数组,大家肯定是不陌生,因为数组在大多数的语言中都有,也是大家在编程中常常会接触到的。我们首先要知道linux进程的虚拟内存为4G,并且不同的地址分配着不同的资源。错误的,因为即使是有序的数组,采用二分法。数组的增加和删除是比较低效的操作了。数组的最大优势就是高效的查询。我们知道局部变量是分布在栈中的,根据上面的代码,我们可以开始分析。原创 2023-11-22 16:01:43 · 1228 阅读 · 0 评论 -
【献给过去的自己】栈实现计算器(C语言)
时间流逝,在竞争激烈的社会背景下,我们的身处IT行业,不断逼迫自己去学习,去成长。但是总会觉得自己做的还不够。为什么总是赶不上别人的脚步,陷入怀疑自我的处境。朋友们,偶尔回头看看来时路上的自己,你会发现,你一直在成长,你的努力一直是正向反馈着你,不要轻视自己的努力。共勉~原创 2023-11-16 18:37:36 · 1649 阅读 · 0 评论