自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构——图

在离散数学中,图(Graph)是用于表示物体与物体之间存在某种关系的结构。数学抽象后的“物体”称作节点或顶点(英語:Vertex,node或point),节点间的相关关系则称作边。在描绘一张图的时候,通常用一组点或小圆圈表示节点,其间的边则使用直线或曲线。

2024-06-27 10:38:29 900

原创 数据结构——并查集

在计算机科学中,并查集(英文:Disjoint-set data structure,直译为不数据结构交集)是一种数据结构,用于处理一些​​​​​​​不交集(Disjoint sets,一系列没有重复元素的集合)的合并及查询问题。

2024-06-26 22:39:02 502

原创 算法——BFS算法

BFS(广度优先搜索,Breadth-First Search)算法是一种用于图和树等数据结构中进行搜索的基本算法。它从指定的起始节点开始,逐层地向外扩展搜索,直到找到目标节点或遍历完整个图。BFS算法的基本思想是:先访问起始节点,然后依次访问起始节点的邻居节点,再依次访问邻居节点的邻居节点,以此类推,直到搜索到目标节点或者遍历完整个图。BFS算法使用队列来辅助实现节点的遍历顺序,保证每一层的节点按顺序访问。

2024-04-22 09:27:45 525 1

原创 算法——动态规划

动态规划(Dynamic Programming)是一种解决多阶段决策问题的优化方法。它通常用于解决具有重叠子问题和最优子结构性质的问题,能够将一个大问题分解为多个重叠的子问题,并通过存储子问题的解来避免重复计算,从而提高算法效率。

2024-03-05 15:18:59 1102

原创 Linux基础——进程控制

在这之前我们曾了解过进程创建(详见),我们在这里对fork函数做一些补充其实对于父子进程来说,若是有一方试图修改数据时,会向物理内存中申请一份新空间,并将数据拷贝到其中,拷贝完成后将自己对应页表中的只读属性去掉。

2024-03-05 09:21:43 996

原创 算法——分治

分治算法是一种将一个大问题分解成若干个相似而独立的子问题来求解的算法设计策略。通过递归地将问题分解为更小的子问题,然后将子问题的解合并起来,最终得到原始问题的解。

2024-03-04 14:51:08 918

原创 算法——双指针

双指针算法是一种常用于解决数组或链表中的问题的技巧。它涉及使用两个指针(索引或引用),通常分别称为“快指针”和“慢指针”或“左指针”和“右指针”,以协同进行遍历或搜索。该算法的核心思想是通过移动这两个指针来实现特定的目标,例如寻找一对元素的和、判断是否存在某种关系或在特定条件下移动其中一个指针。双指针算法通常能够在O(n)的时间复杂度内解决问题,具有较好的效率。

2024-02-27 15:08:53 1012

原创 算法——滑动窗口

滑动窗口算法是一种解决数组或列表中子数组或子序列问题的有效方法。该算法通过定义一个窗口,然后在数据结构上滑动该窗口,逐步处理数据,以解决特定类型的问题。其基本思想是维护一个窗口,初始时窗口覆盖数组中的一部分元素,然后通过滑动窗口来依次处理每个子数组。在每次窗口滑动时,可以通过添加新元素和删除旧元素来更新窗口的内容,以在O(1)时间内完成操作。

2024-02-26 09:38:36 1368

原创 算法——模拟

官方一点来说模拟算法(Simulation Algorithm)是一种通过模拟现实或抽象系统的运行过程来研究、分析或解决问题的方法。它通常涉及创建一个模型,模拟系统中的各种事件和过程,以便观察系统的行为,收集数据并得出结论。这类算法适用于复杂的系统,其中涉及许多相互作用的元素和随时间变化的状态。通俗来说我们只需要对照题目,提取出对应的流程,将这个流程转换成代码。需要注意的是, 我们要在草稿纸上过一遍流程,不然很容易出问题。

2024-02-22 23:15:57 613

原创 算法——位运算

位运算符是在二进制位级别上对数据进行操作的运算符。

2024-02-19 22:05:39 993

原创 算法——前缀和算法

前缀和算法(Prefix Sum)是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和,将这些部分和存储在一个新的数组中,从而在需要计算某个区间的和时,可以通过简单的减法操作得到结果,而不必重新遍历整个区间。

2024-02-07 22:32:36 1054

原创 算法——二分查找算法

简单来说,"二分"指的是将查找的区间一分为二,通过比较目标值与中间元素的大小关系,确定目标值可能在哪一半区间内,从而缩小查找范围。这个过程不断重复,每次都将当前区间二分,直到找到目标值或确定目标值不存在为止。这种分而治之的策略使得二分查找算法具有较高的效率,时间复杂度为O(log n)。大致图解如下即通过二段性,在每次判断过后可以一次性减少将近一半的数据,然后通过不断的挪移左右区间来筛选出最后的结果。

2024-02-05 21:48:35 1333

