自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高阶数据结构图下篇

Kruksal算法是对边进行操作,先取出边,然后判断边的两个节点,这样的话,如果一个图结构非常的稠密,那么Kruksal算法就比较慢了,而Prim算法只是对节点进行遍历,并使用visited进行标记,因此会相对于Kruksal算法,在稠密图方面好很多,因此Kruksal算法常用于稀疏图,而Prim算法常用于稠密图!Prim算法是另一种贪心算法,和Kuskral算法的贪心策略不同,Kuskral算法主要对边进行操作,而Prim算法则是对节点进行操作,每次遍历添加一个点,这时候我们就不需要使用并查集了。

2023-10-29 18:02:04 429

原创 高阶数据结构图上篇

邻接矩阵和领接表其实属于相辅相成的,各有优缺点的互补结构。

2023-08-29 19:20:13 312

原创 【linux进程概念】

这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。fork函数的作用是创建子进程,fork()之后,会有父进程+子进程两个进程在执行后续的代码,fork后续的代码,被父子进程共享,通过返回值的不同,让父子进程执行后续共享代码的一部分!任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),简单来说就是一个进行软硬件资源管理的软件,笼统的理解,操作系统包括。

2023-08-27 12:03:52 314 1

原创 高阶数据结构并查集

将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中反复遇到查询某一个元素属于那个集合的运算,这种抽象的数据类型称为并查集。

2023-08-23 22:30:50 520

原创 【linux目录的权限和粘滞位】

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-08-05 17:18:56 282

原创 C++手撕红黑树

/大写 RBTreeNode < K , V > * _left;RBTreeNode(const pair < K , V > & KV) : _KV(KV) , _let(nullptr) , _right(nullptr) , _parent(nullptr) , _col(RED) //给一个默认红色 {} //构造函数初始值列表 };红黑树是一种重要的二叉树,应用广泛,但在很多数据结构相关的书本中出现的次数并不多。

2023-06-24 17:37:52 1178 2

原创 C++AVL树

int _bf;//balance factor //成员初值列 AVLTreeNode(const pair < k , v > & kv) : _kv(kv) , _left(nullptr) , _right(nullptr) , _parent(nullptr) , _bf(0) //上面的平衡因子受到下面影响,所以初始化为0 {} };假如以parent为根的子树不平衡,即parent的平衡因子为2或者-2,分以下情况考虑。

2023-06-14 21:29:25 518

原创 GDB的学习

gdb的全称是GNU debugger,看名字就知道 gdb 是用来对程序进行 debug 的,不管是学习还是工作中,用好gdb,能让你的程序更加丝滑!

2023-06-10 23:33:43 588 2

原创 C++map和set

在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那关联式容器又是什么呢?其实关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。

2023-05-29 19:55:28 1222 1

原创 【C++修炼之路:二叉搜索树】

问题:如果退化成单支树,二叉搜索树的性能就失去了。那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。套一层:由于根是私有的调不动需要写一个子函数,让子函数去递归,因此我们需要套一层,也可以自己写一个getroot。1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。

2023-05-07 13:02:06 444 2

原创 【EffectiveC++】构造/析构/赋值运算-下篇

这是编译器对“你自己写出的copying函数”的复仇行为:既然你拒绝它们为你写出copying函数,如果你的代码不完全,它们也不告诉你。这些并不明显的自我赋值,是“别名”(aliasing)带来的结果:所谓"别名”就是“有一个以上的方法指称某对象”。设计良好之面向对象系统会将对象的内部封装起来,只留两个函数负责对象拷贝,那便是带着适切名称的copy构造函数和copy assigment操作符,我称他们为copying函数,并说明这些“编译器生成版”的行为:将被拷贝对象的所有成员变量做一份拷贝。

2023-05-02 19:53:42 775 1

原创 【C++继承】

下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类,子类后面加冒号用于说明我们的继承方式和继承的父类,这里的继承方式是public,这样一个简单的继承的定义我们就写好了public:int _stuid;

2023-03-22 00:47:02 308 6

原创 基数排序算法

