![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构初阶
文章平均质量分 78
包括顺序表、链表、站、队列、二叉树、map、set、哈希表和一点点高阶数据结构的知识
灰阳阳
重要的是知行合一
展开
-
快速排序详解及优化方式
快速排序的时间复杂度是O(n log n),其中n为待排序数组的长度。快速排序的每次划分操作需要O(n)的时间复杂度,而递归调用的次数为O(log n),因此总的时间复杂度为O(n log n)。在最坏的情况下,即数组已经有序的情况下,快速排序的时间复杂度为O(n^2)。原创 2024-04-27 11:56:03 · 1633 阅读 · 3 评论 -
直接插入排序与希尔排序的详解及对比
先选定一个整数,把待排序文件中所有记录分成多个组, 所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达 =1时,所有记录在同一组内排好序。原创 2024-04-24 16:23:58 · 916 阅读 · 2 评论 -
什么是哈希表(HashTable)?
如果插入元素“66”,我们发现这个哈希表(数组),就出现问题了,因为通过哈希函数计算,下标应该是6,但是下标为6的位置已经存储了一个元素了。此时,我们在用关键码,借助哈希函数计算出下标的位置,就可能出错了,因为同一个下标,不同的元素,计算出来的下标可能会出现一样的情况,在所有元素存完后,如果要搜索某一个元素,只需要获取改元素的关键码,通过哈希函数,计算出哈希表相应位置,判断是否有此元素即可。首先,我们需要明确一点,由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,这就导致一 个问题,原创 2024-05-02 11:41:06 · 1026 阅读 · 0 评论 -
HashTable的简单实现(不含红黑树)
在实际的底层中,如果链表的长度达到一定时,会把他们变成红黑树,比较的复杂,这里就不展示了。然后就是实现两个重要方法。原创 2024-05-02 15:24:55 · 199 阅读 · 0 评论 -
为什么堆排序的时间复杂度是O(N*logN)?
本文章以升序为例进行讲解(实际上两种排列时间复杂度都一样,只是比较方式和建立大小堆恰好相反)文章涉及:1.向下调整算法2.建堆的方式及其时间复杂度3.堆排序步骤和时间复杂度分析注意:如果1,2点还不了解,建议学习完之后在来学习堆排序,才能明白下边讲的是什么。原创 2024-04-23 09:48:46 · 1404 阅读 · 1 评论 -
用队列实现二叉树层序遍历(广度优先搜索)
当队列不为空的时候,出队列。此文章用的是java实现,相对C语言,较为简单,如果使用C语言也可以做,只需要自己建立一个队列,但这样就比较耗时。4.然后重复第二点的操作,出队一个结点,cur指向这个结点,把cur指向的那个结点所储存的元素放到要返回的数组中。一共有画了8张图,但是核心思路其实就是第1、2、3小点,完全不用担心复杂或者不好理解的哦。看吧,A.B.C ~ 遍历的层序顺序快出来了!因为接下来的队列内节点都是叶子节点,所以第三步不会执行。注意,一定要按照先左后右的顺序,因为是层序遍历。原创 2024-04-17 12:34:56 · 432 阅读 · 0 评论 -
从中序与后序遍历序列构造二叉树
下面以下图的例子作为讲解:题目给定两个有效的中序和后序遍历的二叉树,可以确定唯一的这颗二叉树。原创 2024-04-20 09:18:04 · 1009 阅读 · 0 评论 -
最近公共祖先
解法二相较于解法一,时间和空间复杂度都有大幅的优化,因为解法一其实也用了递归,而且递归搜索了两次(找p和q的路径),其次,还建立了两个栈。其是想要用程序实现这个思路,难点就在于如何去寻找两个节点的路径,我们先把简单的框架搭好,在来解决这个棘手的问题。3.两个栈同时出栈,出栈时比较元素是否相等,如果相等返回这个元素,这个元素就是要的最近公共结点。其实也不难,在寻找这两条路径的同时,我们可以分别建立一个栈,把每个路径的节点都压入栈中。因为题目已经说了所给的这颗树,至少有两个节点啊,按照递归分治思想,那么。原创 2024-04-18 11:58:45 · 402 阅读 · 0 评论 -
Map和Set基础
本文找先不涉及两种数据结构的底层,目标是:理解Map和Set的大体框架,了解他们有什么用,用在哪里的然后再从浅层深入底层。小编认为:先了解也下Map和Set大体是用来做什么,如何用,用在那,是首先应该学的。对底层的掌握固然重要,但实际上掌握底层的最终目的不就是为了让我们更好的运用这种数据结构吗?如果直接深入底层,可能啃到最后,还不直到Map和Set到底是个什么东西。仅限小编个人观点。😘本文找涉及的,大家忍忍,忍一下,就好咯。原创 2024-05-01 09:48:39 · 1333 阅读 · 1 评论 -
归并排序详解
3、比较两个指针所指的元素,把小的那个元素先存放到临时数组中,然后指针往前移动,以此类推,直到arr1和arr2两个数组全部遍历完。其实分解思路都一样,就是把数组先分解成一个一个有序的数字,然后两个两个合并,然后四个四个合并........因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序。递归实现和非递归实现,合并的方式都是一样的,只是分解的方法有所差异。如何把这两个有序的数组合并成arr3={1,2,3,4}呢?,所以我们重点看看,如果把一个数组,分成若干个小的数组。原创 2024-04-28 12:18:26 · 468 阅读 · 1 评论 -
非递归实现二叉树的后序遍历
递归本质其实就是运用了栈这个数据结构,虽然我们不使用递归,但是任然需要用到栈这个数据结构,只是这个数据结构需要我们自己维护,相比于递归,他的时间空间开销肯定会更小。除了List,存的元素不一样,其他变量都一样,如果我在画下去,其实就没有意义了,就是在这三张图里一直兜圈子,而list只记录了E,走完代码之后,我们发现了一个尴尬的窘境,走到E,程序就结束了,list什么都没有存。不要怕,有时,在最困难的时刻,在坚持一小会儿,就会看到胜利的╰(*^▽^*)╯。因为是后序遍历,我们要想办法,访问到E结点。原创 2024-04-16 08:57:55 · 261 阅读 · 1 评论 -
二叉树层序遍历(返回一个不定长二维数组)
在循环中,用poll方法,出队列一个元素,用cur接收,把cur中的元素存储在二维数组中,至于怎么一层一层的存储最后将,先把整体思路捋一遍,把如何用队列层序遍历讲清楚。只要size不为零,就出队一个元素,把这个元素存储在List中,同时按照,左右顺序,入队两个元素。定义一个cur,cur先指向根节点,然后建立一个空队列,把cur节点Offer进队列。题目要求层序遍历二叉树,然后把每个节点的元素存储在二维数组中,然后返回这个二维数组。获取当前队列所存的元素大小,在此循环中,在建立一个循环。原创 2024-04-15 09:02:37 · 404 阅读 · 0 评论 -
优先级队列(概念理解/底层模拟/时间复杂度分析)
保姆级教程,教你什么是向下调整算法,计算时间复度原创 2024-04-22 15:18:52 · 901 阅读 · 1 评论 -
DS进阶:二叉搜索树
为了优化搜索二叉树的效率,由此在二叉搜索树的基础上,诞生了AVL树,和红黑树,等等。注意:前两类有一个重叠情况,就是cur.left和cur.right都是空的情况,不过都不影响,往下看就知道了。由于二叉搜索树储存元素的特点,查找效率就和这颗二叉树的深度有关系,结点越深,比较次数就越多。显然,val=6的结点可有可无,反正我的parent.right指向的就是你,管你是啥呢。上述的插入,都是在叶子节点操作的,且最后插入完成之后,仍然是二叉搜索树。没错,此时我们成功的把问题,转化为了前面两类的其中之一了。原创 2024-04-29 17:51:01 · 405 阅读 · 3 评论 -
技巧:无脑秒解“已知前序\后序与中序遍历序列,求后序\前序遍历序列”
相对于传统方法,此方法非常的快,不管你到底有多少个节点!三步走就能解题:1、画坐标系2、填结点3、连结点。原创 2024-05-11 09:24:03 · 425 阅读 · 0 评论 -
二叉树的性质总结(含讲解/应用习题)
1. 某二叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该二叉树中的叶子结点数为( )但是仅仅是这一个公式,只能求出完全二叉树的特殊情况(也就是满二叉树),那其他非特殊情况怎么求?若规定根节点的层数是1,则第i层最大结点=2^(i-1)相信看到这里,求二叉树深度的公式已经理解了,即使忘记,也能推导得出来。4.一棵完全二叉树的节点数为531个,那么这棵树的高度为( )2.一般log的底数默认都是2,这里也一样,底数也是2。也就是度为0的节点,永远比度为2的节点多一个。原创 2024-04-10 11:51:03 · 768 阅读 · 6 评论 -
树的基本概念(重点)
具有相同父结点的结点互称为兄弟结点;从根开始定义起,根为第1层,根的子结点为第2层,以此类推;如上图中的A,没有父亲节点的节点,叫根节点,A就是根节点。若一个结点含有子结点,则这个结点称为其子结点的父结点;以某结点为根的子树中任一结点都称为该结点的子孙。一个结点含有的子树的根结点称为该结点的子结点;L、J、M、J、K......都是叶子结点;如上图:H、E、C...等节点为分支结点。比如图中,的M、N就在A树的第4层;从根到该结点所经分支上的所有结点;如上图:所有结点都是A的子孙。M、N是H的孩子节点;原创 2024-04-10 09:33:06 · 314 阅读 · 1 评论 -
二叉树遍历(前序创建|中序遍历)
博主这里用的是java实现随手记一个知识:hasNext读取到(空格不会退出)为什么要强调这个呢?因为这道题,让我们输入一个字符串,,如果使用,读取的字符串信息是不正确的。原创 2024-04-14 20:54:59 · 297 阅读 · 0 评论 -
平衡二叉树及其_时间\空间优化
其实就类似于一条弯曲的赛道,总长度十万八千里,但是你发现,在赛道的沿途,有些近路,可以超,直接走近路就可以节省一大半的路程和时间。没有优化前的代码,只会去判断当前节点左右子树深度的大小是否大于1,大于1,才停止递归返回假。2.然后再主方法中调用1中的方法,如果当前节点满足条件,那么递归左右两个子树,直到为空。不断判断左右两颗子树的深度是否大于1,一旦大于1,递归返回-1(表示不是平衡二叉树)如果是使用未优化的代码,第一次递归时,只会计算A左右子树深度是否大于1,显然这不符合,程序还会递归下去。原创 2024-04-14 15:46:18 · 538 阅读 · 0 评论 -
双向无头链表removeKey与removeAllkey的实现
如果要删除的关键字在一些特殊的链表,或者特殊的节点,它们的前驱或者后继节点就可能为空,但是我们在操作删除某一个节点的时候有时需要用到他们,无头双向链表的指定元素删除需要判断的情况有很多,因为每个节点都有前驱节点和后继节点。掌握了removeKey,这个也就不难了,只需要一直遍历链表,==key的就删除。//中间任意节点(链表节点数大于0,不头删,不尾删)删除。1.头节点是否等于cur(是否为头节点)//链表不止有一个节点的头删。//链表不止有一个节点的尾删。//链表只有一个节点的删除。原创 2024-04-03 10:01:02 · 129 阅读 · 2 评论 -
设计循环队列
用数组实现的队列,叫循环队列实现循环队列的思路有很多,比如:1.使用usedSize2.使用标记,判断队列是否为空3.在数组中空出最后一个位置这里面,第三个方法相对麻烦,我们就用第三种方法来讲解,。原创 2024-04-08 09:20:46 · 671 阅读 · 0 评论