
数据结构
文章平均质量分 82
数据结构分析与实现
写不来CODE
我很懒,还没有个人简介
展开
-
哈希
是一种。本质上就是通过哈希函数,使关键字key和存储位置建立一个映射关系。查找时,通过这个哈希函数计算出关键字key存储的位置,进而直接在指定的存储位置找到目标。所以哈希可以是实现O(1)的查找。需要注意的是,哈希表只是哈希思想的一种展现,哈希表是借助哈希函数,将关键字映射到数组指定位置的一种数据结构。分析:因为字符串中只包含小写字母,所以我们可以开一个26的数组用来映射每一个字母出现的次数,在这里我们的哈希函数就是ch-'a',这样我们就可以让每一个小写字母都映射一个位置。我们这里用到的就是。原创 2024-12-02 09:29:55 · 687 阅读 · 0 评论 -
模拟map/set的实现
map和set的底层都是红黑树,而我们在前面已经了解了红黑树的实现,所以我们现在来模拟实现map和set。原创 2024-11-22 18:05:11 · 784 阅读 · 0 评论 -
红黑树
如上图所示,一共有9条路径:我们现在来分析第四点:从节点18开始的9条路径上,每一条路径都有两个黑色节点。对节点10来说,每条路路径都有一个黑色节点。注意:《算法导论》等书籍上补充了⼀条规则:每个叶子结点(原创 2024-11-19 20:49:25 · 895 阅读 · 0 评论 -
AVL树
上面我们是将所有情况都抽象出来进行分析的,下面我们来分析一下一些具体情况:当a/b/c的高度都是0时,此时高度不平衡,其满足右单旋的规则,所以我们将b->nullptr作为10的左子树,然后将10作为5的右子树,最后让5成为新的根。此时就完成了右单旋,平衡因子也更新成为0.当a/b/c的高度为1时,我们依旧采取之前的原则,将b作为10的左子树,10作为5的右子树,然后5作为新的根,5和10的平衡因子更新都更新成为0.原创 2024-11-16 21:02:10 · 920 阅读 · 0 评论 -
二叉搜索树
对于最坏情况来说,二叉搜索树类似于一颗单边树,它的节点全部都在树的一侧分布,此时它的结构就类似于链表的结构了,假设有N个节点,那么它的高度就是N,所以遍历这个树的时间复杂度为O(N).查找的逻辑与插入的逻辑类似,也是一个一个的比较,大于根节点就向右走,小于就向左走,等于就找到了,如果走到了空,就说明这棵树中没有该节点,返回false即可。我们在删除树的节点时要递归着删除,根据后序遍历的顺序进行删除,这里遇到的问题与中序遍历打印该树的节点是一致的,所以我们也采取一个外壳程序来调用真正的销毁。原创 2024-11-13 09:08:03 · 948 阅读 · 0 评论 -
数据结构——八大排序
该方法就是key指向左端点值,prev也指向左端点,cur指向prev的下一个位置,然后cur开始向后遍历,遇到比key小的数后,prev往前走一步,然后交换cur和prev,然后cur继续走,当cur指向序列之外时,此时prev指向的数据就已经有序了,返回该值作为区分区间的依据。直接插入排序的逻辑就是插入排序的逻辑,我们根据动图分析,我们先将第一个数3看作为有序,然后将后面的数与其进行比较,如果小于则3往后挪,将后面的数插到前面,否则就不动,此时这两个数就有序了。当只剩一个区间时,就说明已经排序完成了。原创 2024-08-03 22:00:54 · 2260 阅读 · 2 评论 -
二叉树的链式存储
她是军统美女特工,色诱汉奸一把好手!一件事之后竟......原创 2024-07-28 22:28:16 · 1793 阅读 · 0 评论 -
小伙饿坏了,赶紧点了一份爱学的二叉树——堆,狼吞虎咽学完很过瘾
如何建堆呢?原创 2024-07-25 14:22:48 · 673 阅读 · 0 评论 -
栈和队列的应用
队列遵循的是先入先出规则(First In First Out,FIFO),并且只能从队尾插入数据,从队头删除数据;而栈遵循的规则是(Last In First Out,LIFO),只能从栈顶入数据和出数据。这个题目要求我们使用两个队列来实现栈,这两种数据结构遵循的操作都不同,我们要怎么实现呢?原创 2024-07-21 16:51:49 · 756 阅读 · 0 评论 -
重生之我在学数据结构——队列
队列是一种先进先出(First In First Out ,FIFO)的数据结构,可以简单理解为排队的概念。在队列中,数据项按照插入的顺序排列,并且只能在队列的一端插入(称为队尾),在另一端删除(称为队头)。先进先出的概念就是先进队列的数据就会先出队列。比如入队顺序为1、2、3、4,那么出队列的顺序只有1、2、3、4这一种可能性。如果我们要选择结构来实现队列的话,应该选谁呢?数组的话,因为涉及到队头出数据。数组的话,删除第一个数据的话,后面所有的数据都得往前挪,所以我们不考虑数据。原创 2024-07-19 20:00:29 · 1118 阅读 · 0 评论 -
重生之我在学数据结构——栈
栈是一种特殊的线性数据结构,它只能在一端进行插入和删除操作,这一端被称为栈顶。栈按照后进先出(Last In First Out,LIFO)的原则进行操作,即最后插入的元素最先出栈。后进先出是什么意思呢?因为栈的插入和删除都是从栈顶操作的,而对于先插入的数据来说,更靠近栈底,后插入的数据更靠近栈顶,而出数据又是从栈顶出的,所以后插入的数据就会先出来。原创 2024-07-19 18:04:00 · 1149 阅读 · 0 评论 -
顺序表和链表的区别
顺序表和链表其实是两个相辅相成,互补的数据结构,因为他们彼此之前都有自己个优势,也有自己的不足,这里我们来了解一下顺序表和链表的区别。这里的链表指的是带头双向循环链表。原创 2024-07-19 15:53:16 · 980 阅读 · 0 评论 -
C语言之带环链表
带环链表是数据结构链表中的一个经典问题,这里我们研究该问题分为两个方向:链表是否带环、返回链表的入环节点。原创 2024-07-15 20:16:23 · 1527 阅读 · 10 评论 -
nowcoder——回文结构
我们来分析该题:我们首先要清楚什么是回文结构?如果一个链表呈对称结构就说明该链表具有回文结构。找链表的中间节点我在前面已经解答过了我们在这里直接CV即可。没了解过的可以看这篇博客——逆置链表我在前面也已经解答过了我们依旧CV一下。不了解的可以看这篇——有了思路,我们只需要完成第一步和第二步。找到中间节点以及逆置链表。那我们怎么判断该链表是否属于回文结构呢?原创 2024-05-12 13:14:37 · 413 阅读 · 16 评论 -
leetcode——反转链表
思路:创建三个指针n1,n2,n3,遍历原链表,通过三者之间的关系将链表反转。原创 2024-05-12 06:30:00 · 350 阅读 · 3 评论 -
leetcode——链表的中间节点
链表的中间节点是一个简单的链表OJ。我们要返回中间节点有两种情况:节点数为奇数和节点数是偶数。如果是奇数则直接返回中间节点,如果是偶数则返回第二个中间节点。原创 2024-05-11 15:01:01 · 319 阅读 · 7 评论 -
C——单链表
我们在前面已经了解了链表中的双向链表,而我们在介绍链表分类的时候就说过常用的链表只有两种——双向带头循环链表和单向不带头不循环链表。下来我来介绍另一种常用的链表——单向不带头不循环链表也叫做单链表。不清楚链表分类的以及不了解双向链表的可以看我之前的博客。原创 2024-05-11 10:25:31 · 1105 阅读 · 21 评论 -
C——双向链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢?意思就是链表在物理结构上不一定是连续的,但在逻辑结构上一定是连续的。链表是由一个一个的节点连接而成的。我们借助这个图来理解链表的物理结构上的不连续和逻辑结构上的连续。这上面的6个节点在内存空间的地址不是连续的,但是他们在逻辑上却是连续的,1->2->3->4->5->6。与链表相似的还有顺序表,顺序表与链表相同都是线性表的一种。原创 2024-05-02 11:54:46 · 1738 阅读 · 50 评论 -
nowcoder——删除公共字符
因为该字符串中会包含空格,scanf遇到空格就会停止读取,所以我们不能使用scanf来输入字符串。其实原因是第一个scanf读取结束后,缓冲区内有一个\n,第二个scanf就读到了\n,就直接结束了,所以第二个scanf什么都没有读到。我们利用了自己写的函数完成了判断字符在另一个字符串中是否出现的问题,而我们C语言标准库里面有一个函数也可以完成该功能——strchr。我们分析完思路后,思路一和思路二虽然可以完成要求,但是写起来还是有点复杂,所以我们直接实现思路三。,该函数的功能就是从标准输入流读取字符串。原创 2024-05-01 13:26:16 · 527 阅读 · 6 评论 -
nowcoder——BC146添加逗号
我们观察到,当我们将该整数放入数组中,i最终会指向最后一个数的下一个位置。当整数为0时,说明已经将该整数的每一位都取出来了,我们现在只需逆序打印该字符数组就可以得到添加逗号后的结果。我们可以利用下面的代码获取该整数的每一位数并转换成字符存入字符数组中,并且每存三位会放入 一个逗号。我们首先看该题目的要求,输入一个整数,给这个整数每三位添加一个逗号。这就是实现我们思路的代码轮廓,我们现在给里面添加代码来实现功能。当我们放入最后一个数之后i仍然++,所以i所指的是一个空的元素。我们现在来分析如何实现该的题目。原创 2024-05-01 12:02:44 · 429 阅读 · 10 评论 -
Leetcode——面试题02.04.分割链表
遍历原链表,如果节点的val值小于x则尾插到little链表中,如果节点的val值大于等于x则尾插到big链表中,遍历完后,连接这两个新链表即可。该问题出现的原因是因为big链表的尾节点的next指针指向的不是NULL造成的。我们创建完链表并遍历完之后,就得到了两个大小链表,我们只需要将这两个连接起来就可以了。在原链上进行修改:如果该节点的val小于x则继续往后走,如果大于等于x则将该节点尾插到该链表,然后删除该节点,继续遍历;我们在创建链表的时候可以采取带头链表的方式,这样可以避免重复代码的出现。原创 2024-04-30 21:42:07 · 611 阅读 · 6 评论 -
Ieetcode——21.合并两个有序链表
哨兵位是一个有空间但是没有值的节点,而且是动态开辟的内存空间,所以我们现在就不能直接返回newist了,而是返回newlist->next,但是动态开辟的内存空间我们使用完之后就应该释放掉,所以我们应该先创建一个临时变量将newist->next存起来,然后将newlist释放掉,后返回临时变量。合并两个有序链表我们的思路是创建一个新链表,然后遍历已知的两个有序链表,并比较其节点的val值,将小的尾插到新链表中,然后继续遍历,直到将该两个链表的全部节点全部尾插到新链表中。部分一:用来解决重复代码。原创 2024-04-30 17:58:02 · 728 阅读 · 12 评论