链表
链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表的主要类型包括单向链表、双向链表和循环链表。链表适合频繁的插入和删除操作,因为这些操作不需要移动其他元素。
两个黄金问题
对于链表, 有两个黄金问题, 贯穿了绝大多数链表题目的解法思路.
什么时候用哨兵节点 (Dummy Node)?
答案:任何时候可能会修改(删除或插入)链表的头节点
...
特点
AVL 树 (Adelson-Velsky and Landis Tree):
规则:
“绝对平衡”。它要求任何节点的左右子树高度差(平衡因子)最多为
1(即 -1, 0, 1)。
结果: 树的高度被压到最低,是一棵“矮胖”的二叉树。
红黑树 (Red-Black Tree):
规则: “近似平衡”。它通过 5
条“红黑规则”(例如:节点非红即黑、根黑、叶黑...
std::optional (可选类型)
std::optional 是 C++17 引入的一个“包装器”类型(在
头文件中)。它解决了一个在 C++
中存在已久的古老问题:一个函数或变量如何表示它“可能没有值”? >
包装器类型指的是一种数据结构,它可以“包装”一个值,使其具有额外的语义或功能。
它的设计理念是:通过将一个类型 T 包装在 std::optional
中...
B+ 树索引分为两种:
聚簇索引 (Clustered Index /
主键索引)
机制: “数据即索引,索引即数据”。
叶子节点: 直接存储了完整的数据行 (Data Row)。
特点:
每个表只能有1个聚簇索引(通常就是你的主键)。按主键 id
查询时,一次 B+ 树查找就能拿到所有数据,速度最快。
二级索引 (Secondary Index /
非主键索引)
...
针对内存层面,一种代码有好几种写法,可能实现的功能都差不多,但是性能可能会有很大的差异,关于这点具体有什么要注意的地方
几乎所有 C++
的性能差异,最终都归结于硬件(尤其是
CPU
Cache)是如何与我们的内存访问模式进行交互的。在现代
C++ 中,“高性能程序 =
贴合缓存的数据结构 + 算法”。C++
几乎是唯一一个允许你(也要求你)精细控制内存布局的现代语言。
...
对于算法题, 给出一种解决方案后一定要考虑其时间复杂度和空间复杂度,
并思考是否可以优化任意一个方面
代码题先处理边界情况, 或者最后处理边界情况, 但一定不要忘记
代码题的循环条件判断空, 非空等一定看准了, 非空进入是!= 才是
ACID
ACID
是数据库系统中用于描述事务特性的四个关键属性的首字母缩写,分别代表原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。这些属性确保了数据库在处理事务时能够保持数据的完整性和可靠性。
日志
这里的日志指的是预写式日志(Write-Ahead Logging, WAL), 它是实现 ACID
...
什么是线程
线程(Thread)它是一个程序内的多个执行点(Multiple
Points of Execution)。
状态:每个线程都有自己独立的状态,必须被OS管理。这包括:
程序计数器 (PC):记录自己“执行到哪里了”。
寄存器 (Registers):记录自己“正在计算什么”。
栈
(Stack):记录自己的函数调用历史、局部变量等。
共享资源:同一进...
这一章关注的是 CPU 虚拟化化技术, 也就是操作系统如何通过进程管理来实现
CPU 资源的虚拟化.
进程
用户希望同时运行多个程序(浏览器、邮件、游戏…),但物理计算机通常只有少量(例如1个或4个)CPU。操作系统如何欺骗用户,让他们感觉自己拥有(几乎)无限多的CPU,可以同时运行上百个程序?
解决方案:虚拟化CPU (Virtualizing the CPU).
操作系统通过时...