2026

Cloudflare Pages 在国内访问速度不理想,本文记录如何通过腾讯云 EdgeOne 国际版作为前置加速层,在保留 GitOps 部署体验的同时改善国内访问,包含回源 HOST、HTTPS 回源等常见问题的处理方式。

2022

本文深入浅出地介绍了计算机科学中至关重要的数据结构——树。从查找、插入和删除操作的效率提升动机出发,详细定义了树及其相关术语(如节点、边、根、叶子、父子关系)。重点阐述了二叉树的概念,并通过数学公式推导了满二叉树中节点数与深度的关系,揭示了树形结构实现 $O(\log n)$ 时间复杂度操作的潜力,为后续学习高级树形算法奠定了坚实基础。

2021

归并排序利用分治法将数组对半分割,递归排序子数组,最后合并排序后的子数组。其时间复杂度在最好、最坏和平均情况下均为 $O(n \log n)$,但需要额外的 $O(n)$ 空间来合并子数组。

本文详细介绍了快速排序(Quick Sort)算法的原理,包括基准值选择策略、原位划分过程,并深入分析了其在最好、最坏及平均情况下的时空复杂度($O(n \log n)$ 至 $O(n^2)$),最后提供了 Java 和 C 语言的代码实现示例。

本文详细介绍了插入排序(Insertion Sort)算法的原理、伪代码、时空复杂度分析,并提供了 Java 和 C 语言的实现代码。插入排序在小规模数据或部分有序数据上表现优异。

2020

本文详细介绍了经典排序算法——冒泡排序(Bubble Sort)的基本原理、伪代码、时空复杂度分析,并提供了 Java 代码实现。冒泡排序通过相邻元素的比较与交换,使最大元素逐步“冒泡”至序列末尾,时间复杂度为 O(n^2)。

本文详细介绍了经典的选择排序算法(Selection Sort)。包括其工作原理(寻找最小元素并交换)、图解演示、伪代码、性能分析($O(n^2)$ 时间复杂度,不稳定),以及 Java 代码实现,重点探讨了其不稳定性及原因。

本文全面解析了线性搜索和二分搜索两种基础且核心的搜索算法。通过伪代码、示例和 Java 代码实现,详细阐述了它们的工作原理,并对比了 $O(n)$ 与 $O(\log n)$ 的时间复杂度差异,特别探讨了二分搜索中防止整型溢出的技巧,以及在 Java 中使用标准库进行高效搜索的最佳实践。

本文首次尝试结合数值分析方法探究 COVID-19 疫情。利用二次最小二乘多项式拟合美国疫情数据,并应用理查森外推至 3 点中点公式计算新增病例增长率,通过数据可视化的方式分析社会疏离措施对减缓疫情扩散的有效性。

Robert C. Martin 在《代码整洁之道》中阐述了糟糕代码的成因与保持良好代码习惯的方法。本书核心原则在于“减少重复代码,提高表达力”。好的函数应“一次只办一件事,并且把事情办好”。本文总结了书中关于函数分层、错误处理、排版规模及命名规范等亮点,强调好代码应优于详细注释,可维护性的提高源于将问题细化。此外,一个人写代码的水平与其阅读的代码量正相关,通过多看多写、吸收他人优秀代码(如 Python 中的二元化简洁实现),能不断提升编程境界。

