- 博客(28)
- 收藏
- 关注
原创 CLion远程调试出现<optimized out>
release模式适用于实际生产环境,debug模式是开发者调试代码时选择的模式。编译器优化-O0通常是和release模式绑定在一起的用于提升程序性能和提升代码的运行速度,禁用编译器优化-O3常和debug模式绑定在一起,方便开发者调试代码。
2025-03-28 17:31:39
318
原创 线程同步机制
线程同步是指在多线程编程中,为了保证多个线程对共享资源的访问不会产生竞争条件(Race Condition)或数据不一致,需要对线程的执行顺序和资源访问进行协调和控制。线程同步的主要目标是确保数据的正确性和程序的稳定性,同时尽可能减少线程之间的等待和阻塞。常用的线程同步机制包括:互斥锁、读写锁、信号量和条件变量。这些机制可以根据应用场景选择使用,以实现线程安全和高效的并发程序。
2025-01-07 16:49:35
695
原创 CLion远程开发
CLion远程开发充分利用了windows书写和调试代码方便,linux运行环境稳定的优点。①Windows 的书写与调试体验优越:强大的 IDE 支持(如 CLion 提供智能补全、代码导航、语法检查等功能),使开发效率更高。图形化界面和键盘快捷键的便捷操作,比直接在终端环境中写代码要更加高效。②Linux 的运行环境稳定:Linux 更加适合软件的实际运行和测试,尤其是系统相关或高性能的程序(如服务器端程序、嵌入式开发等)。
2024-12-31 19:51:31
1309
7
原创 总结-常见缓存替换算法
缓存替换算法是管理缓存空间的一种机制,用于决定当缓存满时哪些数据应该被移除以腾出空间。这些算法基于不同的策略优化缓存性能,适用于不同的场景。
2024-12-27 16:27:22
752
原创 三、LFU缓存
LFU(Least Frequently Used)是一种缓存替换算法,其核心思想是:①优先淘汰使用频率最低的缓存数据。②每次数据被访问时,都会记录其访问次数(即频率),当缓存容量达到上限时,淘汰访问频率最少的缓存项。
2024-12-26 17:24:54
486
原创 二、FIFO缓存
FIFO(First-In-First-Out)缓存 是一种简单的缓存淘汰策略,它基于先进先出的原则来管理数据。当缓存达到容量限制并需要淘汰元素时,最先进入缓存的元素会被移除,以便为新元素腾出空间。FIFO缓存的基本原则是:①数据存储顺序:数据按照进入缓存的顺序排列(通常用队列实现)。最早插入的数据位于队列的前端,最新插入的数据位于队列的尾端。②淘汰策略:当缓存已满,插入新数据时,队列前端的元素(最早插入的元素)被移除。
2024-12-16 20:16:45
1039
原创 一、LRU缓存
LRU是Least Recently Used 的缩写,意为“最近最少使用”。它是一种常见的缓存淘汰策略,用于在缓存容量有限时,决定哪些数据需要被删除以腾出空间。LRU 缓存的基本原则是:①优先保留最近被访问的数据,因为这些数据在近期被再次访问的概率更高。②淘汰最近最少使用的数据,因为它们被再次访问的可能性较小。
2024-12-15 19:34:50
1246
原创 图-遍历(DFS+BFS)
图是数据结构中的另一种数据结构,通常用来表示多对多的关系。在 C++ 中,图通常可以通过邻接表或邻接矩阵表示。特性深度优先遍历(DFS)广度优先遍历(BFS)实现方式使用递归或显式栈使用队列遍历顺序尽可能沿一个分支深入按层次逐步扩展应用场景适合路径搜索、连通性判断适合最短路径、分层搜索时间复杂度O(V+E)O(V+E)空间复杂度O(V)(递归栈)O(V)(队列)总结:DFS 更适合问题规模较小或需要深入搜索的场景(如路径搜索、连通分量)。
2024-12-14 21:00:48
1253
原创 总结-Origin绘图
今天来总结一下前面几天有关Origin绘图的内容:三天下来分别绘制了柱形图、折线图、面积图和这些图形的变体,这些都是笔者在阅读论文时常看到的图像,通过熟练掌握这些图形的绘制我相信大家都能画出好看的科研论文图,接下来我将汇总一下这些图形在Origin里面的数据格式。最后希望大家都能处理好数据并且完美的可视化出来,以后应该会不定期更新有关Origin绘制好看的科研论文图。
2024-12-10 20:06:57
1055
原创 三、Origin绘制面积图
其实今天主要是画百分比堆积面积图。百分比堆积面积图(100% Stacked Area Chart)是一种特殊的堆积面积图,用于展示各部分占整体的比例变化,而不是显示绝对值。面积图是一种用于显示数量随时间变化趋势的图表,通常用来表达不同类别的数量占比或总和变化。它是折线图的扩展,通过对线条以下的区域填充颜色来更直观地表示数据的大小和变化。堆积面积图通过将不同数据系列的面积叠加,展示各系列的相对贡献及总值变化。由于我的数据和原论文的数据略有差异,所以百分比有差距但并不影响图形的绘制。
2024-12-10 16:41:48
862
原创 二、Origin绘制折线图
当需要展示多个变量时,可以使用多折线图。它通过多条线来表示不同变量的变化。这种图就比较简单直观,用于描述两个变量之间的关系。点击细节,我们还可以设置参考线的粗细。
2024-12-09 16:35:09
2123
原创 一、Origin绘制柱状图
OriginPro 2024是由OriginLab公司开发的一款功能强大的数据分析和图表绘制软件。它广泛应用于科学研究、工程、教育等领域,帮助用户进行数据处理、统计分析、图形绘制、报告生成等任务。下载链接。
2024-12-08 18:44:51
5555
原创 Design Tradeoffs for Data Deduplication Performance in Backup Workloads-备份工作负载中重复数据删除性能的设计权衡
重复数据删除已成为现代备份系统中的标准组件。为了了解其每个设计选择(如预取和抽样)的基本权衡,我们将重复数据删除分解为一个大的N维参数空间。空间中的每个点都是各种参数设置,并在备份和恢复性能、内存占用和存储成本之间进行权衡。现有的和潜在的解决方案可以被认为是空间中的特定点。然后,我们提出了一个通用框架来评估空间中的各种重复数据删除解决方案。鉴于所有指标中没有一个解决方案是完美的,我们的目标是找到一些具有持续备份性能的合理解决方案,并在重复数据删除率、内存占用和恢复性能之间进行适当的权衡。
2024-08-02 22:40:13
433
原创 数据去重系统destor中的线程同步
在数据去重系统destor中发现了大量与线程同步有关的内容,为此做个总结。系统源码中实现了一个名为SyncQueue的同步队列数据结构,用于在多线程环境中安全地进行数据传递和队列操作。
2024-05-08 20:33:27
949
2
原创 总结:在分布式存储系统中保障数据的可靠性
随着数据规模的增加,数据中心的节点故障数量急剧增加。为了保障数据的可靠性,大型数据存储企业通常采用3副本的方式对数据进行备份,然而3副本的开销巨大,并不是一种经济的方式。为此最典型的方法是采用纠删码来保证系统的可靠性。
2024-03-30 16:16:18
1768
1
原创 二叉树-二叉搜索树(BST)
一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)左、右子树也分别为二叉排序树。例如:是一棵二叉搜索树。二叉排序树在普通二叉树的基础上引入了有序的概念,并且二叉排序树的中序遍历是有序的,这一性质通常用于判断给定的一棵树是否为二叉排序树。二叉排序树的查找速度通常比链表要快,查找的平均时间复杂度为O(logn)。在二叉排序树的基础上,我们引申出了更多不同概念的树。
2024-02-14 17:05:54
507
1
原创 二叉树-构造二叉树
构造二叉树的过程,如何正确的写出各个子序列的边界是有些困难的,需要在稿纸上认真分析整个过程,确保边界不出错。两种构造方式代码略有不同,对于前序序列的处理,每次递归时都会往后移动一步,因为根结点已经处理过了,避免重复处理。//后移一步后序序列的根结点处理是通过修改后序序列的长度,避免重复处理根结点。//后序遍历序列减1。
2024-02-05 17:42:06
1049
1
原创 二叉树-平衡二叉树
平衡二叉树是指空树或者任意结点左右两颗子树的高度差的绝对值不超过1。例如:图1:图2:图1是一颗平衡二叉树,图2则不是。本文采用了两种方法实现了判断是否为平衡二叉树。从效率上来看递归的方法会更高效以及简洁,非递归的方法会更方便我们理解解题的过程。
2024-02-02 17:42:11
533
1
原创 二叉树-遍历(递归+非递归)
对于二叉树的常见遍历方式不管是递归还是非递归方式我们都应该掌握。最后,我们也可以把二叉树推广到n叉树实现n叉树的前序、后序和层序遍历,不管递归还是非递归思路都是一样的。有同学可能要问为什么没有n叉树的中序遍历,因为对于n叉树而言我们并不知道哪些孩子是左孩子哪些是右孩子,也没这种说法,因此没有中序遍历。
2024-02-01 18:29:48
744
1
原创 栈-最小栈
注意:**最小栈中存放的元素不光是全局最小值,而是局部最小值,当然全局最小的值也存放在里面。**当全局最小出栈后,次小值作为最小值。我们可以采用两个栈来解决该问题,一个是保存数据的栈,一个是保存最小元素的栈。从这里可以看出,当最小值入栈前,次小值,次次小值都入栈了。
2024-01-26 22:34:30
468
1
原创 栈-逆波兰表达式求值
扫描tokens数组,如果是数字则放入栈中,如果是运算符,则从栈中取出两个操作数,并将运算结果放入栈中,最终栈中存入的数则是运算结果。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。
2024-01-25 22:31:59
485
原创 栈-有效的括号
如果栈顶的右括号和遍历的右括号一致,则出栈。遍历结束后如果栈为空,则说明括号都是有效的。本题时间复杂度为O(n)。显然,我们可以通过一个栈来模拟一下括号的匹配过程。相对来说第一种方法会更好理解和有条理一些。( ( { [ ] } )( { [ ] } } )先思考一下有哪些不合法的情况。这里采用的办法是遍历字符串时。
2024-01-24 22:26:56
490
1
原创 双指针-四数之和
则会漏解比如nums为(-2,-1,0,0,1,2),target为0,会漏掉解(-2,0,0,2)。因为判断0和后面的0相同时会跳过前一个0,导致出错。为了达到更好的测试效果,也可以进行一些剪枝操作,提前跳出循环。先排序,后边去重边移动指针。部分代码参考来自此链接。
2024-01-23 16:43:15
515
1
原创 双指针-重排链表
结果分析:通过快慢指针、链表逆置和头插法这三个基本操作使本题的时间复杂度达到了O(n)之所以这里强调结点2指向结点3是因为和后面头插法的判断语句有关,不然容易出错。通过代码调试和手动模拟发现出现上面的错误是因为。①使用快慢指针找到链表的中心位置。②逆置后半段的链表。③使用头插法重排链表。这部分代码如果写成了。
2024-01-22 18:31:13
559
1
原创 双指针-链表相交
因此我们可以先计算两个链表的长度,然后用一个指针遍历较长的那条链表,遍历步数为两个链表的差值,再开始比较,如果当前节点不相同,则两链表指针同时向后遍历。结果分析:通过观察题目,使用双指针使时间复杂度达到O(m+n),先用一个指针遍历较长的链表,然后两个指针同时遍历。解题思路:题目求两个链表是否有交点,一般思路就是一个一个比较,虽然可以得出结果但是时间复杂度偏高,观察可以得知。
2024-01-21 18:05:11
922
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人