自定义博客皮肤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)
  • 收藏
  • 关注

原创 布隆过滤器与位图(c++)

【代码】布隆过滤器与位图(c++)

2025-08-24 18:59:44 234

原创 排序(数据结构)

本文介绍了常见比较排序算法及其实现。插入排序(最好O(n),最坏O(n^2))采用边比较边移动方式;希尔排序通过分组插入优化到O(n^1.3)。选择排序始终O(n^2)性能最差。冒泡排序优化后最好O(n),但插入排序在部分有序时更优。堆排序采用建堆策略,时间复杂度O(n*logn)。快速排序基于分治思想,原始Hoare版本存在栈溢出风险,改进采用三数选中和随机选key策略,衍生出挖坑法和前后指针法,推荐使用后者。文章还分析了各算法的时间复杂度和适用场景,强调实际应用中应根据数据特点选择合适的排序方法。

2025-08-22 20:48:05 980

原创 map_set

本文深入探讨了map和set基于红黑树的封装实现。首先对比了红黑树与AVL树的优势,指出红黑树在底层数据结构中的广泛应用。文章详细展示了map和set的基本使用方法,包括插入、删除、查找等操作,并强调了它们使用的双向迭代器特性。重点分析了红黑树模板的封装过程,包括结点定义、旋转操作和平衡控制,特别讲解了迭代器的设计实现,如何通过模板参数区分普通迭代器和const迭代器。最后,文章比较了map和set在迭代器设计上的差异,指出set由于key值唯一不可变的特点,其迭代器都是const版本。通过封装红黑树,实现

2025-08-22 20:33:06 522

原创 RBT红黑树(c++)

之前我们已经学习过二叉搜索树和AVL树,我们知道AVL树的时间复杂度优于二叉搜索树,并且AVL树的实际运用情况也很广,那为啥我们还要学习红黑树呢?AVL树的旋转次数实际上是比较多的,对效率的影响是有一定的影响,而且他的条件是严格的平衡二叉树,对于大量使用查找的场景,效率还可以,但是如果设计到大量的插入场景,旋转次数是占比很大的。

2025-07-21 14:53:04 763

原创 AVL树c++

1.一颗AVL树的左右子树都是AVL树2.左右子树的高度差的绝对值不超过1一般来说,为了实现左右子树的高度差的绝对值不超过1,需要使用一个平衡因子,来控制。这里实现高度平衡的方式不唯一,有的地方会直接计算两树的高度差,不会使用平衡因子。但是平衡因子大部分情况都会使用,本问介绍的也是平衡因子的方法。啥是平衡因子?如图,他就是一个AVL树结点里的一个变量,他的值是0,1,-1。1.值为1的时候表示右子树的高度-左子树的高度=12.值为0的时候表示右子树的高度-左子树的高度=0。

2025-07-21 14:52:32 976

原创 二叉树进阶刷题03(构建二叉树与双向链表转换)

本文分析了二叉树构造与转换的两类问题:1)通过前序/后序和中序遍历序列构造二叉树。前序+中序时,用前序确定根节点,中序划分左右子树,递归构建时需注意下标关系和传参方式;后序+中序则需先构建右子树再左子树。2)将二叉搜索树转换为双向链表。采用中序遍历,在递归过程中用prev指针记录前驱节点,修改节点左右指针完成双向链接,注意处理头节点和避免循环引用。两题都强调了递归实现的关键点和易错点,如边界条件、参数传递顺序和指针操作时序等。

2025-07-02 14:46:05 1048

原创 二叉树进阶刷题02(非递归的前中后序遍历)

本文介绍了二叉树前序、中序、后序遍历的非递归实现方法。通过分析递归过程,将其分解为"递"和"归"两个阶段,使用栈来模拟递归调用栈。前序遍历在访问节点时直接输出,中序遍历在弹出栈顶元素时输出,后序遍历则需要使用prev指针记录上次访问的节点来判断访问时机。三种遍历都采用类似的双层循环结构:外层控制遍历是否完成,内层处理左子树入栈。关键区别在于节点访问时机的选择:前序在入栈时访问,中序在出栈时访问,后序需确保右子树已访问才访问当前节点。文章强调后序遍历的实现难度较大,需要

