自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux 开发工具

g++ -c 是编译 C++ 程序时的常用命令组合,主要用于将源代码转换为目标文件(object file)也就是机器能识别的二进制编码,但不进行链接操作。像这样 我们不仅可以查看我们自己生成的a.out文件所依赖的动态库 同时也可以查看 一些指令所依赖的动态库 毕竟linux里面一切皆文件嘛!我们发现 无论是cpp文件还是说cpp预处理后的文件还是说编译后的文件 我们都可以用-c。如果是动态库 就是我们把我们要printf的内容去到这个动态库里面处理。我们的机器上一般会默认安装动态库 不会安装静态库。

2025-05-29 21:21:34 663

原创 C++ RB_Tree

这种平衡策略被称为 "弱平衡",相较于严格平衡的 AVL 树,它允许节点间的高度差不超过两倍,从而减少了旋转操作的频率,提升了动态数据操作的效率。这个 "黑色高度" 的一致性,保证了树的最长路径不超过最短路径的 2 倍(因为红色节点不能连续出现,最长路径 = 黑色高度 + 红色节点数,而红色节点数≤黑色高度)。任何红色节点的左右子节点必须为黑色,防止出现 "红 - 红" 相邻的情况,这是维持平衡的关键约束。这里的叶子节点指的是 NIL 空节点(外部节点),所有真实节点的叶子都指向这些黑色哨兵节点。

2025-05-29 21:21:02 396

原创 Linux 工具

我们平时下载软件基本都是到应用下载 那么应用商店里面本质上存放的是什么?本质上存放的是都是每个软件的下载链接那么同样我们linux里面也可以下载软件那么我们首先要下载软件 我们要检查网络是否连接。

2025-05-06 14:27:18 814

原创 C++ Avl_Tree

AVL树本质上是在搜索二叉树的情况下改造的搜索二叉树的缺点是 最坏的时候效率太低容易演变成链表AVL树对搜索二叉树的这个痛点进行了改造解决方案就是旋转通过旋转AVL树可以做到左右每个子树高度可以不超过1要了解旋转 我们首先要了解平衡因子。

2025-05-06 14:26:46 784

原创 C++ 蓄水池抽样算法

概率都是最后代码奉上。

2025-04-22 16:38:18 521

原创 C++ 快速幂算法

暴力算法当然是遍历for循环 循环n遍 但是这样时间复杂度就是O(n) 效率太低了。就是偶数了 这样我们就可以把时间复杂度降低到O(logn)就可以了 这个矩阵的n次方 我们就可以用上快速幂的代码了。F(1) F(0)是已知的 我们只用求。如果是n奇数 我们可以把a存下来 计算。我们来看一个实际应用 斐波那契数列。我们当然可以用动态规划取写它 同时。这样我们就只用计算4次就可以了。我们思考一个问题我们怎么计算。答案是有的 就是快速幂的算法。但是如果n是奇数次方怎么办?有没有更简单的办法?

2025-04-22 16:36:31 320

原创 Linux 入门指令(2)

比如这个地方我就指定在 /usr/bin/ 路径下查找 pwd这个文件(Linux一切指令都是可执行文件)比如这里 我输了一个cal -y 2025 就会自动显示2025日历的信息 同时标明今天的日期。.c文件会编译生成一个.out文件 我们就可以在当前(./)路径下去运行这个.out可执行文件。像这个地方 我直接whereis ls 他就会把ls命令相关的文件全部给我找到。比如说我这个地方ctrl r ll 就会打印出我使用过的ll指令。因为这个时间戳转化的时间是当地的时间差!

2025-04-17 17:49:27 793

原创 Linux 权限