基数排序:基数排序(Radix sort)是一种非比较型整数排序算法, 基本思想主要是通过关键字间的比较和移动记录这两种操作,而实现基数排序不需要进行关键字间的比较,基数排序是一种借助于关键字的思想对单逻辑关键字进行排序的方法。基数排序与计数排序、桶排序这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:基数排序:根据键值的每位数字来分配桶;计数排序:每个桶只存储单一键值;桶排序:每个桶存储一定范围的数值;

2023-03-10 19:29:33 759 3

原创 stack_queue

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。

2023-03-07 01:00:54 316 3

原创 【EffectiveC++】构造/析构/赋值运算-上篇

几乎每一个写class都会有一个或多个构造函数、一个析构函数、一个copy assignment操作符。这些很难让你特别兴奋,比较他们是你的基本某生工具,控制这基础操作,像是产出新对象并确保他被初始化、摆脱旧对象并确保他被适当清理、以及赋予新对象值。如果这些函数犯错,会导致深远且令人不愉快的后果,遍及你整个classes。所以确保他们的行为正确是生死攸关的大事。孔子云:“取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣”。对于读书而言,这句古训教训我们去读好书,最好是好书中的上品-经典书。

2023-02-25 23:48:17 438 2

原创 C++【修理之路】初识string

变量 s1 只是定义但没有初始化,编译器会将默认值赋给 s1,默认值是"",也即空字符串。变量 s2 在定义的同时被初始化为"c plus plus"。与C风格的字符串不同,string 的结尾没有结束标志’\0’。变量 s3 在定义的时候直接用 s2 进行初始化,因此 s3 的内容也是"c plus plus"。变量 s4 被初始化为由 5 个’s’字符组成的字符串,也就是"sssss"。从上面的代码可以看出,string 变量可以直接通过赋值操作符=进行赋值。

2022-12-21 21:52:57 411 7

原创 如何在liunx下实现一个简单的程序?

c表示只编译(compile)源文件但不链接,会把.c或.cc的c源程序编译成目标文件,一般是.o文件。gcc -c a.c -o a.o表示把源文件a.c编译成指定文件名a.o的中间目标文件(其实在这里,把-o a.o省掉,效果是一样的,因为中间文件默认与源文件同名,只是后缀变化)。2、如果是多个文件,则需要先编译成中间目标文件(一般是.o文件),在链接成可执行文件,一般习惯目标文件都是以.o后缀,也没有硬性规定可执行文件不能用.o文件。gcc -c test.c将生成test.o的目标文件。

2022-11-19 23:56:58 322 3

原创 【EffectiveC++】让自己习惯C++

不论你的编程背景是什么,C++都可能让你有点儿熟悉。它是一个威力强大的语言,再夸张一点它好比原子弹,带着众多特性,但是在你可以驾驭其威力并有效运用其特性之前,你必须先习惯C++的办事方法。

2022-11-01 00:05:24 621 7

