自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程的生命周期之线程通信

那么当这本书被一位同学借走时,程序就应当阻止其它线程的访问,因此借书就是多线程访问一个共享资源的方法,必须加同步锁,其它线程抢占不到资源会进入阻塞状态。这其实就是线程间通信的典型例子。线程间通信常用的方法有 wait()、notify()、notifyAll() 等。请注意,在使用 wait() 和 notify() 方法时,必须在同步块内部调用它们,否则会抛出 IllegalMonitorStateException 异常。此外,线程在调用 wait() 方法时会释放锁,直到被唤醒后才会重新获得锁。

2026-06-10 21:26:16 30

原创 一键搞定高效排版!InDesign 2026最新版本下载与安装教程

深度兼容Photoshop(置入PSD保留图层)、Illustrator(置入AI保留矢量)、Acrobat(审阅批注)、Adobe Fonts(云字体同步)及 Adobe Express(跨平台协作)。

2026-06-10 16:32:50 266

原创 实现Runnable接口来创建线程

在这个代码中,我们首先创建了一个实现了 Runnable 接口的类 MyRunnable ,然后在类中实现了 run() 方法,并在 run() 方法中编写了多线程任务代码。最后,我们调用 start () 方法启动这两个线程,实现了多线程执行任务的效果。如你所知,多线程的实现方法主要有三种,一种是通过继承 Thread 类来创建线程,一种是通过实现 Runnable 接口来创建线程,其中,的方法比继承 Thread 类的方法更灵活,因为一个类只能继承一个父类,而实现接口可以实现多继承。

2026-06-09 08:57:39 258

原创 干货分享——认识多线程

多线程的优点包括提高程序的并发性和效率,可以实现异步处理,提高程序的响应速度和用户体验。在单线程的程序中,只有一个执行流程,只能执行一个任务,无法同时处理多个任务。而多线程程序中,可以同时执行多个任务,不同的线程可以同时读写不同的数据,从而避免了线程之间的阻塞等待,提高了程序的效率和响应速度。多线程是指在一个程序中同时运行多个线程,每个线程都是独立的执行流程,可以在同一时间内执行不同的任务,从而提高程序的并发性和效率。不得不说,我们平常写的大部分程序都是单线程,但是单线程的程序往往功能非常有限,

2026-06-08 18:15:55 216

原创 模拟退火算法的实例应用

这里面的 neighbor() 函数用来产生当前解附近的解,因为解空间是连续的,所以当前解附近必定有离最优解更近的解,我们只需要找到个这个解并继续做迭代即可。那么迭代的停止条件是什么呢?假如地图中只存在一个最优解,那么迭代的结果必然是让当前解无限的接近最优解,所以只需要设置一个阈值,并判断当前迭代步长是否小于该阈值即可(这里可以选择一个比题目中要求的误差更小的值作为阈值)。因为解的类型是小数,所以解空间的边界是连续的,可以进一步猜测该问题是凸优化问题,我们可以尝试使用爬山算法来寻找最优解。

2026-06-08 12:37:23 307

原创 机器学习之精确率和召回率的关系

不同的阈值会导致分类结果的变化,当阈值较低时,模型更容易将样本判定为正例,这可能会提高召回率,但精确率可能会降低。相反,当阈值较高时,模型更谨慎地将样本判定为正例,这可能会提高精确率,但召回率可能会降低。精确率的目标是尽可能地减少将负样本错误的预测为正样本的情况,即减少**假阳性**的数量。在疾病预测的例子中,精确率表示模型能够将样本正确预测为患病的能力。F1 分数的取值范围为 0 到 1,其中分数较高的情况表示模型能够同时取得较高的精确率和召回率,即模型能够在保持准确性的同时捕捉到更多的真实正例。

2026-06-07 15:47:50 279

原创 机器学习任务二分类的应用案例

