自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ 11 atomic 原子性操作

是模板类,支持大部分基础数据类型(boolcharintlong、指针等),也支持用户自定义的 “可平凡复制” 类型(Trivially Copyable,即能通过 memcpy 复制的类型,如不含指针的结构体)。cpp// 1. 基础类型原子变量// 原子布尔(标志位)// 原子整型(计数器)// 原子长整型// 原子指针// 2. 自定义平凡类型(需 C++20 或编译器支持,部分编译器 C++11 即可)int x;int y;

2025-11-23 21:26:04 1101

原创 C++11 std::mutex 互斥锁

多个线程互相持有对方需要的锁,且都不释放,导致所有线程永久阻塞(程序卡死)。避免方法所有线程都按相同的顺序加锁(如先锁mtx1,再锁mtx2。。),避免交叉等待。

2025-11-23 18:44:33 404

原创 C++ 11 thread库与this_thread(线程)

C++11的线程库std::thread,线程,是进程的执行分支,一个进程中可包含多个线程,可以指定执行流完成不同的任务,我们主要介绍C++中线程库的线程用法。我们需要创建线程入口,比如用函数、lambda、仿函数、成员函数作为入口,参数直接跟在调用对象后,下图是我们最简单的函数入口,直接在后面传参即可。detach():用于分离线程,子线程后台运行,与主线程无关了,等子线程结束后资源自动回收(分离后无法调用join)此外,下面两个join()是使主线程阻塞,等t1和t2执行完毕后再回收信息结束运行。

2025-11-23 17:22:24 186

原创 查缺补漏c语言——c标准字符串函数

把str2的字符串拷贝到str1去,返回str1的指针,覆盖str1原有的所有,需要足够空间拷贝。若str1>str2 返回值>0 小于则返回 <0 相等return 0。在str1中找到首次出现str2的位置,如果未找到返回NULL。拼接函数str2接到str1的后面(str1后要留够空间)字符串比较函数,从首字符开始逐个进行ascii码值的比较。(a<b<c<d....)并不是谁长谁大!返回str字符串的长度,不算\0。

2025-11-19 20:53:04 213

原创 查缺补漏c语言——静态修饰与类型转换

普通的局部变量创建后是放在。

2025-11-19 00:57:59 262

原创 查缺补漏C语言——与“#”的爱恨情仇

_DATE__ __FILE__ __LINE__ (分别表示当前日期,文件名和对应行号)可以把其当成常量的宏进行输出。

2025-11-18 22:58:02 133

原创 背包问题——完全背包

在此问题中,我们可以推广,比如我们腾出至少两个v[i]的体积,那么在选第i个的情况下就是取max(dp[i-1][j-v[i]]+w[i],dp[i-1][j-2*v[i]]+2*w[i],.......推广到n个)我们用这个就可以推导出方程。我们的状态表示dp[i][j]表示在前i个物品中,不超过j体积下所有方案的最大价值(一种物品的个数不再是只有一个而是无限个)在01背包问题的情况下,我们是dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])

2025-11-16 21:43:13 435

原创 动态规划算法经典问题——01背包问题

初始化方面,第一行除了第一个位置我们为0剩下都是-1,因为我选第0个物品的情况下(即不选)我是无法把你的背包装满的,但是第一个位置背包体积为0,某种意义上也满足要求,但价值是0.如果选第i个,除了考虑是否v[i]<=j,还要满足dp[i-1][j-v[i]]不等于-1(即满足要求恰好装满)这时候背包恰好剩下v[i]个位置直接放入即可。当选时,首先要判断第i个物品体积是否大于j,如果大于了,只选第i个都已经过大了,显然不满足要求,因此我们要加个判断条件,在此条件下,它就等于。(对于问题1的状态表示)

2025-11-16 17:17:24 478

原创 零基础带你实现Json--Rpc框架项目(主题发布与订阅实现)

本篇我们要实现其功能是服务的注册与发现。在之前实现的Rpc请求与响应功能中,我们很明显的可以看到其是一对一的关系,这就意味着一旦服务端出现问题后,客户端就无法获得服务了。因此,我们应该采用分布式,多个服务端进行服务注册功能,每一个服务端告诉我们的注册中心自己的ip以及能提供的服务,服务的调用方,首先进行一次服务发现,知道哪些主机可以提供哪些服务。

