- 博客(34)
- 收藏
- 关注
原创 高优先线程
因此,我有考虑到把cpu的核心进行分散开来,就类似于分而治之,负载均衡的一种手段,而且这种方法还需要提高工作线程的优先级。你开发的时候有么有遇到过一个问题:服务器的一个服务线程过几个小时断连一次,断连之后会马上重连这种情况。2.实例化优先线程,并给定你要绑定的核心,如果给定的核心超过cpu的核心,就会放在核心为0上的,然后执行创建优先线程函数就可以啦。1.你需要明确你所要执行的线程函数的逻辑,并写出来,我用我写的例子作为一个demo。下面介绍一下,我自己写的一个优先线程类的:很简单,但能使用,请大家指点!
2024-07-01 21:56:37
227
原创 高性能全局内存池
缺乏垃圾回收机制的问题: C++没有内置的垃圾回收机制,因此手动管理内存是必要的。内存池可以帮助避免因忘记释放内存而导致的内存泄漏问题,通过集中管理内存的生命周期来减少这类风险。内存碎片化和效率问题: 频繁地使用内存分配器可能会导致系统内存的碎片化,降低内存使用效率。内存池可以通过固定大小的内存块管理来减少碎片化,从而提高内存利用率和整体性能。使用智能指针的考虑: 对于不需要频繁调用的资源,智能指针可以是一个更简单和安全的选择,因为它们可以自动管理内存的生命周期,避免手动的内存管理错误。
2024-07-01 16:37:46
633
原创 linux的信号量的使用
在多线程情况下,线程要进入关键代码就得获取信号量(钥匙){sem_init(&sem, 0, 0);},没有信号量的情况下就一直等待sem_wait(&sem),只到别人把钥匙(sem_post(&sem))给你。这个函数会一直阻塞在那,直到别人释放钥匙(信号量),才能让代码往下执行。这个是创建一把钥匙,钥匙名字为了sem。这个就是把钥匙给一个别人。以下是一个代码demo。以下是程序运行的结果。
2024-05-07 15:22:15
442
原创 分发糖果——使用贪心算法
但是,看了解析了才明白,贪心在先从前往后,然后在从后往前。1.当前孩子的评分与前一个孩子的评分比较,以确定是否应该增加当前孩子的糖果数量。2.当前孩子的评分与后一个孩子的评分比较,以确定是否应该增加当前孩子的糖果数量。你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。你可以分别给第一个、第二个、第三个孩子分发 1、2、1 颗糖果。第三个孩子只得到 1 颗糖果,这满足题面中的两个条件。请你给每个孩子分发糖果,计算并返回需要准备的。因此,先从前往后,然后在从后往前看。表示每个孩子的评分。
2024-04-22 22:06:53
492
原创 跳跃算法二
这个是每次都进行迭代,他是0,1,2,3,4然后记录当前可走的最大位置,当遇到当前的位置遇到下一个最大的位置之后就进行跳跃(count+1),因为这样count会进行记录跳跃次数,但是,他还是进行迭代的!这样用一个for循环就可以做到了!这个就是贪心算法的,每次都是找最优的!从下标为 0 跳到下标为 1 的位置,跳。向前跳转的最大长度。生成的测试用例可以到达。跳到最后一个位置的最小跳跃数是。步到达数组的最后一个位置。处,你可以跳转到任意。
2024-04-17 22:30:19
392
原创 贪心算法-跳跃游戏
贪心在每次都要最多,注意看for循环代表了当前cout能走的最大路径,count代表了最多能走多少!如果是那样的话,对于第二个测试案例count的值输出就为3338!而如果换成count为最大值,则可以代表这样数组能遍历到哪,这个就是他贪心的地方,每次都要拿最大,看看能不能到达条件!但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。判断你是否能够到达最后一个下标,如果可以,返回。
2024-04-17 22:02:15
1338
原创 贪心算法--购买股票
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0。
2024-04-16 22:49:03
263
原创 贪心算法-分发饼干
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。,这是能让孩子们满足胃口的饼干的最小尺寸;你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。回溯我还不太理解,这个是贪心算法!你拥有的饼干数量和尺寸都足以让所有孩子满足。,我们可以将这个饼干。
2024-04-10 20:09:15
614
原创 组合问题————3
//这一步很重要,因为这个可以预防不要做无必要的遍历,而且这个条件很重要,因为这个条件没有的话,还会导致栈溢出,因为不及时退出去,浪费太多空间了。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。注意 2 可以使用多次。如果至少一个数字的被选数量不同,则两种组合是不同的。7 也是一个候选, 7 = 7。,并以列表形式返回。中可以使数字和为目标数。对于给定的输入,保证和为。
2024-04-03 21:48:15
339
原创 VScode连接服务器
ssh root@ip -p 端口号。1.插件下载 remote ssh。5.再次点进电脑连接就好啦。3.输入用户名和密码。4.重启vscode。
2024-04-03 14:38:23
430
原创 !!! WARNING The following tests failed:*** [err]: Client output buffer hard limit is enforced in
最后还是报[err]: pending querybuf: check size of pending_querybuf after set a big value in tests/unit/pendingquerybuf.tcl。开始我也不知道怎么办,然后我看报错的位置,进入了那个tcl中,然后obuf-limits.tcl,我修改了一下这个文件夹中的那个范围参数!然后我今日tests/unit/pendingquerybuf.tcl,修改测试文件的参数就可以啦!
2024-03-29 15:35:15
283
原创 Mysql连接报错:1130-host ... is not allowed to connect to this MySql server如何处理
我用navicat连接我的阿里云服务器的mysql服务器的时候,出现了1130的报错。(mysql Server version: 5.7.42-0ubuntu0.18.04.1 (Ubuntu))3.输入 SELECT Host, User, authentication_string FROM mysql.user;6.当我还想远程连接的时候,出现了新错误,说明权限不够,我又去查了阅读了一下资料。1.首先进入mysql -u root -p, mysql客户端。我来记录一下这个原因,以及修改过程!
2024-03-29 14:39:27
612
原创 修剪二叉树
改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。说明了左边的已经是比low小了已经不需要了,只需要遍历右边就可以了。说明了右边已经比high大了已经不需要进行递归了,可以剪掉了。通过修剪二叉搜索树,使得所有节点的值在。给你二叉搜索树的根节点。
2024-03-29 12:29:40
283
原创 删除二叉搜索树的节点
nullptr){ //这个不能是node == nullptr,而且node->left!这个是letcode的一道中等题目,主要还是二叉搜索树,注意二叉搜索树是知道顺序的,因此当知道有值查询的那种情况,就已经知道这是查询左子树还是右子树了。对应的节点,并保证二叉搜索树的性质不变。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。另一个正确答案是 [5,2,6,null,4,null,7]。
2024-03-29 12:11:27
527
1
原创 二叉树的公共祖先问题
所以当我们从上向下去递归遍历,第一次遇到 cur节点是数值在[q, p]区间中,那么cur就是 q和p的最近公共祖先。// 进入递归的是root->left,返回的也是root->left,因此当满足条件是返回root。中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(//这两个打破递归循环的逻辑,也就是函数的出口。以上是普通二叉树的?
2024-03-28 16:06:49
811
原创 搜索二叉树的众树(认识emplace_back)
/这一步想不出来,但是没有的话,我知道缺了一点东西。}else if(cur->val == pre->val){ //当pre的值和cur的值相等时,count +1。更高效,因为它避免了复制或移动临时对象的开销,并允许你通过直接参数构造新的元素。遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。搜索二叉树是有序的,如果按中序遍历,他就是一个有序的数组!这样去思考就可以了!push_back(),他是把x的副本存到容器中来的,所以效率会慢很多。
2024-03-28 11:59:42
1731
原创 验证二叉搜索树
/ 因为后台测试数据中有int最小值 bool isValidBST(TreeNode* root) { if (root == NULL) return true;(1)利用中序遍历二叉树,遍历结果放进数组里面,然后用for循环厕所num[i]<num[i+1]!这样就是一个很好的思路!这个情况也要进行单纯的根节点大于左节点,小于右节点就会出现错误!导致我写出以下的代码!导致写出来的代码有错误!根节点的值是 5 ,但是右子节点的值是 4。,判断其是否是一个有效的二叉搜索树。给你一个二叉树的根节点。
2024-03-27 12:45:52
980
原创 合并两颗树
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;// } 这是错误的写法,是我一开始这样写的,这样会遗漏两边都为空节点的情况!null 的节点将直接作为新二叉树的节点。合并过程必须从两个树的根节点开始。// 递归合并右子树。返回合并后的二叉树。以下是更巧妙的做法!
2024-03-27 12:08:26
483
原创 路径总和-回溯法
/回溯的数组需要是全局,不然会导致每次的数组进行再一次初始化,导致错误,因此在递归里面,做逻辑的那个值是全局性很重要,这个很值得去思考!if(root->left==nullptr&&root->right==nullptr) { //中。我在这道题目里面考虑的是用回溯的方法,用数组总和和targetnum进行比较!不存在 sum = 5 的根节点到叶子节点的路径。由于树是空的,所以不存在根节点到叶子节点的路径。的路径,这条路径上所有节点值相加等于目标和。等于目标和的根节点到叶节点路径如上图所示。
2024-03-23 14:49:22
1015
1
原创 找到最深的一层的最左边的一个节点的值
记录第一个元素就好了,因为跳出去的循环是最后一层,因此,最后一个的他值就没有被改变了!这是我一开始没有想到的。// 记录最后一行第一个元素,注意这个我一开始没想到这样。这道题是最深一层的最左边的值!而不是最左边的节点值!因此,第一时间应该想到的是层序遍历!假设二叉树中至少有一个节点。
2024-03-23 14:21:34
388
1
原创 二叉树的左子树之和
函数声明为void get_left_value(TreeNode* root, int& k);这样就可以传入的是变量名K,但也能够是引用修改值!忘了一个C++语法,get_left_value(root,k);在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。,返回所有左叶子之和。
2024-03-23 13:35:45
419
1
原创 二叉树的所有路径
if(root->left == nullptr && root->right==nullptr){ //终止条件,单层遍历的逻辑,第一次终止 //int_path为 [1,2,5],把他装入 path中,结束就到了下一步。// //int_path为 [1,2],因为这个是上个逻辑,5的那个节点,下一句语句就进行了回溯。注意这个树的输出是["1->2->5","1->3"],则对应于中左右,因此,这是前序遍历!上面红色1,2,3为递归顺序,执行步骤已经在上面讲清楚,
2024-03-22 17:04:14
786
1
原创 一道平衡二叉树的求解
最近在看二叉树的算法,我觉得有点迷迷糊糊,就是那种一看就会,一写就费。我有点很奇怪的感觉,就感觉二叉树的很多问题,其实在于一步一步的遍历(或者称为迭代,或者是递归方法),然后在遍历的基础上进行逻辑(业务)操作。还记得二叉树就是在递归(遍历)的基础上进行业务操作,重要的事情讲三遍!遍历类型有:前序,中序,后序,层次。具体的遍历顺序看具体的场景。算法解析:二叉树就是在递归(遍历)的基础上进行业务操作。一. 确定函数参数,确定函数的返回值类型。一:确定函数参数,确定函数的返回值类型。三.确定单层遍历的逻辑。
2024-03-22 13:30:35
1683
1
原创 LRU缓存数据结构的设计
/ 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}std::cout << cache.get(1) << std::endl;// 缓存是 {1=1, 2=2}
2024-03-04 14:10:18
862
1
原创 Redis安装在ubantu 18.04
1.使用sudo apt-get install redis-server命令安装redis按Y就可以继续安装完了,等待安装结束2.安装结束后,redis就会运行,我们可以使用service redis status查看一下,就会在后台启动。
2023-11-25 12:48:26
394
原创 链表的刷题心得
leetcode 24题看了别人写的天才递归写法,我看不懂,但我大受震撼!以下是我自己写的一个普通人的写法/*** };int k=0;k=swa->val;swa1=swa;i++;return a;思想是双指针,一前一后,偶数就交换,否则就先前走的简单思想。
2023-11-15 21:42:29
47
原创 C++ 螺旋矩阵 II
这个的重点是掌握对数组代码的操作能力,不在于算法。破解这个方法是,重点找到起始的那一个位置进行遍历。// offset 控制每一圈里每一条边遍历的长度。所有元素,且元素按顺时针顺序螺旋排列的。
2023-11-01 11:31:59
151
1
原创 C++滑动窗口——经典算法
滑动窗口也是一个典型的找特定条件的一个数组的最小数组。那么初始的值可以定为i=0,而开始滑动之后的窗口的起始值就显得很重要,这个是窗口滑动的精髓,而结尾则可以用判断特定条件的打破作为结束点。讲了这么久,窗口是什么?窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。尤其要注意判断子数组的长度, sublen=j-i+1;长度要+1.因为数组下标比实际少一位,这一点要注意一下。
2023-10-30 21:52:02
166
原创 数组问题的总结
数组是在内存里面连续排序的一块内存,内容是相同数据类型的集合,并且下标从0开始,连续递增。因此,在对数组元素进行删除,修改的时候,需要移动部分的其他元素的地址。在C++中,vector的实现是array,但vector是容器,而不是数组。
2023-10-20 12:14:51
46
1
原创 c/c++在面对粘包和分包问题的时候的解决方案(简单思路)
/先发送包表示和长度,此时buf为FBFE。if(strncmp(buf,TAG,tag_len)==0){ //先判断第一次的buf是否符合。b)接收端:先解析本次数据包的大小N,再读取N个字节,这N个字节就是一个完整的数据内容。//发送数据内容,为输入的值,在memcpy这一步进行了操作,内存赋值。a)发送端:先发送包表示和长度,再发送数据内容。
2023-10-08 11:37:44
228
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人