自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux 入门日记 1:终于搞懂 Linux 到底是什么了!

本文是Linux新手入门指南,主要介绍了Linux的核心概念和基础知识。文章首先解释了Linux的本质是操作系统内核而非完整系统,需要搭配工具软件组成发行版才能使用。接着梳理了Linux的发展简史,并针对新手推荐Ubuntu作为入门发行版,详细比较了Debian系、RedHat系和轻量系三大主流发行版的特点。文章还列出了Linux必备的四大类配套软件(命令行工具、包管理器、桌面系统和硬件驱动),并分享了作者首次安装Ubuntu时遇到的内存分配不足和忘记用户名两个常见问题的解决经验。全文以新手视角出发,用通俗

2025-11-21 10:23:50 18

原创 从编译角度来理解匿名函数与闭包

本文从编译视角解析匿名函数与闭包的核心机制。通过分析JS和Java中匿名函数的编译过程,揭示其如何被转化为实体对象(闭包/匿名类),并详细说明外部变量的捕获策略——JS采用引用传递捕获变量地址,Java采用值传递捕获变量拷贝。文章重点探讨了匿名函数的创建时机、生命周期管理,以及循环中常见问题的根源与解决方案(如使用let代替var),帮助开发者深入理解匿名函数的底层原理与实际应用中的关键问题。

2025-11-15 15:59:41 906

原创 动态加载器工作原理与 DLL 缺失问题解析

动态加载器是程序运行时连接动态库的核心组件,负责库的加载、符号解析和地址重定位。其工作流程包括识别依赖、查找库文件、符号解析和地址修正四个关键步骤。常见的"找不到DLL"问题通常源于四种情况:库文件不在搜索路径、依赖链断裂、版本不兼容或权限/文件损坏。不同系统提供了针对性工具(如Windows的Dependency Walker、Linux的ldd命令)来定位问题。理解动态加载器的工作原理有助于精准解决库加载问题,而非仅依靠盲目复制文件。

2025-11-14 10:11:46 244

原创 从代码到可执行文件:编译与链接实操超详解

本文以一段包含全局变量、静态变量、常量的 C 代码为例,详细解析了从代码文本到可执行程序的完整编译过程。通过 GCC 工具链演示了预处理、编译、汇编、链接四个阶段的具体操作:预处理完成宏替换和头文件包含;编译器进行语法检查并生成汇编代码,按变量类型分配不同内存段;汇编器将汇编代码转为机器指令;最后由链接器合并多个目标文件并解析依赖关系。整个过程揭示了 CPU 架构差异对编译结果的影响,帮助开发者深入理解代码从编写到执行的完整生命周期。

2025-11-13 11:05:30 733

原创 QT5.15.2 + QWT6.2.0 + QT Creator17.0.2 编译(MinGW 64-bit)

本文介绍了QWT 6.2.0在MinGW 64-bit环境下的编译过程。主要内容包括:QWT的功能概述、下载方法及目录结构说明。重点描述了在Qt Creator中使用MinGW编译时遇到"找不到moc.exe"错误的解决方法:先修改Makefile中的路径格式,后通过注释qwt.pro中非必要子项目来简化编译。最终成功生成了Release版本的库文件,存放在指定目录下。文章提供了详细的错误日志截图和操作步骤,对类似环境下的QWT编译具有参考价值。

2025-11-12 10:24:47 833

原创 时间复杂度与空间复杂度分析方法

摘要: 复杂度分析衡量算法执行效率(时间)和内存占用(空间)随数据规模(n)增长的趋势。时间复杂度聚焦基本操作执行次数的最高阶项,如O(1)、O(n)、O(n²)等,区分最坏、最好和平均情况。空间复杂度统计额外临时空间(如递归栈、辅助数组),常见类型包括O(1)、O(n)等。递归需额外计算栈空间,如斐波那契递归为O(n)。经典算法示例如二分查找(时间O(logn),空间O(1))、动态规划(时间O(n²),空间O(n²))。核心原则是关注增长趋势、权衡时空效率,优先优化最坏时间复杂度。

2025-11-11 13:58:32 695

原创 动态规划:不用 “暴力穷举”,解决 “多步骤选最优” 问题,实战 0-1 背包问题

摘要: 动态规划(DP)通过拆解大问题为小问题并存储中间结果来高效求解。以爬楼梯为例,到第n层的方法数等于到第n-1层和n-2层方法数之和,通过数组存储避免重复计算(Java代码演示)。核心步骤包括:拆解问题(分析最后一步选择)、存储小问题结果、自底向上推导。实战案例0-1背包问题中,用二维数组记录前i件商品在j元时的最大价值,逐步填充表格并回溯最优解(Java实现)。DP适用于多阶段决策问题,通过“记忆化”提升效率,避免暴力穷举。

2025-11-10 14:14:57 840

原创 搜索算法:2 种核心方法,找数据不用“瞎翻”