2025-06-29 22:48:56 617

原创 二叉树进阶刷题01

【代码】二叉树进阶刷题01。

2025-06-28 17:49:36 940

原创 搜索二叉数(c++)

左子树左子树小于右子树右子树大于。

2025-06-20 22:17:50 720

原创 c++多态(表面-->底层)

我们来总结下多态,这里的知识确实有点复杂。首先我们来总结下啥是多态,上文提到了静态和动态绑定。我们的多态总的说是为静态和动态的,静态的多态就是函数重载,动态的多态就是虚函数指针调用。这里我们把多态分成静态和动态,是从他的便利性和灵活性出发的。回到起点,我们说多态就是不同的人去干一件事,产生了不同的效果。虚函数表可以实现对象,那我们的函数重载也可以实现我们平常的变量调用。那多态的原理是啥呢?还是从静态和动态两个角度讲,静态就是函数重载,动态就是虚函数表。

2025-06-10 20:36:03 674

原创 c++继承

摘要:继承是面向对象编程的重要概念,它允许子类继承父类的成员并扩展新功能。文章详细讲解了继承的定义、语法及三种继承方式(public/protected/private)的影响。重点分析了子类与父类的对象转换机制(切片操作),作用域规则(成员隐藏现象),以及派生类默认成员函数(构造/拷贝/赋值/析构)的实现要点。特别讨论了菱形继承带来的数据冗余问题,通过虚继承和虚基表指针的机制解决。文章指出虽然继承机制源自现实生活,但多继承在实际编程中可能带来复杂性,建议谨慎使用。全文结合代码示例,系统性地阐述了C++继承

2025-06-02 14:37:56 621

原创 STL_stack和queue(deque priority_queue)

本文主要介绍,本人的学习心得和知识汇总,本篇博文对于STL知识的讲解侧重于难点,不会每一个都细细讲解。本文主要对适配器设计模式展开讲解,对反向迭代器和优先级队列重点讲解。STL对栈和队列的设计不同于之前c语言设计的栈和队列,不再是手搓结构,我们STL借用别人的容器实现,这就是适配器,要注意适配器是一种设计模式,是一种全新的东西,这也是我们要学习他的原因。

2025-05-30 15:20:10 1068

原创 list(c++)

本文主要介绍了STL中list容器的底层实现和使用方法。list是一个双向带头节点的链表,支持多种构造函数和迭代器操作。文章详细讲解了list的默认成员函数、迭代器设计、容量管理以及增删查改等操作。特别强调了迭代器的重要性,它是访问和操作list的核心工具。通过自定义迭代器类型,list实现了对链表元素的统一访问方式,极大简化了编程复杂度。文章还通过代码示例展示了list的基本操作,并指出学习list的关键在于理解其底层设计理念,尤其是迭代器的实现。

2025-05-22 18:04:22 943

原创 vector(c++)

本文主要介绍了C++标准模板库(STL)中的vector容器,包括其基本定义、构造函数、迭代器使用、容量管理、增删查改操作以及迭代器失效问题。vector是一种动态数组,使用连续存储空间存储元素,支持动态扩展和收缩。文章详细讲解了vector的多种构造函数、迭代器的使用方式、容量管理函数(如resize和reserve)以及增删查改操作(如push_back、pop_back、insert和erase)。特别强调了迭代器失效问题,指出在insert和erase操作后,迭代器可能会失效,使用失效的迭代器会导致

2025-05-17 17:16:40 1042

原创 string(c++)

string 并不是STL库里的一个容器,而是游离于STL的一个容器,这是历史原因导致的。因为他的研发比STL早,但是后面大佬们研发出了STL。string为了兼容STL就做了一些调整,一贯的作风就是向上兼容。因此,他相比STL其他的容器会有点冗余。提问:string就是字符串吗?他和字符串一摸一样吗?答案是:不是,大部分情况一摸一样。string和字符串是有区别的,输出字符串是以\0为结束标志,但是string是一个容器,他以size为结束标志。

2025-05-15 23:24:13 922

原创 二叉树的初步学习