在一个共享目录中,多个用户可能都有写入和删除文件的权限,设置了粘滞位之后,只有文件的所有者、目录的所有者或者超级用户(root)才能删除或重命名该目录下的文件。我希望这个文件是可以被写入的 但是同时我又担心我朋友把我重要的文件删了 我不想给他删除的权限 这个时候怎么办?那么怎么更改所属组和拥有者呢?答案是不可以的 因为每个用户只能有一个身份 如果是拥有者就不能是所属组了!4是所属组的权限 转换成二进制也就是 100 也就是r--我们在文件上就可以看见 不同人+不同的属性 就是我们的权限。

2025-04-17 17:48:15 1059

原创 Linux 入门指令(1)

ls -l可以缩写成 ll 同时一个ls可以加多个后缀 比如 ll -at。

2025-04-09 23:38:25 1573 2

原创 Linux 的准备工作

首先讲一下root账户怎么登陆直接 ssh root@ 公ip地址就可以了比如我的是腾讯云的这个就是公ip。

2025-04-09 23:37:53 407

原创 C++ 异常

传统C语言处理错误有两种方式“1.终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。2.返回错误码缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。

2025-04-06 00:39:33 929

原创 C++ 排序(2)

这个问题我们要进行分类讨论 直接对相遇情况讨论即可无需对过程进行讨论因为过程会发生交换 交换会进行交换调整使其又开始right先走 找小 然后了left找大 就是一个新的循环了!right先走1.right找到小的 left没有 找到大的 left遇到right这个时候right是小的 所以相遇的点是2.right没有找到小的 直到遇到left 这个时候的left(1)一步都没走的left的 也就是相遇点和key相同(2)走过一步及以上的left 也就是相遇点比key小。

2025-04-06 00:39:11 891

原创 C++ 排序(1)

以下是一些插入排序的代码。

2025-04-05 13:37:27 240

原创 C++ KMP算法·

问题:(主串) m个数据s2="issip"(子串 ) n个数据我怎么才确认在s1中是否存在s2呢?当然我们一眼可以看出来 那计算机怎么办?暴力方法:我们首先在主串中找到 和子串首字符相同的字符s1="mii为指针指向的位置 该指针设为ptr1)s2="issip"" (i为指针指向的位置 该指针设为ptr2)然后我们ptr1 ptr2 同时走 会出现三种情况。

2025-04-05 13:19:59 1211

原创 C++ 多态(3)

抽象类是虚函数等于0 实现的 抽象类的作用是 简介强制实现重写在同一个作用域内,函数名相同但参数列表不同(参数的类型、个数或顺序不同)的函数可以同时存在,编译器会根据调用时传递的实参类型和数量来选择合适的函数进行调用。在继承体系中,派生类定义了一个与基类虚函数具有相同函数名、参数列表和返回值类型(协变返回类型除外)的函数,并且使用 override 关键字(可选但推荐)来明确表示这是对基类虚函数的重写。当通过基类指针或引用调用该虚函数时,会根据对象的实际类型调用派生类的重写函数,实现运行时多态。

2025-03-17 08:00:00 306

原创 思考:菱形虚拟继承和多态

菱形继承/虚继承和多态的结构。

2025-03-17 08:00:00 403

原创 思考:this指针

哪怕你这函数功能的实现不需要this指针 它也会传 C++把this指针统一交给编译器处理。我们会发现 this 指针是一个很特立独行的东西 类对象调用函数都要传它。因为你派生类你调用的虚函数函数头虽然是基类的 但是this指针 一定是派生类。而且类对象的函数调用的时候 编译器都会去传this指针 这样可以统一。因为你派生类重写的虚函数很可能要用到派生类特有的成员。多态里面的this指针。

2025-03-16 08:00:00 213

原创 思考:虚函数的调用方式

1.虚函数的调用方式是和普通函数一样 还是通过虚表调用?

2025-03-16 08:00:00 304

原创 思考总结:继承

可以 因为派生类有基类对象的成员。

2025-03-15 14:12:38 389

原创 C++ 多态(2)

为什么多态要求是基类的指针或者引用多态情况 根据不同对象执行相应代码 普通情况 根据类型执行相应代码。