二分查找和广度优先搜索(BFS)是两类常见搜索问题的核心解法。二分查找适用于有序数据的高效查询(如10万条用户ID),通过"对半切割"将查找次数降至log₂n次;BFS则通过"逐层遍历"解决树/图的最短路径问题(如地图路线)。文章用生活化比喻和Java代码示例详细讲解两种算法:二分查找通过有序数组验证17次查询即可定位目标,比遍历快6000倍;BFS利用队列实现无权重图的最短路径搜索。关键点包括二分查找的有序前提、防溢出计算,以及BFS的层级遍历特性。

2025-11-09 10:16:41 748

原创 排序算法:3 种常用排序,学完能搞定大部分场景

日常开发中,从 “给 100 条用户考勤数据按时间排序” 到 “给 1 万条订单按金额排序”,排序是高频需求。而**冒泡排序、快速排序、归并排序**覆盖了 “小规模数据”“大规模数据”“稳定排序” 三大核心场景,学会它们,基本能解决 80% 的排序问题。

2025-11-08 14:16:56 663

原创 二叉树实战:从数据库索引到项目代码,核心解析 B + 树与查询 IO(4)

B+树是数据库索引的高效核心结构,通过多级节点分层管理数据。内存中的B+树由根节点、非叶子节点和叶子节点组成,形成有序的层级关系。非叶子节点仅存储键值和指针,叶子节点则包含数据地址或完整数据,并通过双向链表连接。这种结构将千万级数据的查询IO控制在3-4次,极大提升效率。以查询id=58为例,仅需2次磁盘IO即可定位数据。此外,二叉树在部门树构建和优先级任务调度等场景也有广泛应用。B+树的设计完美平衡了查询效率和存储开销,是数据库索引的理想选择。

2025-11-07 10:44:39 1009

原创 红黑树:解决 BST 失衡问题,工业级 “自平衡” 的秘密(3)

上一篇我们学了二叉搜索树(BST)—— 它靠 “左小右大” 规则实现快速查询,但有个致命漏洞:如果插入有序数据(比如 1→2→3→4→5),会直接退化成链表,查询效率从 O (logn) 暴跌到 O (n),和数组没区别。这不是 BST 的错,而是 “平衡” 的锅:BST 没有自我修复能力,数据一 “扎堆” 就失衡。而红黑树(Red-Black Tree)就是为解决这个问题而生的 —— 它像给 BST 装了 “自动平衡器”,通过 5 条 “颜色规则” 和 “旋转 + 变色” 操作,让树始终保持 “近似平

2025-11-06 10:05:03 1113

原创 二叉搜索树(BST):会 “自动排序” 的二叉树,查询快如闪电(2)

二叉搜索树(BST)通过“左小右大”规则实现高效查询和自动排序。相比数组遍历,BST查询复杂度仅为O(logn),10万次查询缩减至20次。BST中序遍历可输出升序序列,无需额外排序。核心操作包括查询(二分查找)、插入(自动定位)和删除(分三种情况处理),均围绕“左小右大”规则进行。这种结构被广泛应用于数据库索引和字典检索,是基础但高效的数据结构。

2025-11-05 10:12:31 634

原创 二叉树入门:30 分钟搞懂 “节点结构 + 手动构建 + 4 种遍历”(1)

本文用家族树类比介绍二叉树的基本概念,包括节点、根节点和叶子节点。通过Java、JavaScript和C#三种语言的代码示例,展示了如何定义节点结构和手动构建二叉树。重点讲解了四种遍历算法(前序、中序、后序和层序遍历)的递归实现,并详细拆解执行步骤。其中特别强调了前序遍历「根→左→右」的顺序及其在复制二叉树、打印目录等场景中的应用价值,帮助初学者在30分钟内从理论到实践快速掌握二叉树基础知识。

2025-11-04 15:23:11 597

原创 哈希表到底是什么?从原理到实战,讲透 “1 次查询” 的核心魅力

本文介绍了哈希表的核心原理和实现方式。哈希表通过空间换时间的策略,使用桶数组、哈希函数和冲突解决机制实现快速查询。其核心结构包含数据节点和哈希表本体,通过哈希函数将关键词映射到桶索引。主要操作包括插入(处理冲突和扩容)、查询(快速定位)和删除。哈希表的高效性源于其平均只需少量遍历即可找到目标数据,相比数组遍历大幅提升性能。当数据量超过负载因子时会自动扩容,重新分配数据以减少冲突。这种结构使其成为缓存、登录验证等场景的理想选择。

2025-11-03 17:22:06 838

原创 队列的实现过程拆解:数组和链表如何一步步造一个队列?

本文介绍了两种队列实现方法:循环数组和链表。循环数组通过指针循环解决普通数组的"假满"问题,适合固定容量场景,如消息缓冲队列。定义结构包含数组、队头/尾指针和容量,实现入队(offer)和出队(poll)操作时需处理指针循环移动。链表实现则无容量限制,用front和rear指针分别指向链表头和尾,避免遍历操作,适合订单量不确定场景。两种方法都遵循"先进先出"原则,并提供了判空、判满等辅助操作,可根据实际需求选择适合的实现方式。

2025-11-02 12:48:22 525

原创 栈的实现过程拆解:数组和链表如何一步步造一个栈?