2025-11-15 16:05:18 893

原创 零基础带你实现Json—Rpc框架项目(Rpc功能实现)

除此之外,我们还需要定义一些项目中需要用到的字段消息正文消息类型Rpc请求&响应 主题操作请求&响应 服务操作请求&响应响应码定义RPC请求类型定义主题的操作类型服务的操作类型。

2025-11-11 23:36:18 967

原创 零基础带你实现Json—Rpc框架项目(讲解篇)

RPC(RemoteProcedureCall)远程过程调用,是⼀种通过网络从远程计算机上请求服务,而不需要了解底层网络通信细节。RPC可以使用多种网络协议进行通信,如HTTP、TCP、UDP等,并且在 TCP/IP网络四层模型中跨越了传输层和应用层。简言之RPC就是像调用本地方法⼀样调用远程方法。过程可以理解为业务处理、计算任务,更直白的说,就是程序/方法/函数等,就是像调用本地方法⼀样调用远程方法。

2025-11-09 17:06:02 740

原创 用动态规划思想解决回文串问题

状态转移方程:dp[i][j]:如果s[i]不等于s[j]直接false;如果s[i]==s[j]又有以下几种情况。如果i==j或i+1==j直接为true,要么就是dp[i+1][j-1]。我们假设到i位置开始,记录所有以i开头的所有字串,也就是来一个j在i后依次遍历。i到下一个位置时,j不必从0开始走,只需要从i之后走即可。回文串问题,我们其实优选的算法是中心扩展算法,但有些题目我们用动态规划思想去解决更简单。dp[i][j],表示s字符串[i,j]的字串是否是回文串。最后看数组中true的数量即可。

2025-10-23 22:22:48 203

原创 动态规划dp之子序列问题