2025-03-15 14:05:03 1270

原创 C++ map/set (2)

map和set返回值都是pair函数pair的first是迭代器 second是布尔值 插入成功就是true 失败就是false我们写一个map统计元素出现的次数 但是很麻烦那么有没有更简单的方法呢?答案是有 就是operator[]

2025-03-11 14:29:12 498

原创 C++ Binary_Search _Tree(2)

【代码】C++ Binary_Search _Tree(2)

2025-03-11 14:28:39 130

原创 C++ Binary_Search _Tree(1)

我们Erase 首先要找到我们要删的东西在不在 如果我们要删除一个不存在的东西那肯定是直接返回false找的规则符合搜索二叉树的性质即我们再来思考找到了要删的点有哪几种情况1. 左子树的值为空2.右子树的值为空3.左右子树的值都不为空(1)左子树为空(左节点为空)左子树删除的时候 我们要注意两点就算右子树也是空也可以链接但是我们再思考一些特殊情况 比如删除的是根呢?如果删除的是根 它不就没有父节点吗?那上面两点是不是就不成立 这种情况我们就要去单独写了!那很简单。

2025-03-06 08:30:00 886

原创 C++ map/set(1)

map和set就是二叉树的value和key模型map是value模型 set是key模型map和set都是基于红黑树实现的红黑树具有平衡性质那么思考一下 算法库里面的find函数和STL里面的find函数有什么区别。

2025-03-06 08:30:00 700

原创 C++继承(2)

高内聚则是指模块内部的各个元素都是紧密相关的,共同完成一个明确的功能。思考:这个地方 B C都不会去调用A构造 那么B C 的:S(sa)(显示调用)可不可以去掉?答案是:不可以 因为D里面的A(原理和下图一致)既不在B里面也不在C里面 不能依靠B和C来。而且是最A先构造的 D是最后构造的 因为A是B C的基类 B C是D的基类。像这个代码 先继承的是B 所以B比C先调用构造函数。A B C D各构造一次 顺序是A->B->C->D。那么A的A(sa)可不可以去掉呢?组合的耦合度低 继承的耦合度高。

2025-02-12 08:00:00 347

原创 C++多态

这个地方的虚函数的virtual和前面虚拟继承的关键字virtual没有任何关联只有成员函数才可以变成虚函数虚函数可以完成重写(覆盖)虚函数就是在函数前面+一个virtual 我们先来看这串代码 很神奇func接受Person匿名对象和Student的匿名对象的切片(接收类型是Person)但是调用的确是不同的BuyTicket正常来说这个地方是p去调用BuyTicket()但是这个地方p是Person类型 所以按照隐藏来算 调用的也应该是Person::name;但是这个地方我们不+Student::它

2025-02-12 08:00:00 959

原创 C++ 继承(1)

这个地方函数的同名要和函数重载区分一下首先函数重载是在同一个域中这个地方的函数同名是处于两个不同的域我们直接上代码就很容易理解了。

2025-02-09 23:13:02 617

原创 C++模板进阶

这个地方为什么push不行?原因是push没有实例化 编译器怎么知道这个T是什么类型 怎么生成地址给call呢?怎么解决?在函数定义的文件显示实例化template但是这个方式有坑如果我要的不算stack<int>而是stack<double>呢?那就要再写一个,治标不治本!最好的办法就是把定义和声明写在同一个文件内。

2025-02-09 08:00:00 686

原创 C++ 反向迭代器

3.反向迭代器的++相当于正向迭代器的-- 反向迭代器的--相当于正向迭代器的++1.迭代器的rebegin()是在最后一个元素的末尾(和正向迭代器保持一致)2.因此反向迭代器的解引用是解引用当前位置前一个位置的元素。反向迭代器不难 但是有些地方还是需要注意一下。4.这个反向迭代器是适用于不同容器的。

2025-02-04 16:19:06 220

原创 C++ 仿函数