文章摘要: 本文详细讲解了如何用数组和链表实现商品ID栈。数组栈采用"数组+栈顶指针"结构,通过移动指针实现压栈(先增指针后存数据)和弹栈(先取数据后减指针)操作,容量固定。链表栈利用单链表头节点作为栈顶,通过修改头指针实现压栈(新节点插头部)和弹栈(删除头节点),容量灵活。两种实现都包含初始化、核心操作(push/pop)和辅助功能(判空、peek),通过具体代码和内存变化演示了栈的工作原理。

2025-11-01 11:34:31 788

原创 链表到底是什么?从内存本质到实战场景,讲透灵活增删的核心结构

链表通过离散节点和指针串联实现高效中间增删操作,内存中每个节点包含数据域和指针域。单链表只需修改指针即可插入数据(如20和30间插入25),双向链表则支持反向遍历。高级语言中,Java的LinkedList、C++的std::list和Python的deque均基于链表实现,适用于频繁增删场景(如聊天消息、日志)。链表的优势在于中间操作快(O(1)),但随机访问慢(O(n)),适合有序遍历但无需索引查询的场景(如文本编辑、消息列表)。

2025-10-31 09:26:55 377

原创 数组到底是什么?从内存可视化到多行业实战,讲透最常用的数据结构

提到数组,很多人只知道 “是存数据的列表”,但说不清它在内存里到底长什么样,也不知道 “为啥电商、工业设备都爱用它”。这篇不绕理论,只讲 “看得见、用得上” 的数组:先带你看内存里的实际效果,再讲高级语言里哪些常用对象是数组做的,最后用 2 个行业案例 + 精简对比,说清数组的用法和优缺点。

2025-10-30 11:35:36 454

原创 5 个内存优化干货(6)

在前四篇中,我们已理清内存性能的核心指标、不同场景的内存特点,本篇将聚焦 “落地”—— 从代码选型到架构监控,给出 5 个能直接用在项目里的内存优化技巧,帮你既提性能又省资源。

2025-10-29 10:04:30 940

原创 深入内存底层:操作系统如何分配内存给程序(5)

程序需要的内存,到底是怎么从操作系统 “拿到手” 的?** 操作系统不会直接把物理内存 “裸奔” 给程序,而是通过虚拟内存、分页、地址转换等机制,为程序构建安全、高效的内存环境。本篇将深入操作系统底层,拆解进程获取内存的完整流程,以及背后关键机制的工作原理

2025-10-28 10:28:16 990

原创 程序内存自动管理:.NET 的垃圾回收机制(4)

本文深入解析了.NET垃圾回收(GC)机制的工作原理。主要内容包括:1).NET内存的三级划分(新生代Gen 0/1、老年代Gen 2、大对象堆LOH)及其回收策略;2)GC的完整执行流程,从触发条件、标记阶段的可达性分析,到不同代的清理算法(复制算法、标记-清除/整理);3)C#对象引用场景辨析,重点说明集合存储仅为引用传递,以及参数传递的引用/值类型差异。文章通过具体示例,揭示了CLR如何自动管理内存,并给出开发者需注意的关键点,如集合引用保持、大对象堆碎片问题等。

2025-10-27 14:08:39 910

原创 程序内存自动管理:QT 的父子对象机制与智能指针实践(3)

摘要(146字) QT框架通过"父子对象绑定+智能指针辅助"实现C++自动内存管理。父子机制是核心:当QObject子类对象指定父对象后,父对象销毁时自动清理所有子对象,适用于GUI开发等场景。布局管理器可隐式建立父子关系。对于游离对象,需配合QT智能指针(如QPointer防野指针、QSharedPointer共享资源)。这种机制既避免手动管理风险,又保持C++性能优势,使QT成为跨平台开发的高效选择。

2025-10-26 19:52:42 589

原创 程序内存 “踩坑” 指南:内存泄漏、栈溢出与碎片的定位与解决(2)

内存问题排查与优化指南 本文针对程序开发中常见的内存问题,重点分析了内存泄漏、栈溢出和内存碎片三大"陷阱",并提供了从现象识别到解决方案的完整路径。 内存泄漏:隐蔽的堆内存消耗 现象识别:堆内存持续增长、程序响应变慢、最终内存耗尽崩溃 根源分析: C/C++:忘记释放内存、异常分支跳过释放、数组释放方式错误 Java/Python:静态集合残留引用、内部类持有外部引用、循环引用

2025-10-25 14:22:45 744

原创 深入理解程序内存:分类、使用与生命周期

程序内存主要分为栈、堆、全局/静态存储区和代码区四类。栈内存自动管理临时变量和函数调用信息,堆内存需手动或自动管理动态数据,全局/静态区存储长期变量,代码区存放程序指令。内存的生命周期由区域特性决定,栈内存随函数调用释放,堆内存需手动或GC回收,全局/静态区和代码区与程序同生命周期。理解内存机制有助于优化程序性能、稳定性和安全性。

2025-10-24 11:43:43 818

QWT6.2.0编译完成的库文件

编译环境 • QT Creator 17.0.2 • Qt 5.15.2 • MinGW 64-bit

2025-11-12

空空如也

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

TA关注的人

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