二叉树的学习会用到大量的递归,这里也是练习递归的一个很好的章节。也许你可能会感到使用递归有点困难。这是因为你还没有理会到递归的精髓。这里实际上使用递归解决这些遍历是很简单的,如果使用非递归解决二叉树的问题,那才是真正的上难度了。

2025-04-13 19:58:22 828 1

原创 今日写题8(work)

哨兵位。

2025-03-10 09:19:33 836

原创 今日做题7(work)

再在Pop函数里复用peek会大大简化你的代码。

2025-03-10 00:23:01 730

原创 类和对象进一步了解c++

上面三个成员都有一个特点就是再创建的时候必须被初始化,这是c++规定的。对于引用和const我们清楚,const修饰的变量具有常性,必须再定义的时候初始化,引用也必须初始化,他不可以给空指针。但是自定义类型呢?对于自定义类型是看情况的,如果你的自定义类型没有默认构造函数,那我们就无法自动调用构造函数。那怎么办呢?根据定义又必须要初始化。所以,初始化列表接很好的解决了问题。初始化列表就是专门用来初始化成员变量的地方。这里注意,初始化列表位置在构造函数上紧紧相连,他是构造函数的一部分,这是语法上的结构绑定。

2025-03-02 22:17:37 1131 1

原创 内存管理c/c++

new和delete是c++两个关键字,负责开辟动态空间和销毁空间,和malloc和free很像。于是,把他们封装成了函数,分别由new和delete调用,也就是说,new和delete的底层原理还是调用malloc和free。new和malloc的区别也是在这里,new会先开辟空间,再调用构造函数,而malloc只是单纯的开辟空间。对于服务器上的程序,长期运行的。比如王者服务器上的程序,你可想象一下,你无论在什么时候打开游戏都是可以正常运行的。如果,王者的服务器上的程序出现了一个内存泄漏的代码。

2025-03-02 22:15:51 679

原创 c++类和对象初步了解

这里的默认析构函数就是编译器生成析构函数编译器生成的析构函数,也是不会对内置类型做处理的,只会让自定义类型去调用他的析构函数。

2025-02-19 22:32:26 990

原创 c++入门

c++的出现主要最初是为了解决c语言的不足,但随着之后逐渐的发展,成为了一门成熟的语言。因为,c++最初是为了解决c语言的不足。所以,在c++入门学习主要了解c++解决那些c语言的不足。

2025-02-19 22:06:07 624

原创 今日写题06work(链表)

这几道题都是关于链表的,大多题目的思路都和双指针有关。所以,可见双指针在解决链表的一些题目上有很大作用。这可以当成一个题解的基本思路。从双指针出发,根据题目特点进行变型,解决题目。解决这类题目,画图也是一个很好的方法。当你在写代码前,先画图把思路弄清楚,会大大提高你代码的正确率。即使代码错了,也可以通过图来走读你的代码。如果都不行,我们再调试代码。这能提高你解决题目的效率,不然你很有可能是调试了两三个小时都发现不了问题。

2025-02-16 15:11:31 1054

原创 今日写题work05

这里复杂的主要是结构,在具体的函数实现上,如果你思路清晰,其实是比较简单的。比较复杂的就是,出栈这个函数,需要多想一下。

2025-02-15 23:54:37 967

原创 今日写题04work

使用双指针,prev,cur快慢指针解决。当cur不等于val,两个指针跳过。当等于val时,要考虑两种情况,一种是pos删,一种是头删除。pos删除就是正常情况,但头删是一种特殊情况,比如第一个数据就是等于val。所以,我们在这里分类处理。

2025-02-15 21:20:44 350

原创 队列Queue(c语言实现)

队列的实现和链表的实现很相似,但是不同之处是,他在继承了链表的优点之后又克服了链表的很多缺点,不如在求长度时就很方便,不用再一个一个遍历。

2025-02-15 16:24:23 856

原创 顺序表SeqList(c语言)(动态顺序表)

这里代码的思路比较复杂的就是头插和头删除,其他的思路比较简单。初次写可能会有点困难,但多写几次,就会发现其实很简单。

2025-02-14 21:44:54 999