因此我们在这个地方要根据Date大小去建堆就只能自己写一个仿函数了。仿函数可以当作模板使用,因为每个仿函数都拥有自己的类型。仿函数返回值类型是bool数据类型 称为谓词。仿函数本质上就是类+operator()仿函数比函数更灵活 有自己的数据和成员变量。仿函数比函数指针执行的更快(大多数情况下)缺点在于定义的时候需要定义在一个类里面。像这个地方我们对于Date*这个类型。但是我每次new的地址的大小是随机的。我们在有些情况下 必须要用仿函数。看上去仿佛是函数 实际是类。仿函数可以当作参数传递。

2025-02-04 16:05:59 352

原创 C++ priority_queue

但是什么时候要用比如像这样sort(pq.begin(),pq.end(),greater<int>())sasadasssas优先队列和队列是在同一个头文件中 也就是#include<queue>如果要小堆的话那就要改第三个参数了(也就意味着第二个参数我们就要自己写了)函数模板要传对象 所以这里本质上是一个匿名对象greater<int>()这个地方是类模板要传的是参数 参数是什么?我们思考一下 这个地方greater<int>后面要不要加括号?仿函数模拟的是C语言里面的函数指针。

2025-01-30 22:41:10 46

原创 C++ deque(1)

deque的扩容不像vector那样麻烦 直接新开一个buffer 不用重新开空间再把数据全部移过去deque本质上是一个指针数组和vector<vector>不一样,vector<vector>本质上是一个vector对象数组!并且vector<vector>的buffer是不一样大的 而deque的每个buffer大小是固定的指针数组满了之后直接扩容就可以了,并且代价很低基本可以忽略不记(只用拷贝指针数组的全部指针就可以了)数据插入的时候 优先往中间插入 因为这样你尾插和头插就不用去挪动数据了!

2025-01-30 06:00:00 654

原创 C++ queue

因为队列是先进先出 vector没有提供头删(效率太低)要强制适配也可以 就得用erase函数和begin函数了。库里面的队列是不支持vector<int>的。队列用vector<int>好不好。

2025-01-29 21:41:25 228

原创 C++ stack

所以我们在自己实现stack的top函数的时候 是不能直接返回_container[0](链表不能用[])这个时候就可以用back这个函数了 因为无论是vector还是list都有front和list的接口。stack不需要迭代器 因为 栈是不能随便遍历的 因此方括号也不能用。因为对于自定义类型 编译器会调用它们的默认构造!这个地方不用写析构函数 构造函数和拷贝赋值等。

2025-01-29 16:24:56 257

原创 C++ list

这个版本的 splice 会将列表 x 中由迭代器 first 和 last 定义的范围内的元素移动到 position 所指向的位置。splice 函数是C++标准模板库(STL)中的 list 容器的一个功能强大的方法,它允许将元素从一个列表移动到另一个列表,而不需要创建新元素,从而优化性能。通过调用 sort() 方法对列表进行排序,然后使用 std::unique 处理重复的相邻元素,并通过 erase() 方法删除这些重复元素。最终,输出的是一个不包含相邻重复元素的列表。

2025-01-27 06:30:00 1344

原创 C++ list(2)

【代码】C++ list(2)

2025-01-27 06:30:00 190

原创 C++ String(4)

【代码】C++ String(4)

2025-01-17 09:00:00 173

原创 C++ vector(2)

【代码】C++ vector(2)

2025-01-17 09:00:00 189

原创 C++ vector(1)

(此时 it 指向元素 3 ),执行 v.erase(it) 后,原来指向元素 4 ( it + 1 )的迭代器现在指向了元素 5 ,这就导致了迭代器的逻辑错误。因为string里面的find可能是找一个字符串也可能是找一个字符,包括在哪些范围内寻找,要求比vector的find要高,因此string的vector是单独实现的,而vector包括后面的list那些都用的是算法里面的那个find。因为元素的移动,原本指向后面元素的迭代器现在指向的是其他元素了。要注意在插入操作前后更新迭代器。