本文通过介绍概率论中的核心工具——贝叶斯定理(Bayes' Theorem),探讨其在 COVID-19 疫情初期估算真实感染人数中的应用。文章利用 2020 年 3 月美国 CDC 的初步数据进行推导,分析了条件概率在流行病学中的实际意义,并指出了关键未知参数对估算结果的巨大影响及模型局限性。

本文通过 JavaScript、Ruby 和 Python 的代码示例,深入解析了值相等(Value Equality)与引用相等(Reference Equality)的区别。阐述了 JavaScript 中“==”在比较对象时的局限性,并对比了 Python 的“==”与“is”、Ruby 的“==”与“equal?”方法的不同行为,帮助开发者避免常见的编程陷阱。

本文深入探讨操作系统的文件系统概念,详细解析文件与目录的结构(树状与无环图)、文件控制块(FCB)与打开文件表(OFT)的实现机制,并对比分析邻近、链式、簇式等磁盘块分配方案的优缺点。

本文结合 C 语言实例,详细讲解 Linux 系统中 fork(), exec(), wait() 三大系统调用的原理与使用方法,帮助读者理解进程的创建、执行及同步机制,分析 fork 复刻 parent 进程及 zombie process 产生原因。

本文深入探讨了操作系统中虚拟内存的核心原理,详细解析了包括按需调页、多层页表在内的机制,并重点对比了FIFO、LRU、老化算法、时钟算法等多种页置换算法的实现与优劣,最后分析了虚拟内存对系统性能(时空复杂度)的影响。

本文为 Git 用户提供了一份实用的技巧和命令速查表。内容涵盖 Git 基础命令、提交结构管理、暂存区操作、Stash 与 Branch 管理、远程仓库交互、以及经典 Git 工作流的详细说明。

本文深入探讨操作系统内存管理的核心概念,包括逻辑与物理地址空间、程序重定位、空闲空间管理算法(如 First Fit)、内存碎片问题,以及现代操作系统广泛使用的分页、分段及段页式存储管理技术和 TLB 加速机制。

本文深入探讨操作系统中的死锁问题。首先介绍死锁的概念及死锁产生的四个必要条件,随后详细阐述利用资源分配图进行死锁检测的方法,包括状态转移模型和简化算法。重点讲解了动态避免死锁的银行家算法及其原理。最后,提出了破坏死锁必要条件的预防策略,如解决“请求与保持”和“循环等待”的方法,为理解和解决操作系统死锁提供全面的技术指导。

2019

本文深入探讨操作系统中的并发控制。首先介绍了临界区与进程竞争问题,详细阐述了解决并发问题的四个必要条件(互斥、无锁、防饥饿、防死锁)。接着,重点讲解了硬件层的“检查并设置”机制、信号量(Semaphores,包括整型信号量与二元信号量)的原理与实现,以及如何利用等待队列避免忙碌等待。最后,介绍了更高层级的同步机制——管程(Monitor)及其条件变量的使用。

本文全面解析了操作系统中的进程调度策略,涵盖长期与短期调度器、抢占与非抢占式调度。深入探讨了适用于批处理任务(FIFO, SJF, SRTF)、交互式进程(RR, 多级反馈队列)以及实时系统(RM, EDF)的多种经典算法,并分析了它们在周转时间、响应时间和CPU利用率等方面的性能差异。

本文深入探讨操作系统中的进程概念,详细解析进程的三种基本状态(运行、就绪、阻塞)及其转换。介绍了进程控制块(PCB)的数据结构、管理方式(数组与指针链表)以及在Linux中的优化。同时,文章也阐述了分时系统、资源控制块以及线程(包括用户级与内核级线程)的原理、优缺点及其实现。

本文以生动的餐厅比喻,通俗易懂地介绍了计算机的核心组成(CPU、内存、I/O),深入剖析了操作系统作为硬件与软件桥梁、拓展机(虚拟化与抽象化)以及资源管理器的关键角色,并简述了操作系统的内核结构与特权指令机制。

掌握 Git 核心命令只需一小时!本指南结合可视化交互,详细讲解 Git 分支创建、提交、撤销、切换、合并、变基(rebase)以及 cherry-pick 等常用操作命令,助你轻松应对团队协作开发。

算法分析导论 2019-10-20

本文介绍了算法的基本概念、分类(确定性、随机、优化、并行、分布式)以及算法分析的核心指标(时间、空间、功耗等)。通过列表操作的例子,形象地解释了算法效率的差异。