如下图,假设一共有 100 个样本,其中 90 个是正常未患病的人,10 个是患病的人,现在模型预测出 12 个患病的人,88 个未患病的人。是一个常见的机器学习任务,有许多指标来衡量二分类模型的性能,本文将从疾病预测的场景开始,分别介绍二分类的基础指标和综合指标,并进行对比。预测患病的人中,8 人真正患病(真阳性),4 人并未患病(假阳性)。预测未患病的人中,86 人未患病(真阴性),4 人患病(假阴性)。二分类就是把数据非此即彼地分成两类的任务‌,结果只有两种可能,比如判断邮件是不是垃圾。

2026-06-07 10:42:23 184

原创 分布式锁的可用性与切换效率探讨

当进程持有的锁需要被重新调度时,持有者可以主动删除锁节点,但当持有者发生异常(如进程重启,机器宕机等),新的进程要重新抢占,就需要等待原先的会话过期后,才有机会抢占成功。我们也曾经遇到过该类场景,因为机器 load 高,硬件问题等原因,设备上的进程假死但其中仍存在部分线程在工作,比如锁的心跳维护线程依然正常运行,这样锁节点仍然是被假死进程占据着,且无法被其他进程抢占。当用户需要将发生假死的进程持有的锁释放时,可以通过查询会话信息,并将会话加黑,此后,心跳将不能正常维护,最终导致会话过期,锁节点被安全释放。

2026-06-06 21:56:29 333

原创 干货分享——分布式锁的典型案例

因为涉及到数据一致性,无论是 Master 之间的分布式锁实现 HA ,还是不同的 manager 对 sourcer 的访问控制,这里对于分布式锁的需求就是绝对互斥性是第一位的。大多数情况下都希望这两类操作在同一时间段最多只有一个,从而保证库存数据不会错乱,这是个典型的追求“效率提升”的分布式锁应用场景。无论是 Master 选主,还是 manager 的 sourcer 互斥,均需要常驻分布式锁,这里的一个技术选型是自研的 Paxos 协议,还是依赖三方的分布式一致性系统。

2026-06-06 11:20:23 232

原创 干货分享|C++运算符重载知识点

C++ 支持类型的重载,使得外部在调用对象的时候能够在某些情况下达到使用类似目标类型的效果。使用静态对象可以减少临时对象的生成,但是提升效率的同时往往会造成许多意想不到的问题。分别对应拷贝赋值和移动赋值。请同时出现让外部人员认为行为的一致。一般对应左右值重载的情况不多,此处以 const 重载为例。就像是在工厂模式中一样,有构造工厂的同时要提供析构工厂。C++ 非常重要的两个构造,拷贝构造和移动构造。

2026-06-05 21:30:39 137

原创 Lightroom Classic v15.0安装与下载教程|专业摄影修图软件详解

从事摄影行业、或是在影楼工作的小伙伴,想必对它不会感到陌生。是一款专为桌面端设计的专业照片管理与后期处理软件工具,主打非破坏性编辑、本地文件管理和强大工作流控制,面向摄影师和进阶摄影爱好者。‌‌目前最新已推出Lightroom v15.0即2026版本,深受摄影爱好者与修图使用者的青睐与好评。接下来,小编将‌定位与核心特点、核心功能与特点学习、安装包资源获取 、LR保姆级安装教程等几个方面带大家来了解和熟悉这款超实用的修图工具,希望对大家的学习、工作有所帮助!

2026-06-05 12:29:16 1454

原创 算法竞赛专题篇——并查集

3.合并操作(Union):将两个不相交的集合合并成一个新的集合。首先通过查找操作找到两个元素所属的集合代表,然后将其中一个代表元素的父节点指向另一个代表元素。并查集的优化 基于秩(Rank)的优化:通过记录每个集合根节点的秩(即树高),将较矮的树连接到较高的树上,以减小整体树高,提高查找效率。在并查集中,每个元素都有一个代表元素,代表元素可以唯一标识一个分组。否则,它们属于不同的分组。通过递归或迭代方式,从当前元素开始沿着父节点链向上寻找直到找到根节点,并将路径上所有节点指向根节点,以便加速后续查询。

2026-06-04 17:49:24 181

原创 C语言使用哈希表的基本配置

