- 博客(29)
- 收藏
- 关注
原创 快速排序(Quick Sort)详解与图解
快速排序(Quick Sort)是一种**分治思想(Divide and Conquer)**的经典算法,也是面试与嵌入式开发中最常用的排序算法之一。本文通过详细代码、逐步图解和运行示例,带你从零彻底理解快速排序。
2025-10-27 20:04:22
361
原创 C语言指针与参数传递详解 —— 从底层存储到高效编程
本文介绍了指针在编程中的核心应用。指针作为存储变量地址的变量,能够高效传递大容量数据(如数组、结构体),避免值传递的复制开销。文章详细解析了指针的定义、存储机制(小端模式为主)、基本操作及与数组的关系,并重点阐述了指针传参的优势:节省内存、实现多返回值(通过输出参数)、保护数据(const修饰)和模块封装(返回指针)。最后举例说明了指针在嵌入式系统中直接访问物理地址的典型应用,如读取硬件寄存器。这些特性使指针成为系统级编程和硬件交互的重要工具。
2025-10-07 20:19:18
975
原创 Windows+Docker+AI开发板打造智能终端助手
本文详细介绍了在Windows系统上通过Docker部署Dify平台,并结合Ollama本地模型的完整流程。主要内容包括:Dify环境部署、端口暴露与防火墙设置、在香橙派/树莓派上通过Python脚本调用Dify API实现本地智能助手交互。文章提供了完整的代码示例和常见问题排查方法,并展示了如何扩展为语音交互功能。整个过程涵盖了从部署到最终实现的各个环节,为开发者构建本地AI智能助手提供了完整的解决方案和技术指导。
2025-10-06 21:27:33
1777
4
原创 Anaconda 安装 YOLOv5 的完整步骤
本文介绍了搭建YOLOv5环境的完整流程:1)配置清华Anaconda镜像源;2)创建Python3.8虚拟环境;3)安装PyTorch(支持CUDA11.8);4)下载YOLOv5源码;5)通过清华pip源安装依赖;6)运行测试。文末建议设置pip和conda永久使用国内镜像源以提升安装速度。整个过程涵盖了从环境配置到模型测试的完整链路,特别针对国内用户优化了软件源设置。
2025-09-27 17:00:51
312
原创 51单片机数码管显示
/ 数据类型重定义,增强代码可读性STC89C5xRC.H:包含STC89C5xRC系列单片机的寄存器定义SMG_EN P36:定义数码管使能引脚为P3.6u8、u16:简化数据类型声明,提高代码可移植性。
2025-09-16 21:38:26
812
原创 从零到进阶:Linux 学习笔记
Ubuntu LTS、Debian Stable、Rocky/Alma、Fedora Server(新特性多)。实战练习:OverTheWire、Linux Journey、Codecademy Command Line。:Ubuntu LTS、Linux Mint、Manjaro(滚动慎用)。:在虚拟机新增磁盘 -> PV/VG/LV -> 在线扩容文件系统。:Dockerfile、Compose 编排、数据卷与健康检查。:针对 SSH 与 Nginx 配置 jail 与过滤器。上一条的最后一个参数。
2025-09-10 20:01:20
1138
原创 背包问题详解
选择物品装入背包,使总价值最大且总体积不超过。1 2 // 物品2:体积1,价值2。:f[5] = 7(选择物品1和物品3)2 3 // 物品1:体积2,价值3。3 4 // 物品3:体积3,价值4。// 正确的逆向更新(0-1背包)3 5 // 3个物品,背包容量5。:每个物品只能选一次(0-1背包):当m很大时,改用价值作为DP维度。// 错误的正向更新(完全背包)个物品,每个物品有体积。:物品可重复选(正向更新):物品分组,每组只能选一个。保证每个物品只被考虑一次。:进一步减少空间复杂度。
2025-05-16 19:07:27
573
原创 深入理解 Dijkstra 算法:原理、实现与优化
更新 d[2]=2, d[3]=4 → d: [0, 2, 4]- 更新 d[3]=3 → d: [0, 2, 3]:设置起点到自身的距离为0,到其他所有点的距离为无穷大。// 初始化为 -1。1 2 2 // 边 1→2,权重=2。2 3 1 // 边 2→3,权重=1。1 3 4 // 边 1→3,权重=4。从未处理的顶点中选择当前距离起点最近的顶点。3 3 // 3个节点,3条边。最终结果:d[3] = 3。(最短距离数组)初始化为。Dijkstra算法采用。
2025-05-14 17:18:40
758
原创 拓扑排序详解
拓扑排序是对有向无环图(DAG)的顶点进行线性排序,使得对于任意一条边 u→v,u 在排序中总是位于 v 的前面。这种排序方法常用于课程安排、任务调度和编译顺序等场景。拓扑排序的实现通常使用 Kahn 算法,该算法通过计算每个节点的入度,将入度为 0 的节点加入队列,并逐步删除这些节点及其出边,更新其他节点的入度,直到所有节点都被排序。如果图中存在环,则无法进行拓扑排序。代码示例展示了如何使用邻接表存储图,并通过 Kahn 算法实现拓扑排序。
2025-05-13 19:10:04
1293
原创 图中点的层次:BFS与邻接表的完美结合
本文详细介绍了如何使用广度优先搜索(BFS)算法结合邻接表存储方式,计算图中指定起点到所有其他节点的最短距离。首先,文章解释了邻接表的结构及其构建过程,通过数组模拟链表的方式存储图,具体包括头指针数组、边的终点数组和下一条边的索引数组。接着,文章阐述了BFS算法的流程,从初始化队列、起点入队到循环处理队列中的节点,遍历其邻接节点并更新距离。代码实现部分展示了如何使用数组模拟队列进行BFS,并提供了从起点到目标节点的最短距离计算。最后,通过示例分析展示了BFS的执行过程及其最终结果,证明了BFS在无权图最短路
2025-05-12 19:28:26
1162
原创 广度优先搜索(BFS)算法详解
int x;// 当前点的x坐标int y;// 当前点的y坐标int step;// 从起点到当前点的步数}P;N和M定义了数组的最大尺寸P结构体表示迷宫中的一个点,包含坐标和到达该点的步数。
2025-04-27 20:28:30
4424
原创 深入理解N皇后问题:从DFS到对角线优化
行处理顺序:逐行放置皇后,避免行冲突冲突检测col[i]dg[u+i]udg[n-u+i]回溯机制:递归返回时撤销所有修改这个算法通过DFS系统地探索所有可能的解空间,同时使用剪枝技术大幅提高效率。
2025-04-26 20:28:44
997
原创 深入理解全排列算法:DFS与回溯的完美结合
通过DFS和回溯的结合,我们可以高效地生成全排列。全排列问题是算法中的经典问题,其目标是将一组数字的所有可能排列组合列举出来。高效生成全排列,并通过模拟递归过程帮助读者彻底掌握其核心思想。:递归地尝试所有可能的数字选择,直到填满整个排列。:如果输入包含重复数字,需额外判断避免重复排列。种排列,每种排列需要 O(N) 时间生成。数组的状态,确保后续分支能正确选择数字。的状态,确保其他分支能正确使用数字。:调整循环顺序,使输出按字典序排列。:逐层选择未被使用的数字,更新。:存储当前生成的排列。
2025-04-10 19:52:50
1001
原创 字符串哈希算法详解:原理、实现与应用
字符串哈希是一种高效处理字符串匹配和比较的技术,它通过将字符串映射为一个唯一的数值(哈希值),从而在O(1)时间内完成子串的比较。适用于需要频繁比较子串的场景,比直接暴力匹配高效得多。如果需绝对准确,可双哈希(用两个不同的P计算)。PP 是一个质数(通常取131或13331)。MM 是一个大数(如 264264,代码中用。的工作原理,并通过流程图逐步解析其执行过程。:预计算幂次,用于后续子串哈希计算。(比较哈希值而非原始字符串)。是质数,保证哈希分布均匀。(时间复杂度O(1))。常用的字符串哈希方法是。
2025-04-08 20:40:25
1387
原创 模拟堆:一种灵活的堆实现方式
模拟堆是指不直接使用数组存储完全二叉树,而是通过其他数据结构(如链表)或更灵活的方式来模拟堆的操作行为。动态性强:不受固定数组大小的限制灵活性高:可以方便地支持复杂操作扩展性好:易于添加自定义功能。
2025-04-05 20:24:16
545
原创 理解合并集合(并查集)
合并集合(Union-Find 或 Disjoint Set Union,简称 DSU)是一种树型数据结构,用于处理动态连接性问题。合并操作(Union):将两个不同的集合合并成一个集合。查找操作(Find):确定某个元素属于哪个集合(即查找该元素的根节点)。合并集合广泛应用于网络连接、图算法、社交网络分析等多个领域。
2025-04-04 18:02:05
1001
原创 深入理解Trie树:高效处理字符串的利器
专门用于高效存储和检索字符串集合。构建敏感词 Trie 树,快速检测文本中的敏感词。:可改用哈希表或动态分配内存(如 C++ 的。从根节点到某一节点的路径构成一个字符串。是一种高效处理字符串的数据结构,适用于。Trie树(字典树、前缀树)是一种。:动态分配节点编号,初始为。结尾的字符串的出现次数。每个节点代表一个字符。
2025-04-01 20:40:06
820
原创 KMP 算法详解
在日常编程中,字符串匹配是一个非常常见的需求。从简单的文本搜索到高级的数据处理,我们都可能需要在一段文本(主串)中查找特定的模式(子串)。最直接的朴素匹配算法(Brute Force)在模式较长或文本规模很大时,效率往往难以满足实际需求。为此,计算机科学家 Knuth、Morris 和 Pratt 在 1977 年提出了 KMP(Knuth-Morris-Pratt)算法,大幅提高了字符串匹配的效率。
2025-03-31 20:32:24
839
原创 深入理解滑动窗口算法:使用 C 语言寻找最小值
我们将使用一个双端队列(deque)来维护窗口中元素的索引,并确定每个窗口的最小值。这个方法的关键是利用单调队列的性质:在每个时刻,队列的头元素始终是窗口内的最小值。//数组q作为双端队列,存储窗口里维护的元素索引,里面存储的索引数字是单调的//数组a存储整个序列的数字//输入n个数,滑动窗口大小为kint n, k;i < n;i++) {//hh表示队列头 tt表示队列尾//第一次遍历:求每个窗口的最小值//i表示窗口的右边界i < n;i++) {
2025-03-30 13:57:51
782
原创 算法—模拟队列
队列是一种常见的数据结构,遵循先进先出(FIFO, First In First Out)的原则。队列在很多场景中都很有用,如任务调度、消息传递等。在这篇博客中,我们将学习如何使用 C 语言模拟一个简单的队列。
2025-03-29 15:22:19
235
原创 中缀表达式求值
缀表达式是我们在日常生活中最常见的数学表达方式。它的格式是操作符位于操作数之间,例如A + B或。在计算机科学中,对于中缀表达式的求值往往需要一些额外的处理,因为计算机更擅长处理后缀表达式(也称为逆波兰表达式)。本文将详细讲解如何实现中缀表达式求值的算法,并提供相应的图解。
2025-03-29 13:18:39
1025
原创 计算数组中最长无重复子数组长度
这类问题可以通过滑动窗口(Sliding Window)算法进行高效求解。今天,我们将基于 C 语言的实现,从代码层面介绍如何使用简单的双指针技巧,快速解决这一问题。每次窗口中不存在重复元素后,将当前窗口长度进行记录,并更新最大长度。记录窗口内各元素的出现次数,以方便判断某元素是否重复。)控制一个动态区间(窗口),该区间包含不重复元素。给定一个整数数组,找到其中最长的包含。,我们可以找到的最长无重复子数组为。
2025-03-23 19:32:51
896
原创 差分算法
一维数组的差分比较简单,他就是一维数组前缀和的逆运用,他也是我们高中比较熟悉的数列给定一个数组 a,其差分数组 b 定义为: b[i] = a[i] − a[i−1]这里,b[i] 表示原数组 a 中第 i个元素与前一个元素的差值。因此,原数组的值可以通过差分数组恢复如下: a[i] = b[i] + a[i−1] (i≥1)
2025-03-23 16:46:36
560
原创 二维数组前缀和图解
二维前缀和s[i][j]表示从二维数组的左上角(1, 1)到(i, j)的所有元素的和。它的计算公式为:s[i-1][j]是上方的前缀和。s[i][j-1]是左方的前缀和。是左上方的前缀和(因为被重复计算了,需要减去)。a[i][j]是当前元素的值。
2025-03-23 15:28:38
1534
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