原创 C++[修炼之路】日期类

对于日期类来说,三个成员员变量包括:年(_year)、月(_month)、日(_day)。对于日期类的实现,通常执行的操作是:日期加天数、日期减天数,日期减日期来确定二者之间相差多少时间,但没有日期加日期,因为这个毫无意义。运算过程中的日期实际上就是日期类创建的对象。我们知道,每个月的天数都不一定相同,而且还有闰年这个影响因素,因此我们在进行运算的时候需要考虑这些,并且将其封装成一个通过年和月就能确定这个年、月所对应的天数,所以我们可以构造下面的这个函数GetMonthDay。

2022-10-31 18:33:28 370 4

原创 【C++修理之路】内存管理

自由存储区:C++层面上的术语,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。编译器要知道它调用了多少次析构函数,因此new申请空间的时候会多开4个字节的空间来知道它要调用多少次,这个空间存放它的调用个数delete释放p3的时候,编译器会-4字节,把这个10取出来就知道调用个数了delete释放的是一个对象不是多个对象,释放的位置从存放个数空间的位置开始释放,因此就会报错。

2022-10-29 19:01:03 1375 5

原创 c++如何用迭代器输出大小写字母?

elem:elem是单词element(元素)的缩写,在程序定义中代表某一不确定的类型,也就是抽象的数据类型,为了使程序可读性强,并且便于修改,让elem代表多种的数据类型,也就是为int、char等等的数据类型,起了一个别名,在头文件中定义:typedef char elem;//抽象元素类型为char类型,这样定义之后,下面的程序中elem所定义的元素就是char类型的了 ,如果需要修改其类型,直接修改char到其他类型,elem便又代表了所修改的类型数据,这也是方便性的体现。

2022-10-09 23:41:01 2614 15

原创 Linux下怎么修改普通用户的权限?

Linux是非常重要得,技术之间都是融会贯通的,你学了Linux,再去学习其他的技术的时候就会触类旁通,更加容易学,就像你去学C语言一样,你把C语言学好了,再去学习其他的编程语言的时候就不会那么有压力了,所以我还是建议大家一定要学好Linux。1.Linux的历史距今已经几十年了,它在如今的社会上已经发挥了很大的作用,很多互联网公司可以说百分之九十九都存在Linux的影子,学习Linux不仅能帮助你的工作,也能拓展你在技术上面的认知。今天的分享到这了,支持小佳将会更新更多干货,记得一件三连哟!

2022-09-30 01:31:27 11545 10

原创 数据结构测试牛客网两道编程题

据说著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与 Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。具体方法为:判断父节点的左不为空,且父的左的左为空,且父的左的右为空。广度优先:层序遍历,使用迭代方法,使用队列。

2022-09-25 23:35:00 208 2

原创 C++引用的概念

ra又是a的别名,x又是a的别名,y又是x的别名,所以它们存的值是相等的,3次加加后就变成了13,地址也是指向同一块内存空间的。做返回值不是把这个n做返回值,中间会产生一个临时变量,返回的是临时变量,这个临时变量就是n的别名,如果是函数调用的话n生成的临时变量就会被销毁,如果去访问就会出现野指针的问题,就不能用引用返回,出了作用域,返回变量存在才能引用返回。m是cc的别名,dd的别名又是n,所以m和n的交换就是cc和dd的交换,这就是利用了一个引用的传参,就不用传地址那么麻烦了!

2022-09-17 01:35:38 763 6

转载 初始C++

只有定义在函数里面的是局部变量,命名空间定义的是一个全局变量,因为它没有像函数一样建立栈帧,不影响生命周期,只是限定域编译查找规则是先去局部查找,局部没有去全局找,命名空间就是指定域找,这个域里的rand就是全局变量,才能打印我们想要的数据。在这里我们定义了一个全局变量a和一个局部变量a,在c语言中根据局部优先的原则打印a的值是1,但是想打印全局变量的值就得加个域限定符::来指定第二个a是全局变量,左边空白处代表的是全局域,这是C++的一个设定。3.指定展开,常用的展开,自己定义的时候避免跟常用的重名。

2022-09-16 15:14:02 197 5

原创 数组的排序算法代码详解

插入法、冒泡法、交换法排序的速度较慢,但是参加排序的序列局部或整体有序时,这三种排序能达到较快的速度;在这种情况下,折半法排序反而显得速度满了,因为折半法排序是对于元素的个数(n)较大时,是速度最快的排序算法;但当(n)很小时,此方法比其他排序还要慢,当要排序的元素数量(n)较小时,对稳定性也不做要求,我们用选择法排序,对稳定性有要求我们用插入法或冒泡法比较好!

2022-09-13 16:25:07 430 3

原创 二叉树的遍历

先计算左子树 ,节点1走到节点2,节点2走到节点3,节点3走到节点7和节点8,各返回1,,节点3拿到结果左右各返回一个1,一共返回2,节点3回退到节点2再回退到节点1,告诉节点1我的左子树有2个叶子节点,注意:return 1不是直接返回给最外面而是返回给上一层(也就是它调用的地方)然后计算右子树,节点1走到节点4,节点4走到节点5返回1,走到节点6又返回1,一共返回2,节点4再回退给节点1,告诉节点1我的右子树有2个叶子节点。二叉树节点总的个数=左子树节点的个数+右子树节点的个数+自己:左子树。

2022-09-10 02:09:32 675 5

原创 srand(time(0))函数的用法介绍

我们知道在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是。

2022-09-06 16:18:00 9825 6

原创 简单实现一个栈

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶,另一端称为栈低。栈中的数据元素遵守后进先出LIFO的原则。栈的插入操作称为压栈或进栈,栈的删除操作称为退栈或出栈。栈的主要特点是“后进先出(last in first out,LIFO)”。...

2022-08-27 16:52:21 289 3

转载 简单实现一个双链表

代码】简单实现一个双链表。

2022-08-18 23:50:41 179 6

转载 写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

由上图一中红色的二进制位数字为我们的偶数位可知,按位与上二进制数字0101 0101 0101 0101 0101 0101 0101 0101就可以拿出我们所有的偶数位.由上图一中绿色的二进制位数字为我们的奇数位可知,按位与上二进制数字10101010 101010101010101010101010就可以拿出我们所有的奇数位.交换一个数字的奇数位与偶数位,其交换规律是二进制序列中的第0位与第1位交换,第2位与第3位交换,第4位与第5位交换,以此类推!1.奇数位上的数字按位与1则不会发生变化,...

2022-08-09 22:54:26 393 9

转载 实现一个atoi函数的三种写法

经过查询我们知道这个库函数是将一堆字符转换成整数,函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等.如果ptr不能转换成int或者ptr为空字符串那么将返回 0,特别注意,该函数要求被转换的字符串是按十进制数理解的!,所以我们要开路ascll值!这就是今天的字符串转换成整数的函数atoi,你们学到了,记得三连支持哟!我们不了解的一些函数都可以打开C/C++的库函数查询手册的网站查询,如。.........

2022-08-06 22:08:20 566 4

转载 用C程序实现一个单链表

代码】用C程序实现一个单链表。

2022-08-05 22:52:12 245 4

原创 变量的存储类别

在c程序中可以选择变量的存储形式,通过存储形式告诉编译器要处理什么样的数据类型。存储形式主要分为静态存储和动态存储静态存储就是程序运行分配的固定的存储方式;动态的就是程序运行期间需要动态的分配空间,主要有自动(auto)、静态(static)、寄存器(register)、外部(extern)4种。下面详细介绍extern和static.......

2022-08-02 01:28:25 329 6

原创 牛客网面试的某两道编程题详解

因此,Fibonacci数列就形如0,1,1,2,3,5,8,13,...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。题解二这个菲波那切数字到x和y的步数必须是正数,假设n...

2022-07-23 00:20:27 450 2

原创 实现一个通讯录

假设这个通讯录的菜单这有7大功能(1.增加联系人2.删除指定联系人3.查找联系人4.修改联系人5.显示联系人6.排序联系人0.退出程序),我们今天只实现其中的4个功能(1.增加联系人、2.删除指定联系人、5.显示联系人、0.退出程序)..........

2022-07-18 02:01:24 163 1

原创 一个完整的C程序

/定义浮点型变量,表示父亲的身高//定义浮点型变量表示入母亲的身高floatson;//定义浮点型变量,表示儿子的身高这三句话的作用是定义变量.要使用变量。必须是使用变量之前进行定义,定义变量就是告诉编译器这个变量的数据类型,之后编译器会根据变量的类型分配内存空间。变量的作用就是存储数值,用变量进行计算.说明定义变量时,变量名尽量取与实际意义相关的名称.............

2022-07-16 23:53:04 1105 2

原创 左旋字符串问题

你知道左旋字符串多种实现方法或写法吗?一个字符串是另一个字符串左旋的字串吗?

2022-07-12 19:40:17 187 8

原创 strstr函数和strtok函数的使用

strstr:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。strtok:分解字符串为一组字符串。s为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL。在头文件#include中。...

2022-07-07 14:47:25 596 5

原创 冒泡排序进阶

什么是冒泡排序?冒泡排序就是一种计算机科学领域的较简单的排序算法,它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。我们用bubble_sort函数来实现冒泡排序代码如下: 运行结果:我们不光要会写代码,更要理解每断代码的意思 ,以上代码是我的理解,个人能力有限,不足之处请海涵有时候写代码总是写一大推,有些自己都不好理解,有时候就在想能不能简单化一

2022-06-22 21:43:13 325 1

空空如也

空空如也

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

TA关注的人

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