原创 算法——递归与搜索算法

官方一点来说递归指的是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。通俗一点来说,递归就是一个函数自己调用自己的过程。

2024-02-04 20:30:40 1176

原创 Linux基础——进程地址空间

之前我们在学习语言时,曾知道有下面这张图对于这个图我们可以用下面的代码验证运行后我们可以发现其对应关系如下我们使用fork函数,来分别对父子进程中的g_val进行修改,即运行后我们可以发现在子进程修改了g_val后,父子指向同一地址时,但是读取到了不同的内容,我们可以知道如果变量的地址是物理地址,那么上面的情况不可能发生,因此这里的地址绝对不是物理地址,我们将其称为线性地址(或虚拟地址)。

2024-01-06 17:24:04 372

原创 Linux基础——进程初识(三)

首先我们要知道,进程优先级是操作系统用来确定多个进程同时运行时,哪个进程会获得更多CPU时间片的相对重要性或优先级的评估。他和权限的区别在于权限决定了能不能访问资源,而优先级是在能访问资源的前提下,决定了资源访问谁先访问,谁后访问。那么我们为什么需要优先级呢?在去食堂的时候,如果能给我们每一个人配备一个厨师,那么我们就不需要进行排队了,问题是没有那么多的厨师分配给我们,而进程也是同理,因为资源是有限的,而进程有多个,那么注定了进程之间的关系为竞争关系——这就是进程的竞争性。

2024-01-04 16:27:29 876

原创 Linux基础——进程初识(二)

我们知道在创建一个文件时,它会被默认创建到当前目录下,那么它是如何知道当前目录的呢?对于下面这样一段代码在它被加载成为一个进程时,我们查看相应的PID有在Linux中所有进程是被存放在一个/proc目录中的,即我们找到对应的PID就能进入并查看该进程,进入后发现可以看到,在进程中有一个cwd文件,即current work dir(当前工作目录),在代码中使用fopen向磁盘中写入文件tmp.txt时,会自动的将cwd中的路径拼接到它的前面。

2024-01-02 17:38:14 1671

原创 Linux基础——进程初识(一)

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)(operating system)内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等等)简单来说,操作系统是一个对软硬件资源进行管理的软件。

2023-12-08 19:57:25 998

原创 Linux基础——基础工具

1. 在Linux下安装软件一个通常的办法是下载程序的源代码并进行编译得到可执行程序2. 但是这样太麻烦了于是有些人把一些常用的软件提前编译好做成软件包可以理解成windows上的安装程序)放在一个服务器上通过包管理器可以很方便的获取到这个编译好的软件包直接进行安装3. 软件包和软件包管理器就好比"App"和应用商店这样的关系是Linux下非常常用的一种包管理器主要应用在Fedora, RedHat, Centos等发行版上。

2023-11-02 15:11:25 160

原创 Linux小程序——进度条

首先我们需要知道,回车与换行是两个概念,在C语言中使用"\n"时,默认使用的是回车+换行,举一个简单的例子,在以前写作文时,我们在某一行写到最后一个字时,我们会将字写在下一行,此时这个换行的动作就叫换行,但是如果只换行的话此时的笔尖应该落在下一行的最后一个格子上,此时我们再将笔尖移动到这一行的开始,这个动作就叫做回车。也就是说如果我们只使用回车("\r")的话,会将光标移动到本行的一开始,只使用换行的话,会将光标移动到下一行的相同位置。

2023-10-26 20:53:28 103

原创 C++基础语法——智能指针

内存泄漏是什么?内存泄漏:指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。那么内存泄漏会有什么样的危害?长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。这里一般有两种情况,如// 1.内存申请了忘记释放// 2.异常安全问题div();

2023-10-25 18:49:53 105

原创 C++基础语法——C++11

在C++98标准中,允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。即而在C++11中,大括号括起的列表(初始化列表)的使用范围被扩大了,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。如注:建议在日常定义中,不要去掉=,虽然不要求会用但是要能看懂。

2023-10-24 19:19:45 101

原创 数据结构——哈希

在顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程中元素的比较次数。那么我们理想的搜索方法是:可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。当向该结构中:1. 插入元素。

2023-10-19 15:28:09 256

原创 C++基础语法——unordered_map和unordered_set

源文档如下大致翻译如下1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2023-10-06 16:15:42 226

原创 C++库函数——set与map的模拟实现

对于上面这棵红黑树,我们可以很容易得知道begin()是红黑树的最左节点,end()应该是一个空节点。即接下来定义iterator及其具体操作。

2023-10-06 15:11:25 109

原创 数据结构——红黑树

/ 在这里为了方便表示我们先将颜色枚举// 在红黑树中只有黑与红,即BLACK与REDenum ColorBLACK,RED// 因为节点是公用的,因此设定为struct:_kv(kv)// 根据红黑树的性质可以知道// 要插入的新节点不应该是黑色的,而应该是红色的// 如果是黑色的那么就会影响它当前路径的黑色节点总数{}