原创 今日写题work04

使用双指针,这里我的代码暂用dst和src来命名这两个指针,如果src等于dst,那就src++,如果不等于dst,那就++dst,再把src赋值给dst,当src走完,dst+1就是数组的长度。小结:这道题的思路可以说和这道题(27. 移除元素 - 力扣(LeetCode))的思路一模一样了,这道题在我的博客今日写题work02(今日写题work02-CSDN博客)也有介绍,有需要的可以看看,这两道题都是运用了双指针的思路,题型难度都是比较简单的。

2025-02-12 15:57:31 282

原创 今日写题work03

采用栈思想,后进先出。左括号依次压栈,与右括号出栈依次匹配。这里的栈是用c语言手写了一个,如果用c++的话,就更简单了,可以直接调用。当然,其他语言说不定更简单。因为栈的逻辑是后进先出,所以最后一个进去的字符能做到先出来。因此,我们就可以取栈顶字符,与右边的括号进行匹配,如果有一个不成功,return false。但是,需要考虑到两种特殊情况,只有左括号和只有右括号。左括号虽然依次压栈,但是并没有返回false,而是返回true。

2025-02-11 17:43:31 404

原创 今日写题work02

【代码】今日写题work02。

2025-02-10 18:16:35 316

原创 今日写题work01

【代码】今日写题work。

2025-02-08 21:15:36 259

原创 文件(c语言文件流)

什么是文件,文件就是存储在磁盘(硬盘)的文件。文件功能的角度来分类程序文件包括源程序文件(后缀为.c),目标文件(windows下后缀为.obj),可执行程序(windows下为.exe)。而数据文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。本文主要介绍数据文件根据数据的组织形式,数据文件被分为文本文件和二进制文件。

2025-01-30 19:56:23 1137

原创 c语言:编译和链接(详解)

这里只是简单的介绍了编译器的编译和链接过程,具体的细节并没有提及,当然对于一般的学习者也不用了解的这么深,只用把大致了解就可以了。对于这部分学习是高度抽象的,因为很多部分就是底层机器的运行逻辑,很枯燥,甚至编译这部分单令出来就可以当成一门大学学科了,所以想要把这部分一下子全搞懂,不太现实,只能是干中学,一边写代码一边深入了解。

2025-01-30 15:29:55 1052

原创 C语言自定义类型:结构体

结构体变量的创建可以在定义的时候就创建正常创建。

2025-01-19 17:10:19 685

原创 整数和浮点数的存储

但是,由于科学及算法可以出现负数,这与E的定义有矛盾,所以IEEE754就规定,存入内存时E的真实值必须加上一个中间数,对于8位E,中间数为127,对于11位E,中间数为023。比如:0.5的二进制形式为0.1,由于规定整数部分必须为1,所以小数点要向右移一位,即为1.0^2(-1),其内存中的E为-1+127(中间值),表示为01111110,而M去掉正数部分为0,补齐0到23位。原码和反码和补码一样,因为不用考虑符号,存储的都是有效数据,一律都是加法,所以,不用像有符号整型那样,有取反和加一的规则。

2025-01-13 21:10:35 745

原创 PTA 7-6 求一批整数中出现最多的个位数字

【代码】PTA 7-6 求一批整数中出现最多的个位数字。

2024-11-13 08:57:48 1806 2

原创 C 语言 数组交换最小值和最大值

本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。注意:题目保证最大和最小值都是唯一的。

2024-11-11 18:58:21 2537

原创 c语言指针详解

既然它是一个变量,那么它的命名就是类型加上变量名。

2024-11-05 11:40:47 1837

原创 查找月份天数 c语言实现

查找月份天数是c语言中基本循环语句使用中的一道非常基础的题目,但难点也许不是你不会代码,而是不知道,闰年和平年怎么区分,每月天数的规律等等,

2024-11-02 16:25:40 295

原创 单身狗2 c语言实现

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。编写一个函数找出这两个只出现一次的数字。例如:有数组的元素是:1,2,3,4,5,1,2,3,4,6。

2024-11-02 15:59:18 286

空空如也

空空如也

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

TA关注的人

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