• RAII 计时器类 为了实现“自动统计终止时间”且不破坏业务逻辑的整洁性,我们可以封装一个计时器类。利用 C++ 对象的生命周期机制,将计时的开始点放在构造函数中,将计时的结束与统计点放在析构函数中。 原理:C++ 保证栈对象在离开其作用域(即遇到右大括号 })时,会自动调用析构函数。 利用匿名作用域:通过手动添加 { … } 代码块,我们可以精确控制计时器的生命周期,从而统计...
  • 蓄水池采样

    蓄水池采样(Reservoir Sampling)是一种用于从一个未知大小的数据流中随机选择 k 个样本的算法。 目的:在不需要预先知道数据流总长度 n 的情况下,从数据流中等概率地抽取 m 个元素。 等概率要求:最终结果集(蓄水池)中,任意一个元素 A[k] 被抽中的概率必须是 。 算法步骤 初始化一个大小为 k 的数组(蓄水池)来存储样本。 读取数据流的前 ...
  • 在面试手撕代码时, 面对的代码环境常常不是类似于leetcode那样的核心代码填空, 而是需要你自己去搭建一个完整的代码框架, 处理输入输出, 以及边界条件等问题. 头文件 在使用ACM模式时, 需要知道常用的方法对应的头文件: <bits/stdc++.h>: 包含了几乎所有的标准C++库, 适合竞赛使用, 但编译速度较慢. : 定义了各种数据类型的极限值...
  • rand() C 语言标准库提供了一个用于生成伪随机数的函数 rand(),它定义在 <stdlib.h> 头文件中。rand() 函数返回一个范围在 0 到 RAND_MAX 之间的整数,其中 RAND_MAX 是一个常量,表示 rand() 函数可能返回的最大值,通常至少为 32767。 通常要生成指定范围内的随机数,可以使用以下公式:random_number...
  • 零拷贝 (Zero-Copy) 是一种I/O操作优化技术。它的核心思想是:在数据从一个I/O设备(如磁盘)传输到另一个I/O设备(如网卡)的过程中,尽可能地减少甚至完全消除 CPU 对数据内容的复制操作。这里的“拷贝”指的主要是“CPU 拷贝”,而不是 DMA(直接内存访问)拷贝。 假设我们要实现一个最常见的场景:“从磁盘读取一个文件,然后通过网络发送出去”(例如,一个 Web 服...
  • shared_ptr 实现 手写一个 shared_ptr 的实现, 主要需要注意以下几点: - 成员变量是两个指针, 一个指向被管理对象, 一个指向引用计数器(其实是指向控制块, 但是这里简化为指向引用计数器) - 拷贝构造和拷贝赋值运算符都需要增加引用计数器, 因为新对象共享同一个被管理对象 - 移动构造和移动赋值运算符不增加引用计数器, 因为资源从源对象转移到目标对象,...
  • 六大进程间通信 IPC

    进程(Process)是资源分配的基本单位。为了安全和稳定,操作系统会为每个进程分配独立的虚拟地址空间。IPC 是操作系统提供的一套机制,用于跨越这些进程的独立地址空间,让它们能够交换数据和同步状态。 六大主要 IPC 机制: 共享内存 共享内存(Shared Memory)是一种高效的 IPC 机制,允许多个进程直接访问同一块内存区域。操作系统在物理内存中划出一块区域,然后将这块...
  • 序列与区间处理 (Sequence & Range Processing) 这种方法用于将一个“朴素”的 O(n2) 解法优化到 O(n)。 在我们的算法题中, 可能会遇到两类问题: - 区间查询 (Range Query):频繁地询问“数组 i 到 j 之间的和/积/异或值是多少?” - 区间更新 (Range Update):频繁地操作“把数组 i 到 j 之间的所...
  • 堆 当你需要在一个动态的集合中(元素不断在增加或减少)快速地查找并(或)移除“最值”(最大值或最小值)时,堆就是你的不二之选。 Top-K 问题 / 第 K 小/大 这是堆最基础、最直接的应用。核心思想是:维护一个大小固定为 K 的堆。这个堆里存储了你到目前为止见过的 “Top K” 个元素。 问题模型: - 静态数组:在 N 个元素中找到第 K 大的元素 (LC 215)。 ...
  • 栈 栈是一种后进先出(LIFO)的数据结构,支持基本操作:入栈(push)、出栈(pop)和查看栈顶元素(top)。栈的应用场景包括表达式求值、括号匹配、深度优先搜索等。 邻项消除 & 合法括号字符串 这两个是栈的最经典应用,因为它们的思想完全一致。 核心思想: 遍历你的输入(如一个字符串)。 使用一个栈来维护一个“尚未被消除/匹配”的元素序列。 当你遇到一个新元素...
12321