在标准C语言中,并没有哈希表这种数据结构。因此各大大佬开源了自己的实现方式。注意,增删的操作后会改变原hashtable的结构,因此需要传入原对象。而具体的操作,是先定义一个结构体指针,并初始为NULL。然后非常重要一点,我们需要手动编写自己的哈希节点的数据结构。是怎么设计的,可以得知这个句柄内部对前后和健值做了指向。然后只要在我们需要用的地方include即可。下面以介绍记录整形数据int为键的具体使用。其中比较有名的就是本文要介绍的,内置的宏函数进行操作。

2026-06-04 08:55:59 244

原创 经典算法题之摘樱桃(二)

取这四种情况的最大值,加上 grid[x1][k−x1] 和 grid[x2][k−x2] 的值,就得到了 f[k][x1][x2] ,如果 x1 = x2 ,则只需加上 grid[x1][k−x1] 最后答案为 max⁡(f[2n−2][n−1][n−1] , 0),取 max⁡ 是因为路径可能被荆棘挡住,无法从 (0 , 0) 到达 (N−1 , N−1)。如果 (x1 , k−x1) 或 (x2 , k−x2)是荆棘,则 f[k][x1][x2] = −∞f ,表示不合法的情况。

2026-06-03 15:21:20 281

原创 经典算法题之摘樱桃(一)

【代码】经典算法题之摘樱桃(一)

2026-06-03 10:45:11 300

原创 SFINAE从cpp11到cpp20的核心技巧

替换失败不是错误” ( Substitution Failure Is Not An Error ) 在函数模板的重载决议中会应用此规则:当模板形参在替换成显式指定的类型或推导出的类型失败时,从重载集中丢弃这个特化,而非导致编译失败。根据这一特点,可以对模板的展开进行限制。进行匹配时,让其展开失败(注意,此时的匹配失败不会导致编译的失败),从而再去寻找其他的重载函数。该库是模板编程中最重要核心的库之一,若缺少本库就不会有如此丰富强大的泛型编程的实现。此模板可以说是 SFINA 的灵魂一般的存在。

2026-06-02 12:42:16 322

原创 模板实现的一个庞大工具库——STL

对于传入迭代器这种构造方式,我们可以只用模板来实现,因为我们并不能方便的写出各种情况下具体迭代器的数据类型。目前为止一切都是理想状态,但是当我们把测试的数据类型改为 int呢?显然这个情况并不是我们希望发生的。我们惊讶的发现,居然都调用了为我们为迭代器服务的构造方法。仔细回归代码发现,确实应该打印两份Iter的版本。上文提出,STL 就是用模板实现的一个庞大工具库。更是大家最常用的stl的容器之一。

2026-06-02 09:02:12 330

原创 如何解决缺少特定算法思维的问题?

即尝试所有可能的连续子序列,计算它们的和,然后找到最大的和;但暴力法存在一个很大的问题,就是它的时间复杂度较高,为 O(n²) ,很明显这不是最有效解决方法!它也不是题目考察的重点,题目真正想考察的是动态规划,是一种很常见的算法思维模型。此时又产生了新的疑问,怎么知道它考的是动态规划这个算法思维模型呢?前文中提到此题是考察动态规划的,但又是如何分辨出此题是考察动态规划的呢?其实,这跟对题目的理解程度有关,需要学会。一般来说,面对一道算法题,首先我们先需要对题目进行拆解,寻找到解题思路。

2026-06-01 09:03:12 232

原创 递归与迭代的形式实现

通过递归实现的算法占用的空间较大,因为在递归过程中,运行时栈不仅仅需要保存局部变量,还需要保存返回地址、函数参数等其他的函数运行时信息,这也是递归深度最大只能达到。常规函数引用的运行时栈的空间远小于函数内直接引用的内存空间,而在递归函数中使用的运行时栈的空间与函数内直接引用内存空间相差不大,所以计算递归函数的空间复杂度时需要考虑到运行时栈的空间。也是不同的,将两种解法分别提交,可以发现,第二种解法占用的空间总是小于第一种解法占用的空间,这个区别在这个题目中表现的可能不太明显,因为在这个题目中。

