自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 僵尸进程

3.那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?1.进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。2.维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

2025-06-07 22:49:28 243

原创 哈希表练习

哈希表对于记录之前存在的元素进行记录,可以用于判断元素存在类问题。

2025-02-04 14:32:18 476

原创 归并排序练习

归并排序使用先处理左边,再处理右边的思想。

2025-01-26 13:56:49 727

原创 快速排序练习

快排练习题旨在熟悉快排操作与快排延伸的快速选择算法.

2025-01-20 23:17:17 988

原创 模拟练习题

模拟,顾名思义,这种题一般侧重于直接实现题目给的条件,即题目给什么,就实现什么。

2025-01-18 23:03:40 953

原创 位运算练习

而按位与的性质是有0则0,所以对于进位,以a,b两数为例,我们选择将两数按位异或的值复制给a,而将两数按位与并向左移1位的值赋值给b(按位与表示两数必须全为1才为1,将得到的值向左移就相当于进位了,而其他的一定至少有一个不为1,因为都为1才进位,所以其他的都变成了0)。我们知道,异或运算的性质是相同返回0, 相异返回1,所以我们先创造一个未丢失数字的数组,将其与丢失数字的数组按位异或,相同的值都变成了0,剩余的没有变成0的值即为丢失的数字。此时我们将得到的值模3,得到的值即为那个只出现一次的数的那一位。

2025-01-16 23:27:03 1205

原创 前缀和练习

A+B是dp[i-1][j] B+C是dp[i][j-1],D即为arr[i][j].A即为dp[i-1][j-1].如预处理,求某一块的面积,例如(x1, y1)到(x2, y2),即为A+B+C+D-(A+B)-(A+C)+A : dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1].f[i] = f[i - 1] + nums[i - 1], 并且由于存在i - 1,所以 i需要从1开始,否则就会出现f[-1]的情况;

2025-01-11 23:50:54 944

原创 二分查找算法

所以我们这里以中间值与最后数组最后一位相比较,如果中间值大于最后值,说明中间值在左边的斜线,所以最小值应该在中间值的右边;相反的,如果小于等于,则说明中间值在右边的斜线上,将中间值赋值给right即可。仍然是双指针,再定义一个中间值,将中间值与目标值相比较,如果中间值小于目标,则可以将left直接右移到mid + 1.罗列出几个数,从左至右找到所求值即可,将所求值平方并与target作比较,用二分法查找左端点。这样找一次至少筛选出一半不正确的值,效率较高,查找左端点需要注意的是求中间值时用的是。

2024-12-29 22:03:51 661

原创 双指针解题(滑动窗口)

滑动窗口属于双指针,因为左右两指针同向移动,像窗口移动而得名.

2024-12-22 23:55:29 973

原创 双指针解题

cur和dest同时向右移动,如果cur对应值为0,则dest移动两步,直到dest到数组末尾为止.

2024-12-10 23:54:56 862

原创 红黑树的实现(RB_Tree)

红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。

2024-10-18 15:28:56 775 1

原创 AVL树的实现

平衡二叉树是一种两边平衡性很高的搜索二叉树,我们主要学习其中平衡因子对树产生的影响、左右旋以及AVL树的结构,并用代码表达出来.

2024-10-14 14:47:54 1070

原创 map和set的使用

我们需要熟悉set/multiset和map/multiset并且能够运用得当:主要弄清楚容器中的迭代器的使用和注意事项;新名词如"pair"的意义;能够利用容器常见的接口,能对其进行增删查;能够了解multiset、multimap与set、map的区别,能能够分辨清楚multi的冗余在其中起到什么不同作用.

2024-10-08 20:44:08 941

原创 二叉搜索树

二叉搜索树也叫二叉序列树,若其不为空树,则其性质为:1.若其左子树不为空,则左子树的所有节点都小于等于根节点的值.2.若其右子树不为空,则右子树的所有节点都大于等于根节点的值.3.其左右子树也均为二叉搜索树.4.二叉搜索树中可以允许选择插入相同的值,也可以选择不允许插入相同的值,例如:map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值。图1。

2024-09-22 22:50:38 1193

原创 链表List

STL中的List与顺序表vector类似,同样是一种序列式容器,其原型是带头节点的双向循环链表。

2024-08-05 23:59:03 2156 1

原创 vector

vector()//使用初始化列表即可{}

2024-08-03 12:12:45 1271

原创 string类

kw=string。

2024-07-30 19:57:47 1061

原创 C++模板初探究

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。我们如果想要实现一个通用的交换函数,其中包含字符型,整型,双浮点型,该怎么办呢?函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。但是这样我们会发现会出现很多冗余的代码,我们能不能实现一个统一的函数来实现交换函数呢?如果模板可以产生一个具有更好匹配的函数, 那么将选择模。上面的代码Add后面不加类型的直接调用非模板函数,后面加类型的调用模板函数.

2024-07-25 16:59:02 597

原创 C++内存管理

C语言中的malloc/calloc/realloc/free虽然在C++中仍然可以使用,但比较麻烦.所以C++中又另外提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数。1. 调用operator new函数申请空间.2. 在申请的空间上执行构造函数,完成对象的构造.