对于dp[i]如果长度为1,那就代表前面都不符合递增要求(我们需要把i位置依次与[0,i-1]位置比较,因为如果nums[i-1]和nums[i]不符合,但i位置有可能与0,1,2,,i-1位置符合题意组合。这种问题和子数组的问题区别在于这个状态转移方程dp[i]要和[0,i-1]中均比较(我们一会用一道题解释这个原理),而子数组问题的dp[i]无非是和dp[i-1]或者nums[i-1]比较。那么子序列可以是[1,2,4],[1,3,5],[2,4,5],也可以是[1],[3],[4]

2025-10-23 13:05:21 242

原创 动态规划问题之子数组问题

在此题中,我们就要比较nums[i]和dp[i-1]+nums[i](子数组长度为1和长度大于1),注意到并不是在dp[n-1]才取最大值,而是要整个dp的最大值,因此我们要记录一下。我们注意到,想知道最大和子数组,只需要知道,以某一个位置为结尾的所有长度的子数组的最大值即可。此问题算是动态规划问题下的一个分支,因此解题思路和步骤大同小异,唯一就是状态转移方程和创建数组不太一样,我们用一道题来引入。这种问题的状态转移方程通常是,用当前位置的元素和之前的最值加此元素比较。问题的关于状态转移方程是什么?

2025-10-20 16:33:50 159

原创 动态规划之简单多状态dp问题

此问题是动态规划问题的一个分支,其做题思路整体不变(创建数组、状态转移方程、初始化、填表顺序、返回值),但有些题目,它往往会处于两种或多种状态,这就导致我们的dp数组不知道该填哪一种状态下的最大(小)值。解法,创建两个数组,分别表示两个状态(在我们这道题中,两个数组存放的元素是nums1[i]今天选的情况下最大值和nums2[i]今天不选的情况下最大值)这种问题我们就称为多状态的dp。如果第i天不选,那么第i-1天可以选也可以不选,那么nums2[i]=max(nums1[i-1],nums2[i-1])

2025-10-20 14:51:41 297

原创 DFS算法原理及其模板

与BFS不同的是,DFS是在某一点处采取一条路走到黑直到不能走下去再返回,而BFS是到某一点时先把该的周围走一遍然后以这些点为起点重复此操作。此外,DFS用到了递归思想(可以借助二叉树遍历思想理解)DFS——深度优先遍历,与BFS有极大的相似性,代码模板也是如此,我们这里给出BFS的讲解回来再看DFS就简单的多了,而且DFS代码写起来比BFS更简洁。这里直接给出DFS模板。

2025-10-17 22:13:31 292

原创 【手把手带你做项目】C++高并发内存池

从下而上的分析,现在我们是有多个Threadcache*的线程的变量,然后当想要空间时,传一个大小的参数size,然后就会调用ConcurrentAlloc函数(在ConcurrentAlloc.hpp)去申请空间,而该函数的底层就是new一个Threadcache的对象去调用它的Allocate函数,然后Allocate函数就会进行对齐和映射找到对应的桶里链表去获取,如果链表是空的,那么只能再向上去Centralcache拿块空间了。

2025-10-14 21:15:00 839

原创 mysql——用户管理

MySQL用户管理摘要:本文介绍了MySQL用户管理的基本操作,包括查看用户信息、创建/删除用户、修改密码、权限管理等内容。用户信息存储在sys库的user表中,可通过create user命令创建指定登录权限的用户,使用grant和revoke命令进行权限授予与回收。新创建用户默认无权限,需手动授权才能访问数据库。修改密码可使用set password命令,管理员可为其他用户重置密码。权限操作后建议执行flush privileges刷新权限。通过合理分配不同用户的权限,可有效提升数据库安全性。

2025-09-25 15:42:32 448

原创 mysql——视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。视图本身就是一个表。

2025-09-24 22:11:26 194

原创 mysql——事务(下)

其中隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平衡点。不可重复读的重点是修改和删除:同样的条件, 你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增:同样的条件, 第1次和第2次读出来的记录数不一样,说明: mysql 默认的隔离级别是可重复读,一般情况下不要修改上面的例子可以看出,事务也有长短事务这样的概念。事务间互相影响,指的是事务在并行执行的时候,即都没有commit的时候,影响会比较大。

2025-09-24 17:18:43 1130

原创 mysql——事务(上)

事务,也就是我们对一件事的处理办法所要做的事。比如我们现在要买票,如果买票成功,对方的事务就是要把票的总数更新-1.同时,也要把我们标记为买票状态等。在mysql中,事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的 数据是不相同的。也就是说,我要么买票成功,你做出一系列更新数据的事务,要么买票失败,你要保持原来的状态,不会因为我做出买票的动作就不能回头。

2025-09-23 18:15:30 814

原创 mysql——索引

一句话,用来提高数据库的性能,最明显的效果就是提高查询速度(我们之前演示的速度虽然也很快,但数据量很少很少,海量数据一般是上百万的时候我们甚至要花几分钟的时间去查询一条数据,但有了索引依然能在几毫秒内完成)。也就是说,我们的所有page页,并不都存储数据,有一些page内部,专门存储其他存放数据的page的位置,这样当我们要查找某一个page中的数据时,不需要依次遍历,只需要去页目录中找对应page的位置直接去查找即可。目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。

2025-09-22 18:17:40 1150

原创 动态规划算法简介

接下来我们谈谈空间优化问题,我们发现,dp[i]的求法,只需要用到它之前的三个数即可。动态规划其实并不完全的说有一定套路,我们只能说根据规律来总结这个方法来解一些题目,而且这种方法需要大量的刷题进行总结,得到的经验可能会比记模板要有效的多,因此我们本篇只是大致讲解通用的解题步骤和优化。1.创建一个一定空间的数组dp,dp内的某一个值通常是由该数组的其他值简洁得到的,且记录的 值代表的是该点的状态表示(这个概念就非常宽泛,只能说多做题来理解,也就是某一点的含义记录在这里,

2025-09-22 00:09:33 297

原创 mysql基础——复合查询

原因在于:如果我们只是查询,不加任何的筛选信息,那么表1的每一条数据都会和表2的数据结合形成一条数据并显示(一共m*n条)这种结果我们称笛卡尔积。多行子查询是指返回单列多行数据,都是针对单列而言 的,而多列子查询则是指查询返回多个列数据的子查询语句。显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号(包含自己部门 的员工)查询和10号部门的工作岗位相同的雇员的名字,岗位,工资,部门号,但是不包含10自己。显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号。

2025-09-20 12:03:23 868

原创 刷题有感——大小堆算法

大致的思路是,把全部元素分成两部分,前半部分排序为大根堆,右半部分排序为小根堆。本来我是觉得,在每次插入元素后都进行一次排序然后计算中位数的值,结果也确实是可以,直到我看到了另一种高效解法——大小堆。当插入右边时,需要把右边的数移到左边才能满足要求,一定是先插入排序,再把右堆顶插入到左堆。当left=right+1时正好相反,插入左就先插入再移堆顶,插入右只需一步即可。为了保证插入后还满足人为规定,当插入左边时,只需要简单的进行插入即可。最后求中位数我们只需要判断元素个数是奇数偶数即可。

2025-09-20 09:32:57 241

原创 优先级队列在算法中的应用

优先级队列(prioriry_queue)我们最常用于堆的排序中,其弹出元素的顺序并不是FIFO,而是根据优先级弹出,这个优先级最常见的就是根据大或小,当然还有我们自己定义的大或小。这题也属于TOPK问题,但我们发现这题的比较条件有点特殊,首先要保证出现次数最多优先,次数相同的话,还要根据字典序输出,如果要照顾次数,我们当然是小根堆,照顾字典序,要用大根堆。有的时候,堆中建的并不是int,而是string char 甚至是pair,这时候C++提供的比较函数就不起作用了,需要我们自己写一个比较方法。

2025-09-20 01:11:58 273

原创 mysql——内置函数

假设我们现在有一条竖直方向的数轴,且正方向向上,那么向上取整就是取整后的数在数轴的位置比之前的高:比如3.1,3.3,3.6的向上取整都是4,-3.1,-3.6的向上取整都是3.replace(str,search_str,replace_str):把str中的search_str替换成replace_str。substring(str,pos,length):分割字符串,从str的pos位置开始获取length个字符。instr(str1,str2):返回str2在str1出现的位置,没有返回0。

2025-09-18 18:16:19 525

原创 利用BFS+队列解决二叉树的层序问题

我们选择用队列来从根存储节点,然后利用FIFO原则进行输出,但问题是:我们输出的时候还需要把根的所有节点存放,且存放后我们怎么知道这几个数据属于哪一层?我们可以记录当前队列的长度,当插入一层后,记录长度,然后进行n次弹出即可。BFS的原理我们在之前的文章有讲过,我们本篇用题目来讲解算法原理。

2025-09-18 14:20:07 139

原创 一篇拿下算法中最常用的数据结构及其接口

str.substr(m,n):从str[m]开始向后n个长度截断字符串[m,n)(例如,str.substr(1,2)结果为"el")reserve(str.begin(),str.end()):传字符串的迭代器,实现字符串的反转。st.top():获取栈顶元素(一般写成接受形式int ret=st.pop())(不传参)允许使用[]重载:比如:map[0][1](查找first=0的vector[1]的元素)st.empty():栈是否为空,如果此条件为真相当于st.size()==0。

2025-09-17 22:49:10 906

原创 mysql基础——基本查询

count:统计数据个数(也可以不用*,比如统计班级的数学成绩个数就替换成math),如果要去重后的数量就是count(distinct math)我们知道,如果插入和主键或唯一键中的值相同的值就会导致插入失败。我们可以选择更新操作,也就是如果冲突了我们可以把内部的值更新成新的。本篇内容我们将系统性的讲解对表的增删查改,事实上,我们在之前讲表的约束中已经用了很多相关操作了,这里系统性的补充一下。我们在上面也使用多次。注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序。

2025-09-17 15:50:17 475

原创 利用BFS解决拓扑排序问题

我们需要知道的是,拓扑排序的结果可能不是唯一的(可能相同入度的优先级相同)其本质是一个图,但特别的是,图上的每一个点都对应着方向(指向下一个可以走向的点),同时还要保证:图上的点的指向不可以形成一个环。vector<vector<int>> :n行,用[n][m]来记录第n个点有m的入度(只需要在n行插入m个数据即可)在有向无环图中,用顶点来表示一个活动,用边来表示活动的先后顺序的图结构。重复上述操作,知道图中没有点或者没有入度为0的点(有可能有环)为止。判断与删除边相连的点的入度,为0加入到队列中。

2025-09-16 23:34:57 251

原创 mysql基础——表的约束

我们之前在建表创建数据时,发现如果插入的数据超出本身的范围或者类型不符都会被拦截报错,这本质上就是表的一种约束,这种约束使得我们插入数据库表中的数据一定是符合预期的,约束本质就是通过技术手段,强制让我们插入正确的数据。本次我们就来讲解表中各个约束条件。

2025-09-15 20:35:20 783

原创 利用BFS解决多源最短路径问题

其次我们看见下面的while循环中没有了记录q内部的size(),也就是说,在单源最短路中,我们记录int sz=q.size()然后进行sz次循环的遍历,是因为我们走到下一个位置时,要向四面八方都要进行探索(相当于一次向所有方向都走了一步),只有这样我们才能准确的记录走的步数。中,我们利用BFS解决了最短路径问题,严格的来讲,上文中解决的是单源最短路,也就是只有一个固定的起点到终点的最短路。多源的意思是我们并不是只有一个起点,除终点外可能任一点都会作为起点。算法实战——01矩阵。

2025-09-15 10:42:21 334

原创 mysql基础——数据类型

我们在库中创建一个表时,不仅需要声明表中的属性名称,也要说明其数据的类型,本篇我们来讲解mysql中的基本数据类型及用法。

2025-09-14 18:20:59 751

原创 mysql基础——库与表的操作

在学习了mysql的基础内容后,我们接下来要讲解一些有关于对库与表的相关操作。

2025-09-13 22:52:58 612

原创 利用BFS算法解决最短路问题

假设我们的要求是从A到I的最短路径,方法就是:从起点开始进行BFS,第一步把A放入队列,把hash中的A标记(bool或其他均可)。然后把A弹出,放入BD,然后把BD弹出(这里的弹出顺序并没有要求,我们可以看成是同一时间弹出)并标记。然后放入CE,但是当我们弹出CE是就不能放入EFG了(E已经被标记为遍历就不放入了)只需让入FG,然后弹出再放入HI,发现此次放入的有我们的终点。在每一条路径中,我们走的速度相同,到达下一个点的时间相同起点相同,那么谁先到终点代表这过程中走过的点最少,路径最短。

2025-09-12 11:32:57 259

原创 mysql数据库基础

DML【data manipulation language】数据操纵语言,用来对数据进行操作 代表指令: insert,delete,update DML中又单独分了一个DQL,数据查询语言,代表指令: select DCL【Data Control Language】数据控制语言,主要负责权限管理和事务 代表指令: grant,revoke,commit。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的 低,在嵌入式设备中,可能只需要几百K的内存就够了。

2025-09-11 23:16:49 901

原创 BFS——岛屿数量

【代码】BFS——岛屿数量。

2025-09-11 14:10:03 94

原创 BFS与FloodFill算法简介与实战

FloodFill(洪水灌溉)算法,我们一般用以下情景模拟:假设我们有一个二维数组,每一个元素代表其高度(正负表示低于/高于水平面),假设现在从四面八方来了洪水,问哪些元素代表的区域先被水覆盖,很明显,需要低于水平面才能满足要求而且需要周围都要低于水平面。而BFS(深度优先算法),是从层序遍历的角度来查找是否有符合的区域。除此之外还有DFS(深度优先算法)采用一条路走到黑的方法来寻找,本篇我们咱不说后者。我们先从标记点开始渲染,然后分别渲染其上下左右,然后分别以其为中心继续渲染。实战模拟——图像渲染。

2025-09-10 22:51:48 237

原创 网络层协议——IP

我们说过,路由器具有构建子网的能力,一旦家里安装了路由器,我们就可以通过路由器进行上网了,然而事情并没有这么简单,路由器上还有一个重要的配件——网线,这根网线就是运营商进行提供的(三大运营商),但并不代表我们有了网线和路由器,就可以直接访问公网IP了,事实上,在家庭路由器的上层,还有一个大路由器,这个路由器是由运营商管理,下连各个家庭的路由器,上连广域网与公网IP连接,因此,我们的数据,是先交给家庭路由器,再上交给运营商路由器最后交给广域网的。IP地址,是全球具有唯一代表性的,我们也称公网IP。

2025-08-14 13:21:16 964

空空如也

空空如也

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

TA关注的人

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