2026-05-31 18:13:26 210

原创 康威尔生命游戏规则介绍与学习

生命游戏的规则非常简单: 给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的,其中细胞的出生和死亡是同时发生的。下面的 Python 实现可能不是最简洁的,因为在计算格子边界的地方加了很多条件判断,但整个算法实现下来也只需要约 30 行代码就可以搞定了。顾名思义,康威尔生命游戏是由数学家约翰·康威在 1970 年发明的一个小游戏,它也被称为细胞自动机,在计算机领域几乎算得上家喻户晓了。

2026-05-31 08:31:10 222

原创 遍历s ,并用一个栈来表示括号的深度。

遇到 ‘(’ 则将字符入栈,遇到 ‘)’ 则将栈顶字符出栈。栈从空到下一次空的过程,则是扫描了一个原语的过程。一个原语中,首字符和尾字符应该舍去,其他字符需放入结果字符串中。因此,在遇到 ‘(’ 并将字符入栈后,如果栈的深度为 1 ,则不把字符放入结果;在遇到 ‘)’ 并将栈顶字符出栈后,如果栈为空,则不把字符放入结果。空间复杂度:O(n),其中 n 是输入 s 的长度。需要使用栈,长度最大为 O(n)。时间复杂度:O(n),其中 n 是输入 s 的长度。代码对流程进行了部分优化,减少了判断语句。

2026-05-30 16:55:46 254

原创 排版利器 | LaTex安装教程及全流程下载步骤指南

对于常常和论文、文献、排版等工作打交道小伙伴来说,应该不会感到陌生。LaTeX是一种基于 TeX的高质量文档排版系统,专为科技与数学文献设计,采用“代码驱动排版”而非所见即所得(WYSIWYG)方式,为使用者带来极大的便利。接下来,小编将从典型结构、核心功能与特点学习、安装包资源获取 、LaTex保姆级安装教程等几个方面带大家来了解和熟悉这款超实用的排版工具,希望对大家的学习、工作有所帮助!

2026-05-30 11:00:19 503

原创 用于事件驱动系统的WebSocket

http://Socket.IO 是一个框架,在原始 WebSocket 之上提供功能,例如回退支持、自动重新连接和发布/订阅消息传递(房间)。一种常见的方法是将 http://Socket.IO 与 Redis 发布/订阅相结合,在不同的进程或服务器中运行多个 http://Socket.IO 实例,并在节点之间传递事件。但是,仍有一些限制需要克服,例如缺少消息排序、本机安全性有限以及单区域设计,这使得大规模将用于生产就绪系统变得具有挑战性。一般来说,有几种途径可以将。功能集成到技术堆栈中。

2026-05-29 17:04:24 261

原创 WebSocket常见的实时用户体验

它最近推出的实时更新表明,它们在与其他在线社区(如Facebook)的竞争中具有战略重要性。Reddit应用程序用户现在可以在发生时看到其他Redditor的活动,例如Redditor阅读同一帖子或输入回复时的动画和指示器,以及其他实时功能。其他用途包括民意调查、测验和问答环节,例如,在 Twitch 流上,参与者与他们的直播主持人互动。参与者通过一个简短的URL进行在线投票,他们的回答是实时可视化的,并显示在直播中。许多人会熟悉实时体验,其中实时数据从一个方向(从源到用户)交付,以响应内容或数据的变化。

2026-05-29 14:01:47 51

原创 经典算法题之我能赢吗(二)

方法一:记忆化搜索 + 状态压缩思路和算法考虑边界情况,当所有数字选完仍无法到达 desiredTotal 时,两人都无法获胜,返回 false。当所有数字的和大于等于 desiredTotal 时,其中一方能获得胜利,需要通过搜索来判断获胜方。在游戏中途,假设已经被使用的数字的集合为 usedNumbers ,这些数字的和为 currentTotal。当某方行动时,如果他能在未选择的数字中选出一个 i ,使得 i+currentTotal ≥ desiredTotal ,则他能获胜。