2024-07-22 12:41:32 709

原创 类和对象(下)

• 尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其。建议声明顺序和初始化列表顺序保持⼀致。在B类中进行友元声明,说明A是B的友元类,A可以调用B中的对象,但友元是单向的,所以B仍然不能调用A中的对象.

2024-07-18 22:57:46 702

原创 类和对象(中)

如果⼀个构造函数的第⼀个参数是⾃⾝类类型的引⽤,且任何额外的参数都有默认值,则此构造函数也叫做拷⻉构造函数,也就是说拷⻉构造是⼀个特殊的构造函数。

2024-07-13 23:25:53 1077

原创 类和对象(上)

class为定义类关键字,后面跟上定义类的名字,{}为类的主体,后面要接";",定义在类的成员函数默认展开(inline)• 第⼀个成员在与结构体偏移量为0的地址处。• 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。• 注意:对⻬数 = 编译器默认的⼀个对⻬数 与 该成员⼤⼩的较⼩值。• VS中默认的对⻬数为8• 结构体总⼤⼩为:最⼤对⻬数(所有变量类型最⼤者与默认对⻬参数取最⼩)的整数倍。

2024-07-11 23:50:34 1887

原创 C++初探究(2)

public:// 成员函数private:// 成员变量int* array;size_t top;而我们如果想要对函数定义,则需要专门使用类域来定义函数.

2024-07-09 22:37:42 2602 5

原创 C++初探究

C++可以追溯到1979年,C++之父Bjarne Stroustrup在在使用C语言研发工作时发现C语言的不足,并想要将其改进,到1983年,Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性,设计出了C++的雏形。学会这几个知识点,我们就可以理解开篇的那个函数代表了什么意思了。C++中许多新语法的提出,其实也就是Bjarne Stroustrup对C语言一些语法的不满并对其进行的改造。我们可以发现,这几个知识点确实对应着C语言语法里一些较为不方便的地方。

2024-07-08 23:20:21 1119 8

原创 排序的总结

快速排序:时间复杂度:O(logN),空间复杂度:O(logN),稳定性:稳定性:不稳定:单趟排序时可能会改变位置。选择排序:时间复杂度:O(N^2),空间复杂度:O(1),稳定性:稳定性:不稳定,交换过程中可能改变相同值的位置。希尔排序:时间复杂度:O(N^1.3),空间复杂度:O(1),稳定性:稳定性:不稳定。堆排序:时间复杂度:O(logN),空间复杂度:O(1),稳定性:稳定性:不稳定。冒泡排序:时间复杂度:O(N^2),空间复杂度:O(1),稳定性:稳定性:稳定。

2024-07-08 12:07:34 466

原创 计数排序的实现

每找到一个值则在count数组中对应的位置加一,再在count数组中找到数字上方的count值,count值为几,则打印几次数组中的值.对一个数组进行遍历,再创建一个count数组。

2024-07-07 22:38:52 389

原创 归并排序的实现(递归与非递归)

基本思想:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。空间复杂度也类似于堆排序,每一层有N个,有logN层,则时间复杂度为O(logN).一共10个数据,如果显示大于9的数据都是溢出的数据,而数据溢出分为三种情况。这种代表右边已经是大数,我们不用管,直接尾插入新数组即可.

2024-07-07 21:44:11 624

原创 快排的非递归实现

初始状态下,初始化prev为left,cur为left+1,循环结束条件为cur <= right. 如果cur的值小于keyi,则cur与prev均向后移动,并且交换prev与cur的值;快排的递归实现,在深度过深时会存在栈溢出的风险,所以我们需要掌握快排的非递归写法。上次我们使用了hoare的快排单趟写法,所以这次我们使用前后指针法.

2024-07-06 21:14:05 529 1

原创 快排的实现

单趟:先假定第一个数设为key,如果左边指针的值比key大,且右边指针的值比key小,则将其交换.当左右指针相遇,则左边都比key小,右边都比key大,则以中间为标识,中间位置一定比key小(后续证明)再对其左右进行排序(递归实现)R先走,没有找到比key小的,直接与L相遇,L停留的位置是上一轮交换的位置,上一轮交换,把比key小的值,换到L的位置了.但是这样的结构对于有序数组的排序有个致命的问题:栈溢出,这是由于keyi的取值固定为一边,keyi会被一直调整,所以我们期望取得一个中间值作为key.

2024-07-02 11:59:59 664 5

原创 希尔排序的实现

我们将一直要改变的那个数设为tmp,将它与前面的数(end)比较,如果tmp较小,则进行交换,先将啊a[end] 覆盖a[end + 1],再--end达到tmp继续与前一个数比较的效果,最后达到效果.插入排序的原理是从第二个数开始,与前面的数相比较,如果比前面的数大,则与其交换,并且此移动过程会一直持续直到前k(k为此次刚开始移动的数的位置)个数达到有序为止;我们发现,希尔排序的速度是与堆排序是一个数量级的,而插入排序的速度也是比冒泡排序要快一个量级的.),所以希尔排序的速度算是非常快的,有实践意义。

