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 的实现, 主要需要注意以下几点: -
成员变量是两个指针, 一个指向被管理对象,
一个指向引用计数器(其实是指向控制块,
但是这里简化为指向引用计数器) -
拷贝构造和拷贝赋值运算符都需要增加引用计数器,
因为新对象共享同一个被管理对象 -
移动构造和移动赋值运算符不增加引用计数器,
因为资源从源对象转移到目标对象,...
进程(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)。栈的应用场景包括表达式求值、括号匹配、深度优先搜索等。
邻项消除 & 合法括号字符串
这两个是栈的最经典应用,因为它们的思想完全一致。
核心思想:
遍历你的输入(如一个字符串)。
使用一个栈来维护一个“尚未被消除/匹配”的元素序列。
当你遇到一个新元素...