2026-05-28 21:47:14 183

原创 经典算法题之我能赢吗(一)

给定两个整数 maxChoosableInteger (整数池中可选择的最大数)和 desiredTotal(累计和),若先出手的玩家是否能稳赢则返回 true ,否则返回 false。在 " 100 game " 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过 100 的玩家,即为胜者。当然了,大家也可以评论区留言一起探讨哦!例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。

2026-05-28 15:05:22 121

原创 经典算法题型之最大三角形面积(二)

关于求解三角形面积的公式可以参考百度百科「三角形面积公式」。我们可以枚举所有的三角形,然后计算三角形的面积并找出最大的三角形面积。上篇文章与大家一起看了题目介绍,并留了独立思考的时间给大家。

2026-05-27 13:40:29 99

原创 经典算法题型之最大三角形面积(一)

给你一个由 X-Y 平面上的点组成的数组 points ,其中 points [i] = [xi, yi]。从其中取任意三个不同的点组成三角形,返回能组成的最大三角形的面积。与真实值误差在 10*-5 内的答案将会视为正确答案。我们先把题目抛出来,留一点时间给大家独立思考,下篇文章将与大家一起分享解决方案,敬请关注哦。当然,有问题的同学,欢迎评论区留言~

2026-05-27 08:49:11 28

原创 干货分享|图论的常见存储方式之邻接表

在存储中,根据需要不断添加,不会存在多余空间。因此在遍历时也可以保证这是必然村子的边。以第一维度作为出度的点。每个数据结构的单元作为动态数组或链表的头部,进行延申存储。// u出度点,v入度点,w权值。

2026-05-26 21:11:58 104

原创 单例模式在C++中的使用:原子操作

在《Effective C++》一书中提到:任何一种 non-const static 对象,不论它是 local 还是 non-local,在多线程环境下“等待某事发生”都会有麻烦。处理这个麻烦的一种做法是:在程序的单线程启动阶段,手工调用所有 reference-returning 函数,这可能消除与初始化有关的“竞速形式”。在 C++11 中将原子操作纳入了标准,我们可以通过标准提供的原子操作来处理该问题。在 C++11 中保证了会以线程安全的方式初始化一个静态局部变量,因此可以放心使用。

2026-05-26 11:41:05 36

原创 绘图工具 | Origin 2025b全流程下载及安装步骤实录

Origin在物理、化学、材料、生物、工程等学科的实验数据处理与‌出版级图表绘制‌,强调“操作-数据-图表”联动,便于科研复现方面应用广泛。

2026-05-25 16:11:37 1690

原创 C++的单例模式及其作用

都扮演着至关重要的角色。它不仅能够确保一个类只有一个实例存在,还能够提供全局访问点,使得我们可以方便地在程序的任何地方使用该实例。注意:设计模式虽然是理论概念上的内容,但最终的落实是以 code 的形式。‌自己创建‌:类自己负责生这个对象,不让外面随便用 new 关键字,构造函数通常私有。‌全局访问‌:有个统一入口能拿到这个对象,哪里需要哪里拿,不用到处传。‌唯一实例‌:整个系统里这个类只活一个对象,不会重复创建,保证数据一致性。单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。

2026-05-25 08:40:09 196

原创 线段树入门:算法分析

采用了分而治之的策略,其点更新、区间更新、区间查询都可以在 时间内完成。树状数组和线段树都用于解决频繁修改和查询的问题,树状数组比线段树更节省空间、代码简单易懂,但是先单数用途更广、更加灵活,凡是可以使用树状数组的问题都可以用线段树来解决。本题是经典的线段树模板题,只需要根据之前的线段树模板稍作修改即可 (将区间最值查询改为区间求和)。线段树的题目并不是一成不变的,对于不同的题目,你可能需要修改线段树的模板,来实现各种功能。// 返回 1 + 3 + 5 = 9。// 返回 1 + 2 + 5 = 8。

2026-05-24 17:20:57 186

原创 线段树入门:查询与更新操作