2024-06-28 17:16:20 853 4

原创 链式结构二叉树练习

此题所给函数形参中没有数组,所以我们要单独开辟一段空间来放数组,用malloc函数,最后直接返回数组即可.

2024-06-26 12:02:46 500

原创 调建堆的时间复杂度的计算与topK问题

将所有数据存储到堆里面,再进行堆排序即可,但如果要求低内存我们就可以分k次,每次找10个,再将k个查找的堆中找到的共10k个数据再进行堆排序即可。剩下的数与栈顶数据相比较,如果比栈顶数据大,就覆盖并且向下调整,这样,这个k个数的小堆就是我们所要的最大的那k个数.这里我们创建了10万个数据,并且我主动将其中的几个数据加上几个0检测算法是正确的.而要求出该和式的计算,利用错位相减法,两边同乘2,再两式相减即可得。再建立k个数的小堆,并读取剩下的N-k个数.个节点,最坏需要向下调整1次.

2024-06-20 12:12:58 589 6

原创 堆的实现及其应用

对于堆中数据的删除,删除叶子结点数据意义不大,我们主要是要删除顶层节点数据,思路将顶部数据进行调整到最后的叶子结点处,在对其进行删除即可。堆在数组中存储,所以根节点的小标为孩子节点下标减一再除以二,向上调整即将孩子节点向上调整,直到满足要求的大堆(小堆)建成。如果升序建小堆,将顶层最小数据取出后,导致后面数据顺序全部混乱,所以我们建大堆。如果降序建大堆,将顶层最大数据取出后,导致后面数据顺序全部混乱,所以我们建小堆。将最大的数往堆最后位置数据交换,再将其放入新数组的最后一位即可。

2024-06-14 20:53:49 531

原创 树结构的实现

假设父亲在数组中的下标为i,则左孩子在数组中的下标是:2*i+1;树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合,它看起来像棵树,所以称其为“树”。一颗二叉树是节点的一个有限结合,该集合或为空,或为由一个节点加上两棵树(分别称为左子树和右子树)组成。当且仅当其每一个结点都与深度为K的满二叉树中编号从1至N的节点,即称为二叉树,要注意的是。一个二叉树,如果每一个层的结点数都达到大值,则这个二叉树就是满二叉树。完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。

2024-06-12 22:26:25 504

原创 队列的实现及其应用

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作,具有先进先出的效果。入数据的一段称为队尾,出数据的一段称为队头。队列的应用是:1.维持公平性(抽号)、2.广度优先遍历。

2024-06-06 17:08:56 845

原创 栈的实现 (数组实现)及其应用

首先,我们应该对题目进行分析:这题如果我们只进行数量匹配,即左括号与右括号数量相等,会发现会存在反例:))((。于是,我们可以先让左括号入栈,再将右括号出栈顶与左括号进行匹配。由于栈的先进后出性质,这题与栈有天然的契合性。栈是一种线性表(逻辑上连续),它只允许在固定的一端进行插入和删除,进行数据插入和删除的一端称为栈顶,而另一端就被称为栈底。如果我们想要取出栈中的元素,我们就要每次将栈中的top删除,然后再每次访问栈顶,从而达到访问栈的效果。栈的删除称为出栈,出数据在栈顶。栈的插入称为圧栈,入数据在栈顶。

2024-05-30 22:21:00 758 6

原创 随机链表的复制

想要实现如图所示效果,首先用malloc创建节点,然后后插入每个原节点的后面,这里要注意的是,应该先改变插入节点的next指针,防止因为覆盖导致原指针的next指针无法被找到。通过后插节点解答的优越性就体现出来了,将难以寻找的random节点通过后插copy节点实现新的copy节点的random指针在原节点的random指针的下一个位置。在这里我们为了防止覆盖要多创建一个next指针存放节点位置,并定义头节点与尾指针来进行。像这样,通过化繁为简的方法将复杂的问题分为三块较为简单的函数,就可以解决问题了。

2024-05-29 16:42:33 479

原创 链表带环问题的思考

假设slow进环后移动的距离是L,假设此时fast已经移动了x圈,则fast总共移动的距离为:L + x * C + C - N。3L == L + x * C + C - N.化简可得 2L == (X + 1)*C - N,2L一定是偶数,(x+1)*C一定是偶数,N是奇数,于是我们发现,这个等式不可能存在:因为偶数不可能等于偶数减奇数。当slow进入环时,不妨设fast与slow的距离为N,每一次slow和fast前进时,它们之间的距离每次减一,N、N-1、N-2...2、1、0.故一定会相遇。

2024-05-28 11:44:08 1119

原创 链表练习题

做题时要多画图,通过画图将题目弄清楚可以起到事半功倍的效果。

2024-05-27 17:18:21 334

原创 链式结构二叉树的应用

本文将对链式结构二叉树的几种功能进行实现与讲解在链表结构二叉树中,递归的使用是必不可少的,在使用的过程中,要时常问问自己:这个递归结构可不可以这样用?具体的逻辑实现过程是怎样的?只有这样,才能学好链表结构二叉树。!!

2024-05-21 17:57:20 1300

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除