2025-01-15 08:45:00 716

原创 暑期Matlab(1)

19.A[1 2 3] B[1,2,3] A(3) 表示A矩阵的第三个元素 B(2)表示B矩阵的第二个元素。20.比如我们要输入一个矩阵A[1 2 3 ... 100]如果我们要一个一个输,就会很麻烦 我们可以直接。比如C矩阵是一个3乘3的矩阵,我如果想表示第三行第二列的元素 我直接C(3,2)就可以了。A(3,:)=[]我直接把A矩阵的第三行所有元素置为空不就相当于删掉了A矩阵的第三行了嘛!max(A)表示A矩阵每一列的最大的元素构成的矩阵(如果只有一行或者一列则会求出其最大值)

2025-01-15 08:00:00 793

算法领域蓄水池抽样算法解析:数据流随机采样方法及其概率计算详解

内容概要:蓄水池抽样算法是一种用于从大量数据流中随机抽取固定数量样本的有效算法。该算法的核心思想是:当遇到第i个元素时,以一定的概率决定是否用该元素替换当前样本集中的某个元素。具体来说,在遍历数据流的过程中,前 samp 个元素直接进入样本集,之后对于每个新元素,以 samp/i 的概率替换样本集中已有元素。随着 i 的增加,元素被保留的概率逐渐减小,但所有元素最终出现在样本集中的概率相等。; 适合人群:对算法设计与分析有一定了解,尤其是对概率算法感兴趣的计算机科学专业学生或工程师。; 使用场景及目标:①需要从海量数据中随机抽取固定数量样本的场景;②确保每个元素被选中的概率相同,以保证样本的代表性和随机性;③适用于数据流处理、大数据分析等领域。; 阅读建议:由于蓄水池抽样算法涉及概率计算和动态更新样本集,建议读者在理解基本概念的基础上,结合实例进行模拟练习,加深对算法机制的理解。同时,可以研究不同变种的蓄水池抽样算法,以应对更复杂的实际问题。

2025-05-29

.菱形继承(虚继承)可视化

.菱形继承(虚继承)可视化

2025-05-29

【数据结构与算法】红黑树变色与旋转

内容概要:本文档简要介绍了红黑树(RB_Tree)中叔节点(uncle)的不同情况及其对树结构操作的影响。红黑树是一种自平衡二叉查找树,它通过特定的着色规则(节点颜色为红色或黑色)来确保树的高度接近对数级别,从而保证插入、删除和查找操作的时间复杂度。文档指出当叔节点为红色时,它会影响树的重新着色和旋转策略;当叔节点为黑色并且是空值(NULL),这里的NULL仅用于验证节点是否属于红黑树,而不实际参与到旋转操作中;当叔节点为黑色且不是空值时,则需要根据具体情况进行不同的调整操作以维持红黑树性质。; 适合人群:计算机科学专业学生、数据结构与算法爱好者以及从事软件开发并对高效数据存储结构有兴趣的人士。; 使用场景及目标:①理解红黑树中不同情况下叔节点的角色和作用;②掌握红黑树维护平衡性的基本方法,如着色和旋转规则;③能够正确处理NULL节点在红黑树算法实现中的特殊意义。; 阅读建议:在学习过程中应结合具体的例子进行理解,可以尝试手动模拟红黑树的插入、删除操作,注意观察不同情况下叔节点的变化及其对整个树结构的影响。同时,对于NULL节点的理解不要局限于一般意义上的空指针,而要认识到它在红黑树算法中的独特含义。

2025-05-29

.AVLTree可视化

.AVLTree可视化

2025-05-29

.单继承和多继承可视化

.单继承和多继承可视化

2025-05-29

.菱形继承(非虚继承)

.菱形继承(非虚继承)

2025-05-29

空空如也

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

TA关注的人

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