如果当前节点表示的区间与查询区间完全重叠,则返回当前节点存储的信息。如果当前节点表示的区间与查询区间没有重叠,则返回一个特殊值,表示没有找到符合条件的元素。如果当前节点表示的区间与查询区间部分重叠,则判断是在左子树中查询还是在右子树中查询,并继续向下遍历左/右子树。从根节点开始向下遍历线段树,找到需要修改的叶节点,然后更新该节点存储的元素值,同时需要更新所有祖先节点的信息。(2)若是非叶子节点,则判断是在左子树中更新还是在右子树中更新。(1)若是叶子节点,满足 且 ,则修改该节点的最值为。

2026-05-24 09:24:20 38

原创 桥接设计模式的案例实现

根据前面的定义,如果我们使用桥接模式,我们可以将汽车的类型和颜色分别作为两个独立的维度来处理。我们可以创建两个抽象类 Car 和 Color,并为每种汽车类型和颜色创建具体的子类。然后,我们可以使用桥接模式将汽车类型和颜色。通过使用桥接模式,我们可以轻松地添加新的汽车类型和颜色,而不需要修改已有的代码。例如,我们可以添加 truck 类来表示卡车,并且可以在。的情况下,将卡车与任何颜色。

2026-05-23 20:48:10 76

原创 一文读懂什么是桥接设计模式

这里要引入一个新的设计模式 - 桥接模式,桥接模式是一种将抽象部分与实现部分分离的模式。根据网上资料记载:桥接模式最早是由软件工程师和作者 GoF(Gang of Four)提出的,他们在 1994 年的著作《设计模式:可复用面向对象软件的基础》中首次介绍了这一模式。这本书成为了设计模式领域的经典之作,并且对后来的软件开发产生了深远的影响。桥接模式也成为了 GoF 设计模式中的一种重要模式之一。

2026-05-23 09:49:41 38

原创 栈的经典应用——表达式求值

栈stack,是最常见的一种线性的数据结构。具有“后进先出” LIFO: Last In First Out 的性质。push 入栈pop 出栈top 获得栈顶元素。

2026-05-22 16:07:49 120

原创 机器学习评价指标之转换化为二分类任务

在预测时,每个模型都对样本进行预测,得到 N(N-1)/2 个预测结果。然而,它可能会受到类别不平衡问题的影响,因为每个模型的样本分布可能不同。OvO 策略需要训练更多的模型,但它对于类别不平衡的情况更加稳健,因为每个模型只关注两个类别,样本分布相对平衡。在预测时,对于一个新样本,每个模型都会给出一个预测概率或类别标签。在预测速度上,OvR 策略需要计算所有模型的预测结果,而 OvO 策略只需要计算相关类别之间的模型预测结果。训练过程中,每个类别的模型将其正样本标记为正类,而其他所有类别的样本标记为负类。

2026-05-22 08:54:58 87

原创 换根技巧实例分析:最小高度树

本文并非简单的对本题进行讲解,而是通过本题帮助读者能够理解树形 DP 和换根 DP 的核心思想。其中深度的计算是最基础的树形 DP 操作。而一次普通的树形 DP 操作是 的复杂度。而对每个点都进行计算又是 操作。对于本题 的数据量显然不满足。给出一颗无向无简单环路的联通图。以任意一点为根,可以视为一颗树。点 0~5 的深度分别为 [3, 3, 3, 2, 2, 4]根据题意,我们需要对所有的点进行深度的计算。请求出所有最小高度的树根的集合。因此,考虑换根 DP。

2026-05-21 21:53:14 107

原创 文献管理工具EndNote全流程下载与安装教程指南

与Word无缝集成(自动插入/更新引文和参考文献列表);支持跨平台(Windows/macOS/iPad)及云端同步(EndNote Web);提供“期刊匹配”“AI 提取要点”等高级功能(EndNote 2025版);中文数据库(如知网)直连支持弱于国产工具(如NoteExpress)。‌‌。

2026-05-21 13:09:45 1460

空空如也

空空如也

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

TA关注的人

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