logo
publist
写文章

简介

该用户还未填写简介

擅长的技术栈

可提供的服务

暂无可提供的服务

多线程:按序打印问题(原子操作)

本文探讨了使用原子操作解决多线程顺序执行问题的方法。通过定义原子状态变量state,实现了线程间的同步:first()执行后修改state为2,second()自旋等待state=2后执行并修改为3,third()等待state=3后执行。相比互斥锁,原子操作无需上下文切换,直接利用CPU指令实现高效同步,但会持续占用CPU资源。文章还介绍了C++20的wait/notify优化方案,并分析了原子

文章图片
#c++
多线程:按序打印问题(信号量)

本文介绍了使用信号量(Semaphore)解决多线程顺序执行问题的方法。针对LeetCode题目中要求三个线程按first→second→third顺序执行的需求,作者从第一性原理出发,将信号量本质解释为"许可证管理"的计数器,通过wait和release操作实现线程同步。文中给出了C++20的std::binary_semaphore实现方案,使用两个初始值为0的信号量构建执

文章图片
#c++
Unity:Edge Collider 2D(边缘碰撞体2D)

Collider(碰撞体):在Unity(游戏引擎)中,Collider就是一个“看不见的外壳”,它用来告诉游戏系统:“这里有东西,如果别的物体碰到了这里,要产生碰撞反应!直观比喻:想象你开着一辆隐形的车,虽然别人看不到,但只要撞到了这辆隐形车,就会像撞到真实的车一样产生撞击效果。Collider就是这辆“隐形车身”的轮廓。

文章图片
#unity#游戏引擎
数据结构:二分查找分析(Analysis of Binary Search)

摘要:本文介绍了二分查找算法的递归实现及其时间复杂度分析。算法通过每次将查找区间折半(需数组有序),逐步定位目标值。递归调用树呈现对数高度,每层仅需常数时间操作(O(1)),因此总时间复杂度为O(logn)。通过构建满二叉树模型分析平均情况:当数组规模n=2^k-1时,平均比较次数约为log₂n-1,证明平均时间复杂度仍为O(logn)。该分析涵盖了最坏、最好和平均情况的完整复杂度论证。

文章图片
#数据结构#算法
数据结构:二叉树的高度 (Height)和节点总数 (Count of Nodes)

本文运用第一性原理,通过递归思想推导二叉树的三个基本度量问题:高度、节点总数和叶子节点数。首先明确各概念定义:高度是从根节点到最远叶子节点的边数(空树高-1,单节点树高0);节点总数是树中所有节点的数量;叶子节点是无子节点的节点。通过分析最简单情况(空树和单节点树)建立递归关系:树的高度=1+max(左子树高,右子树高);节点总数=1+左子树节点+右子树节点;叶子节点数=左子树叶子+右子树叶子(当

文章图片
#数据结构
数据结构:N个节点的二叉树有多少种(Number of Binary Trees Using N Nodes)

本文探讨了N个节点的二叉树形态数量问题,区分了无标签和有标签两种情况。对于无标签节点,通过递推方法推导出形态数量遵循卡特兰数序列,其通项公式为C_N=(1/(N+1))*(2N choose N)。对于有标签节点,在无标签结构数C_N基础上乘以N!种标签排列方式,总形态数为N!*C_N。文章从n=0到n=3的具体案例分析入手,逐步建立递推关系,最终给出完整的数学解决方案。

文章图片
#数据结构
数据结构:数组抽象数据类型(Array ADT)

摘要:抽象数据类型(ADT)是一种聚焦数据操作逻辑而忽略实现细节的建模方法,如遥控器说明书只描述功能不涉及电路。ADT具有操作明确、实现无关等特征,不同于具体数据类型和数据结构。以ArrayADT为例,它定义了get/set等线性操作接口,强调顺序存储、随机访问等抽象特性,但具体实现可灵活选择(静态/动态数组等)。ADT是面向对象编程的重要基础,通过封装行为规范提升代码复用性。

文章图片
#数据结构
数据结构:递归:泰勒展开式(Taylor Series Expansion)

本文摘要:文章从第一性原理出发,推导了用C++递归实现泰勒展开式的方法。通过类比自然数求和递归模式,提出递归计算策略:1)定义基础情况(n=0返回1),2)先递归计算前n-1项和,3)回溯过程中更新分子(x^n)和分母(n!)的状态,4)累加当前项。关键点在于利用全局变量保存状态,并在递归回溯阶段计算当前项,避免重复计算。最终实现了一个高效递归算法,完整呈现了从数学定义到代码实现的推导过程。

文章图片
#算法#数据结构
计算机组成与体系结构:替换策略(MRU & LRU & PLRU & LFU)

本文介绍了多种缓存替换策略,包括MRU(最近最常使用)、LRU(最近最少使用)、PLRU(伪最近最少使用)和LFU(最少频繁使用)。MRU策略在缓存满时替换最近访问的块,适用于特定访问模式。LRU策略则淘汰最久未使用的块,利用时间局部性原则。PLRU是LRU的近似实现,通过树结构和方向位减少硬件开销,同时接近LRU的效果。LFU策略基于访问频率,淘汰访问次数最少的块,适用于访问热点稳定的场景。每种

文章图片
#缓存
数据结构:数组:反转数组(Reverse the Array)

摘要:数组反转可通过两种方法实现:1. 双指针交换法:使用i,j指针从两端向中间遍历并交换元素,时间复杂度O(n),空间复杂度O(1)。这种方式直接修改原数组,通过n/2次交换完成反转。2. 辅助数组法:创建新数组B,将A的元素从尾部开始复制到B,再将B写回A,时间复杂度O(n),但需要额外O(n)空间。两种方法分别体现了空间优化和逻辑清晰的取舍,前者适合就地修改,后者更易理解但占用更多内存。

文章图片
#数据结构
    共 18 条
  • 1
  • 2
  • 请选择