![](https://img-blog.csdnimg.cn/direct/caeb157422844dd8891bc30a4c52ad3c.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 74
数据结构笔记啦
贩卖纯净水.
圣火昭昭,圣光耀耀,凡我子弟,喵喵喵喵
展开
-
二叉树间奏
已经学习过了二叉树的基础知识,那么间奏部分就来感受一下二叉树部分的OJ题吧。原创 2024-05-30 17:26:47 · 479 阅读 · 6 评论 -
二叉树序曲
已经学过很多数据结构了,我们需要明晰两个概念:逻辑结构:我们想象出来的结构物理结构:内存中实在存储的结构线性表是逻辑结构的描述。树是一种非线性的数据结构,它是由n (n>=0) 个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树(根朝上,叶朝下)有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、......Tm,其中每一个集合Ti(1原创 2024-02-27 23:58:16 · 713 阅读 · 2 评论 -
函数栈帧的创建与销毁
什么是函数栈帧呢?在写代码的时候经常会把一个独立的功能抽象成函数,C程序是以函数为基本单位的。局部变量是如何创建的呢?为什么局部变量不初始化内容是随机的呢?函数如何调用呢?函数返回值如何返回呢?传参的底层逻辑又是什么呢?学会了函数栈帧,这些问题都将迎刃而解。函数栈帧是函数调用过程中在程序的调用栈(call stack)所开辟的空间。这些空间是用来存放:1.函数参数和函数返回值2.临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)原创 2024-02-25 23:43:41 · 1427 阅读 · 2 评论 -
七战数据结构--堆
堆总是一棵完全二叉树,一般将数组数据看做一棵完全二叉树。例:1.下列关键字序列为堆的是:( )答案:A一般我们说的堆指两个东西,其一是数据结构中的堆(完全二叉树),其二是操作系统中的堆(内存区域的划分,动态内存申请的区域),它们是不同学科里的同名名称。堆的存在有什么意义呢?1.堆排序(时间复杂度为O(N*logN))2.top K问题(找出一组数据中最大/最小的K个值)tips:堆的功能是选数。原创 2024-02-11 10:34:36 · 1002 阅读 · 2 评论 -
五战数据结构--队列
什么是队列呢?下定义:队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 (First In First Out)的特点。入队列:进行插入操作的一端称为队尾。出队列:进行删除操作的一端称为队头。队列也可以用数组和链表的结构实现,使用链表的结构实现更优。如果使用数组的结构,出队列在数组头,效率比较低。原创 2024-01-29 23:58:16 · 274 阅读 · 2 评论 -
四战数据结构--栈
你所看见的栈一定是你以为的栈吗(我在云什么(◎_◎;)),上面提到的栈是数据结构中的栈,还有一个“栈”是语言/操作系统中的栈,指一块内存区域。那么栈溢出是哪个概念呢?是操作系统中的栈,栈溢出指空间不够,在递归程序返回条件有问题的时候会出现栈溢出。原创 2024-01-28 17:17:41 · 400 阅读 · 3 评论 -
三战双向带头循环链表
特点:1.无头单向非循环链表: 结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构(如哈希桶、图的邻接表...),在笔试面试中出现很多。2.带头双向循环链表: 结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单且实用。原创 2024-01-26 22:05:41 · 657 阅读 · 4 评论 -
二战单链表
SLNode;原创 2024-01-26 22:05:19 · 189 阅读 · 10 评论 -
一战顺序表
1.线性表线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表: 顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条重线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。链表和顺序表都是线性表的一种顺序表就像一辆大卡车(和数组差不多),链表就像托马斯小火车顺序表概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,,一般情况下采用数组存储。原创 2024-01-26 22:05:00 · 273 阅读 · 6 评论 -
链表和递归的双向奔赴
计算机如何运行递归函数:在一个函数中调用一个函数时,计算机需要在进入被调用函数之前跟踪它在当前函数中的位置(以及任何局部变量的值),通过运行时存放在堆栈中来实现(堆栈帧)。在堆栈中存放好了数据后就可以进入被调用的函数。所以在使用递归时空间复杂度要考虑堆栈的使用情况,不是完全适用的,层次过深开销太大。两个我学起来很闹心的事情结合到一起,双厨狂喜了(我第一次做的时候用的不是递归,不知道哪个聪明小脑瓜用的递归)迭代虽好,可是递归看起来更秀哎,官方题解都说呢:递归为我们提供了一种优雅的方式来方向遍历节点。原创 2024-01-26 22:00:12 · 144 阅读 · 4 评论 -
栈和队列の纠缠之缘
其实不是很难哈哈,用栈实现队列相对简单,和队列不同,两个队列不会发生顺序的变化,但是两个栈会,只需要反转一次数据即可达成目标。基于队列实现就可以使用两个队列,一个队列用来存放数据,另一个队列用来捯饬数据(也许是捯饬,反正就是折腾数据)。出队:1.当栈Pop为空时一键将Push中的数据转移到栈Pop中,Pop出栈。2.当Pop不为空时则直接出栈Pop。入队:直接将数据存放到栈Push中。原创 2024-01-30 16:20:06 · 263 阅读 · 4 评论 -
时空复杂度
我们可以发现,大O的渐进表示法去掉了那些对结果影响不大的项,简洁明了的表示出了执行次数。另外有些算法的时间复杂度存在最好、平均和最坏情况,在实际情况中,我们关注最坏情况下的时间复杂度,即关注算法的最坏运行情况。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度,计算时间复杂度时计算的是基本操作的执行次数。时间复杂度是保守的估算,此时该算法最好为O(1),最坏为 O(N)。空间复杂度不是程序占用了多少字节的空间,知道这个也没太大意义,空间复杂度算的是变量的个数。原创 2024-01-26 22:04:30 · 846 阅读 · 9 评论 -
浪漫的双指针相遇
这道题可以用双指针法,创建两个指针(快慢指针),假设慢指针一次走一步,快指针一次走两步,他们肯定会在环内相遇(步差为1,相当于追及问题),那么当快指针一次走三步,慢指针一次走一步,他们会相遇吗?N为偶数时,当距离为0时就追上了,N为奇数时,当距离变为1后继续追击距离变为-1(开启新一轮追击,距离为C-1-->假设环的长度为C)如果N是奇数,C是偶数,则永远追不上。可以得出:一个指针从头开始走,一个指针从相遇点开始走,他们会在入口点相遇。但是,N是奇数,C是偶数的这个情况是否存在呢?环形链表pro max。原创 2024-01-26 22:06:20 · 238 阅读 · 3 评论