2023-09-18 18:37:42 477 3

原创 C++库函数——map与set

我们先来看源文档翻译如下set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2023-09-17 23:14:42 166

原创 数据结构——AVL树

/平衡因子因为在使用过程中可能会频繁使用到父节点,因此我们将其设计为三叉链,且在这里我们设计一个平衡因子(注:在AVL树中可能没有平衡因子,在这里引入平衡因子只是为了方便我们理解),规定一个初始节点的平衡因子为0,当它的左子树中出现新节点时平衡因子就--,右子树中出现新节点时平衡因子就++,当平衡因子==2或者==-2时,此时我们就认为当前节点往下的树已经失衡,需要对其作出调整(各式各样的旋转)

2023-09-15 15:03:59 238

原创 C++基础语法——多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person,Person对象买票全价,Student对象买票半价。代码实现如下public:cout

2023-09-02 22:35:56 258

原创 C++基础语法——继承

在这里我们先举一个例子public:protected:// 姓名// 年龄protected:int _stuid;// 学号protected:int _jobid;// 工号同一个人它有可能同时具有多重身份,在上述例子中他可能就同时具有老师和学生两个身份,这两个身份有一些相同点(如它们都是人,所具有的年龄和姓名不会变化),也有一些不同点(如作为老师时有工号,学生时有学号)。了解这个例子之后我们大概就了解到了继承是什么,那么我们如何来书写它呢?

2023-08-17 23:50:48 653 5

原创 C++库函数——String类的模拟实现

为了与库函数里面的string分开,我们将模拟实现的string类存放在自己定义的命名空间中,同时尽可能的将对应功能函数的名字与库函数一一对应,即。

2023-08-02 17:40:35 177

原创 数据结构——树

的。随便举例一棵树,如注:树形结构中,子树之间不能有交集,否则就不是树形结构Ⅱ. 树中的相关概念我们以下面这个树为例。

2023-06-01 23:42:25 429 4

原创 C++库函数——string类

源文档译:1.字符串是表示字符序列的类2.标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。3. string类是使用char(即作为它的字符类型,使用它的默认和分配器类型关于模板的更多信息,请参阅basic_string)。4. string类是模板类的一个实例,它使用char来实例化模板类,并用char_traits和allocator作为的默认参数根于更多的模板信息请参考。5.

2023-06-01 18:38:20 6801

原创 算法——各排序算法效率对比和总结

对于排序我们有如下的导图且一谈到排序,我们都有下图。

2023-05-21 14:17:23 981

原创 C++基础语法——模板

目录1. 泛型编程2. 函数模板①概念②使用③原理 ④实例化 ⑴隐式实例化⑵显式实例化3. 类模板①格式②实例化在平常的编写中,对于一个实现固定作用的函数,如交换两变量的值的Swap函数,对于不同类型只能编写相对应的重载函数,即 对于这样的函数重载,有一些不利之处那我们能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?答案是肯定的,而这又与泛型编程有关而在这之中模板是泛型编程的基础。模板也分为函数模板与类模板 函数模板由一个或多个类型参数组成,其中类型参数使用特殊的语法来声明为

2023-05-20 23:08:59 711

原创 算法——归并排序和计数排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。图示如下。

2023-05-20 13:46:20 608

原创 Linux基础——权限

在操作系统中,权限是指用户或进程能够执行的特定操作的范围。权限决定了一件事情能否被做。而在权限进行判断时首先认证的是身份,而Linux中身份又分为拥有者,所属组和其他人,这些身份与用户(root用户和普通用户)互相交叉,即root用户与普通用户都可能是这三个身份中的一个。在之后,查看文件的属性,在使用ll指令后,我们可以看到可以发现,最前方由10个字符组成,在这之中的第一列,即表示的是文件的类型(因此在Linux中文件名后缀无直接意义),具体如下d:文件夹:普通文件l:软链接(类似。

2023-05-19 21:44:28 1869

原创 C++基础语法——内存管理

而在处理自定义类型时,new会先调用operator new函数再调用自定义类型的构造函数,而delete会先调用析构函数再调用operator delete函数。newdelete为什么要如此设计呢,我们举一个具体例子来说,比如我们要在堆上申请一个栈对象int main()delete st;return 0;有。

2023-05-18 15:05:36 901

原创 Linux基础——指令

在Windows环境下,对于复制粘贴我们常常使用ctrl+c/ctrl+v,但是这在Linux环境中是不适用的,而在我所使用的xshell软件中,使用来进行,使用来进行。

2023-05-14 23:09:31 337

原创 C++基础语法——类和对象

构造函数是一个特殊的成员函数,名字与类名相同创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。注:构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。拷贝构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰)

2023-05-12 20:44:25 915

原创 C++应用实例——日期类的实现

我们使用如下代码来使用并检测。对于流输入与流输出有。

2023-05-10 17:12:15 149

空空如也

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

TA关注的人

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