- 博客(369)
- 问答 (1)
- 收藏
- 关注
原创 Linux IPTables
本文简要介绍了Linux iptables防火墙工具。iptables通过表、链和规则组织网络包处理,主要包含raw、filter、nat、mangle和security五张表,每张表包含不同功能的链(如INPUT、FORWARD等)。最常用的是nat和filter表,分别用于地址转换和包过滤。文章解释了链的调用规则,并提供了常用命令示例,如查看、清空表、设置DNAT/SNAT和端口重定向等。最后列出了官方文档参考链接,建议用户查阅更详细资料。
2025-08-27 16:27:26
155
原创 I/O 多路复用:select、poll、epoll
select和poll是Linux系统中常用的I/O多路复用机制。select通过位操作管理文件描述符,受限于1024的最大数量,使用fd_set结构体数组来跟踪描述符状态。poll则没有数量限制,采用pollfd结构体管理事件,将读写事件合并处理,通过位与运算判断事件发生。两者都提供了高效的I/O监控能力,但poll在可扩展性和使用便利性上更优。示例代码展示了select和poll的基本用法,包括描述符设置和事件检测。
2025-08-27 10:47:01
253
原创 Linux IO模型:阻塞IO、非阻塞IO、IO多路复用、信号驱动IO、异步IO
本文介绍了五种I/O模型的特点和实现方式:1)阻塞I/O模型简单直接但会阻塞进程;2)非阻塞I/O通过轮询避免阻塞但消耗CPU;3)I/O多路复用单线程监听多个文件描述符;4)信号驱动I/O通过信号通知数据到达;5)异步I/O完全不阻塞进程。文章通过示意图和代码示例(包括信号处理和POSIX AIO)详细说明了每种模型的实现机制,分析了各自的优缺点,为理解不同I/O模型的工作方式提供了清晰的参考。
2025-08-26 20:44:32
354
原创 leetcode_ 41 缺失的第一个正数
本文介绍了寻找未排序数组中缺失的最小正整数的两种解法。暴力解法通过排序后遍历查找,时间复杂度为O(n log n)。更优的原地哈希法利用数组本身作为哈希表,通过置换或标记法实现O(n)时间复杂度和O(1)空间复杂度。置换法通过交换元素到正确位置,标记法将存在元素的位置标记为负数。两种方法最终都通过二次遍历找到第一个不符合条件的位置,确定缺失的最小正整数。
2025-08-26 11:14:01
200
原创 leetcode_189 轮转数组
本文介绍了三种解决数组循环右移k位的方法:1)使用临时数组存储移动后的元素,空间复杂度O(n);2)环状替换法,通过计算最大公约数确定替换轮次,时间复杂度O(n);3)三次反转法,通过反转整个数组和子数组实现高效移动。其中第三种方法最优,时间复杂度O(n)且空间复杂度O(1)。文章还分析了k取模运算的必要性和环状替换的数学原理。
2025-08-24 23:04:50
753
原创 Linux: TUN/TAP
本文介绍了Linux中的tun/tap虚拟网络设备。tun/tap设备是用户空间的虚拟网卡,通过用户空间直接收发数据包。tun工作在网络层,需要配置IP地址;tap工作在数据链路层,需要配置MAC地址。文章详细说明了使用ip命令配置tun/tap设备的方法,并通过CS144项目示例展示了具体实现。同时介绍了应用程序通过/dev/net/tun设备与内核交互的编程接口,需要使用ioctl系统调用注册设备。最后提供了相关参考文档链接。
2025-08-24 10:39:29
140
原创 C++20: std::span
摘要: std::span是C++20引入的一种轻量级视图,用于安全访问连续内存序列(如数组、vector等)。它能自动推导容器大小,支持数据修改(不同于std::string_view),提供subspan等切片操作。但需注意,C++26前不包含边界检查,越界访问会导致未定义行为。示例展示了其基本用法、数据指针获取及潜在风险,建议结合size()方法自行管理边界。参考cppreference和Modernes C++相关文档获取更多细节。 (148字)
2025-08-24 09:17:09
293
原创 C++ 20: Concepts 与Requires
摘要:C++20的Concepts特性通过约束模板参数类型,解决了传统模板编程中类型不匹配导致的复杂错误问题。文章介绍了Concepts的基本用法,如使用std::is_integral限制参数类型,比较了使用Concepts与传统模板在编译期错误检测上的差异。详细讲解了四种requires表达式(简单限制、类型限制、复合限制和内嵌限制)的定义方式,并通过求最大公约数、运算符重载等示例演示其应用。Concepts能显著提升模板代码的可读性和错误提示友好性,是泛型编程的重要改进。
2025-08-23 21:17:34
819
原创 C++11: std::weak_ptr
摘要: weak_ptr是C++智能指针之一,用于解决shared_ptr循环引用问题。它不增加引用计数,通过expired()检查对象是否失效,并用lock()恢复为shared_ptr。典型应用包括打破循环引用(如双向链表节点管理)和作为缓存句柄(只访问不管理生命周期)。示例代码演示了其构造、引用计数及避免内存泄漏的能力。相比shared_ptr相互引用导致的内存泄漏,weak_ptr能确保资源正确释放。
2025-08-23 19:52:02
209
原创 leetcode_238 除自身以外的数组乘积
这篇文章介绍了如何在不使用除法的情况下,计算数组中每个元素除自身外的乘积。通过前后缀分解的方法,分别记录每个元素的前缀积和后缀积,然后将两者相乘得到结果。初始解法使用两个数组存储前后缀积,空间复杂度为O(n);优化后的版本直接在结果数组上计算,空间复杂度降至O(1)。两种方法的时间复杂度均为O(n),适用于处理大规模数据。
2025-08-21 21:03:54
196
原创 leetcode_ 76 最小覆盖子串
本文介绍了在字符串s中寻找涵盖字符串t所有字符的最小子串的两种解法。第一种使用不定滑动窗口,每次检查窗口是否满足条件,时间复杂度O(n+52m)。第二种优化方法通过记录字符差值来减少判断时间,时间复杂度O(n+m)。两种方法的空间复杂度均为O(52)。文章还提醒注意处理无解情况,并提供了C++实现代码。
2025-08-19 11:41:39
990
原创 leetcode_239 滑动窗口最大值
本文探讨了滑动窗口最大值问题的三种解法:优先队列、单调队列和分块预处理。优先队列通过维护元素值和下标来获取最大值,时间复杂度O(nlogn)。单调队列利用递减特性高效获取窗口最大值,时间复杂度O(n)。分块预处理方法将数组分为k大小的块,预处理前后缀来快速计算窗口最大值,时间复杂度O(n)。三种方法各有特点,其中单调队列在时间和空间复杂度上表现最优。
2025-08-19 11:18:25
818
原创 leetcode_438 找到字符串中的所有异位词
本文介绍了在字符串s中查找所有p的异位词子串的方法。主要使用滑动窗口技术,提出了三种解决方案:1)定长窗口+双哈希表,通过比较字符频次判断异位词;2)定长窗口+单哈希表,维护字符频次差值和差异计数器;3)不定长滑动窗口,动态调整窗口使字符频次满足条件。
2025-08-17 18:17:52
775
原创 leetcode_42 接雨水
摘要:本文探讨了LeetCode"接雨水"问题的三种解法。前后缀最大值法通过计算每个位置左右两侧的最大高度,确定积水量,时间复杂度O(n)。双指针法优化空间复杂度至O(1),通过比较左右指针所指位置的最大高度来计算积水。单调栈法以填坑思想逐步填充积水,复杂度均为O(n)。其中双指针解法最为高效,通过动态维护左右最大高度来避免额外空间消耗。三种方法均基于"当前位置积水量等于左右最大高度的较小值减去当前高度"这一核心原理。
2025-08-16 17:42:19
844
原创 leetcode_ 739 每日温度
摘要:本文讨论了如何求解每日温度问题,即对数组中的每个元素找到其后第一个更高温度出现的天数。给出了两种解法:暴力枚举法(时间复杂度O(n²))和单调栈法(时间复杂度O(n))。重点介绍了单调栈的两种实现方式,包括从左往右遍历(维护非递减栈)和从右往左遍历(维护严格递减栈)。单调栈方法能高效解决这类"下一个更大元素"问题,文章还提供了对应的C++代码实现。
2025-08-16 09:08:24
283
原创 数据结构--ST表
ST表是一种基于倍增思想的稀疏表数据结构,主要用于解决可重复贡献问题的静态区间查询。其核心思想是通过动态规划预处理区间信息,将任意区间分解为两个可重叠的2的幂次区间进行处理。预处理时间复杂度为O(nlogn),空间复杂度O(nlogn),支持O(1)时间复杂度的区间查询。ST表适用于无需修改的RMQ问题,通过构建二维数组存储不同区间长度的最值信息,实现高效的区间查询。
2025-08-13 10:06:37
641
原创 P1020 导弹拦截
摘要:本文讨论了求解最长上升子序列和最长不升子序列长度的问题。通过Dilworth定理,将导弹拦截问题转化为偏序集上的最长链和最小链覆盖问题。介绍了两种解法:动态规划(O(n²))和贪心+二分(O(nlogn))。动态规划通过维护以每个元素结尾的最长序列长度来求解,而贪心算法利用二分查找优化序列维护过程。代码实现展示了两种方法的差异,适用于不同规模的数据处理需求。
2025-08-12 10:40:12
381
原创 leetcode 15 三数之和
本文介绍了在数组中查找和为指定值的三元组问题的三种解法。首先通过暴力三重循环枚举所有可能组合,时间复杂度为O(n³),并通过排序和比较去重。其次优化为二分查找法,枚举前两个数后二分查找第三个数,复杂度降至O(n²logn)。最后提出最优的双指针解法,利用排序后数组的有序性,将问题转化为两数之和问题,时间复杂度为O(n²)。三种方法都强调了去重处理的重要性,通过排序和相邻元素比较来实现高效去重。
2025-08-11 17:11:32
905
原创 Dilworth定理证明
本文摘要:文章系统介绍了偏序集的基本概念,包括链、反链、链覆盖、反链覆盖等,并重点证明了Dilworth定理和Mirsky定理。Dilworth定理表明最长反链长度等于最小链覆盖数,通过归纳法分两种情况证明;Mirsky定理作为对偶形式,证明最长链长度等于最小反链覆盖数。两个定理揭示了偏序集中链与反链的深刻对偶关系,为组合数学中偏序结构研究提供了重要工具。
2025-08-07 11:43:05
287
原创 离散数学--等价类、偏序集
本文摘要: 等价关系与划分:定义了集合上的等价关系(自反、对称、传递性),等价类的概念,并证明等价类构成集合的划分。等价关系的三个等价条件(aRb、[a]=[b]、[a]∩[b]≠∅)相互推导成立。 偏序集与格:介绍偏序关系(自反、反对称、传递)及其相关概念(全序、良序、覆盖关系)。通过哈斯图表示偏序集,讨论极大/极小元、上下界及格的判定条件(任意元素对存在最小上界和最大下界)。 拓扑排序:阐述如何从偏序关系构造兼容的全序关系,利用有限偏序集必有极小元的引理,简述拓扑排序的算法思想。
2025-08-06 15:30:47
563
原创 离散数学--二元关系及其性质、闭包
本文系统介绍了二元关系的基本概念、性质、表示方法及闭包运算。主要内容包括:1)二元关系的定义与集合表示;2)关系的6种基本性质(自反性、对称性、传递性等)及其判定方法;3)关系的矩阵表示和有向图表示;4)关系的自反闭包、对称闭包和传递闭包的概念与构造方法,重点证明了传递闭包等于连通关系,并给出了有限集上传递闭包的计算原理。文章通过严谨的数学定义和证明,结合实例说明了关系理论在离散数学中的核心地位和应用价值。
2025-08-05 17:19:13
978
原创 leetcode_11 盛最多水的容器
摘要:本文探讨了LeetCode中“盛最多水的容器”问题,给出了三种解法。暴力法枚举所有左右端点,时间复杂度O(n²)。单调数组法优化左端点枚举,但仍是O(n²)。最优解法采用双指针+贪心策略,从两端向中间移动较小高度的指针,时间复杂度O(n)。通过数学证明该策略的正确性,确保能找到最大面积。三种方法代码实现简洁,双指针法效率最高。
2025-08-04 20:12:25
1025
原创 C++ sort比较规则需要满足严格弱序
C++排序中的严格弱序规则:自定义比较函数时,必须满足非自反性(a<a为假)、传递性(a<b且b<c则a<c)和不可比传递性等严格弱序条件。常见的错误是在比较函数中未正确处理相等情况,导致违反非自反性。例如当两个默认值(fi=-1)比较时都返回true,就会引发未定义行为。解决方法是通过确保对等值情况返回false来满足严格弱序要求。
2025-08-01 11:33:03
737
原创 leetcode_560 和为K的子数组
本文探讨了和为k的子数组个数问题。提供了两种解法:1)暴力枚举法,通过固定子串起点并累加计算和,时间复杂度较高但能通过测试;2)前缀和优化法,将问题转化为类似两数之和的问题,利用哈希表存储前缀和出现次数,将时间复杂度优化至O(n)。特别强调了需要正确处理前缀和初始值pre[0]。前缀和解法通过在遍历时维护当前累加和,并查询哈希表中满足cur-k的前缀和出现次数,有效提升了算法效率。
2025-07-27 10:06:03
137
原创 leetcode_122 买卖股票的最佳时机II
本文讨论了股票买卖问题,要求通过多次买入和卖出股票获得最大利润。提供了三种解法:暴力递归、动态规划和贪心算法。暴力递归通过深度优先搜索枚举所有可能操作,但效率较低。动态规划通过状态转移方程(持有/不持有股票的最大收益)优化了时间复杂度至O(n)。最简洁的贪心算法则利用连续上升区间性质,将问题转化为相邻天数的正差价累加,时间复杂度同样为O(n)但代码更简洁。三种方法从不同角度解决了该问题,其中贪心算法最优美高效。
2025-07-25 18:07:53
982
原创 算法分析--时间复杂度
本文介绍了算法复杂度记号和问题分类。复杂度分析使用大O、Ω、Θ表示上下界和确界,小o、ω表示严格关系。P问题可在多项式时间解决;NP问题可在多项式时间验证;NPC问题是NP中最难且可互相归约的问题;NP-hard问题比NPC更广,但不一定属于NP。内容参考了矩阵客和时间复杂度相关文章。
2025-07-20 17:45:53
563
原创 leetcode_121 买卖股票的最佳时期
本文探讨了股票买卖问题的最优解法,要求在给定股价序列中通过一次买入卖出操作获得最大利润。介绍了四种解法:1)暴力枚举法(O(n²));2)贪心算法,通过维护历史最低价优化到O(n);3)动态规划法,状态转移方程与贪心类似;4)差分转换法,将问题转化为最大子数组和问题。其中贪心算法是最优解法,时间复杂度O(n),空间复杂度O(1)。后两种方法虽理论可行,但实际执行效率与贪心算法相当。
2025-07-19 21:04:31
873
原创 leetcode_53 最大子数组和
本文探讨了求解最大子数组和的四种方法:暴力枚举(O(n²))、动态规划(O(n))、贪心算法和分治策略。动态规划通过状态转移方程优化空间至O(1);贪心算法采用"抛弃负收益"策略;分治法则将问题分解为左右子区间处理,需维护区间和、左右端点极值等参数,时间复杂度为O(nlogn)。其中动态规划和贪心解法最为高效,空间复杂度均为O(1),体现了不同算法思想在解决同一问题时的多样性与优化思路。
2025-07-19 18:13:29
838
原创 华为OD 特异双端队列
摘要:题目描述了一种只能在头部弹出、但可以从两端插入的双端队列操作问题。要求通过最少次数的排序调整,使按1到n的顺序依次弹出元素。初始解法直接排序队列,优化后利用插入的有序性,通过维护队列的最小期望值和当前最大插入值来判断是否需要排序。最终解法进一步简化,仅用三个变量(期望值、最大插入值、是否有序)来跟踪队列状态,无需实际维护队列内容,显著优化了空间复杂度。
2025-07-15 17:21:46
438
原创 leetcode_20 有效的括号
本文介绍了判断括号序列有效性的算法。关键在于利用栈结构匹配括号对,并通过哈希表优化判断逻辑。文章提出两种解法:栈存储左括号本身或对应的右括号,处理时先检查字符串长度是否为偶数,再遍历匹配括号。两种方法均需确保栈最终为空,否则序列无效。参考来源提供了详细思路。
2025-07-15 08:51:16
319
原创 华为OD 消消乐游戏
摘要:本文讨论了一个字符串消除游戏的算法实现。游戏规则是相邻相同字母可消除,直到无法消除为止。文章比较了两种解法:栈的应用和双指针法。栈解法通过比较栈顶元素与当前元素实现高效消除,而双指针法需处理重复消除问题。样例分析表明栈解法更简洁高效,最终只需输出剩余字符串长度。
2025-07-14 17:39:12
715
原创 华为OD 处理器
本文实现了一个处理器亲和性调度算法,根据任务需求数量和可用处理器编号输出符合优先级的处理器组合。 算法首先将处理器分为两组(0-3和4-7),然后根据任务申请数量num(1/2/4/8)确定优先级规则: num=1时优先级顺序:剩余4个>2个>3个>1个 num=2时优先级顺序:剩余2个>4个>3个 num=4时必须剩余4个 num=8时需要全部8个处理器可用 使用回溯法生成满足条件的处理器组合,对两组处理器分别计算优先级,输出优先级高的组合。若优先级相同,则输出两组中的所有可
2025-07-13 23:36:48
553
原创 CS144 lab2 tcp_receiver
本文摘要: 实验实现了TCP接收端功能,重点解决32位序列号与64位绝对序列号的转换问题。实验包含两部分:接收并重组数据流(Reassembler),以及发送确认号和窗口大小(ackno和window size)。主要挑战在于处理32位序列号空间的回绕(wrap around)问题,以及SYN/FIN标志对序列号的影响。通过建立绝对序列号、流索引和TCP序列号之间的转换关系,解决了索引空间差异问题。实验还处理了TCP连接建立和终止时的序列号管理,以及窗口大小限制等细节。最终实现了能够正确处理数据重组和反馈确
2025-07-11 16:31:52
846
原创 leetcode 226 翻转二叉树
题目要求翻转一棵二叉树并返回根节点。通过递归方法实现:先翻转二叉树的左右子树,再将左右子树交换位置。对于空节点直接返回,否则递归处理左右子树后交换它们的引用。该解法简洁高效,时间复杂度为O(n),空间复杂度为O(h),其中n是节点数,h是树的高度。
2025-07-10 10:17:44
229
原创 leetcode_27 移除元素
本文介绍了两种双指针解法来移除数组中指定值val的元素。第一种同向双指针法使用快慢指针,将非val元素前移,时间复杂度O(n)。第二种相向双指针法通过左右指针交换元素,避免了重复赋值问题。两种方法都不需要额外空间,原地修改数组并返回新长度。代码示例展示了两种解法的具体实现,适用于需要在原数组上高效处理元素移除的场景。
2025-07-10 10:00:42
311
原创 华为OD 数字游戏
题目要求判断是否存在连续子数组的和能整除给定整数m。两种主要解法:动态规划和前缀和结合哈希表。动态规划解法时间复杂度为O(nm),空间复杂度可优化至O(m)。前缀和结合哈希表利用同余性质将问题转化为寻找相同模值,时间复杂度降至O(n),空间复杂度为O(m)。最优解法采用前缀和与哈希表,效率更高,适用于大规模数据。
2025-07-08 16:41:34
779
空空如也
模板实现bitset
2023-04-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人