# Lecture 9: Streaming and Sketching II - 内容总结
# Part1 引入流式算法以及解决方案
# 🧩 课程引入:流式算法的挑战
- 数据以流的形式连续到达,不能全部存储。
- 算法
A
读取前一部分数据后输出结果21.5
。 - 结果还没来得及用,更多的数据又到达了。
- 再运行
A
得到新的结果18.1
。 - 关键问题: 如何把两个结果合并成一个整体答案?
# 🧠 引入 Sketching 的概念
- 对每段数据
σ
,算法A
生成一个摘要:S(σ)
,称为 sketch。 - 特性:
S(σ)
是对数据的压缩表示;- 可以从
S(σ)
还原出我们要解决问题的近似答案; - 不同问题需要不同的 sketch 设计(problem-dependent)。
# 🔗 组合 Sketch 的想法
- 若有两个数据段
σ₁
和σ₂
,分别生成 sketch:S(σ₁)
和S(σ₂)
- 希望能通过某个函数
f
合并它们:f(S(σ₁), S(σ₂)) ≈ S(σ₁ ∘ σ₂)
- 这样我们就不需要重新处理原始数据,而是只用合并 sketch!
# 💪 更进一步:线性 Sketching(Linear Sketch)
- 特别理想的情况是:sketch 之间可以直接加法合并:
S(σ₁ ∘ σ₂) = S(σ₁) + S(σ₂)
- 图示用《龙珠》角色合体的方式表达这种 “强强联合” 的能力。
# 🧮 数学表示
- Sketch 函数
S
可视为从高维空间ℝⁿ
到低维空间ℝᵏ
的变换: - S: ℝⁿ → ℝᵏ where k ≪ n
- Sketch 通常是向量,因此 “加法” 指的是向量加法。
S
是随机函数,不依赖于原始输入的存储。- 合并两个 sketch 后,你仍可以从中获取目标问题的近似答案。
- 即通过 s 函数将 n 进行降维到 k,我们不需要考虑原始的数据而只需要考虑 k 的数据,压力会小得多。
# ✅ 小结
- 流式处理适用于数据量大、内存有限、只能单次扫描的场景。
- Sketch 是一种压缩表示,保留关键信息。
- 线性 sketch 允许我们把多个 sketch 相加,从而处理整个数据流。
- 这种方法适合分布式处理、实时系统、高效内存使用等场景。
# 📊 Misra-Gries 与 sketch
# 1. Misra-Gries
# 🌟 1.1 Misra-Gries 是什么?
Misra-Gries 是一个 流式处理算法,用于在 内存受限 的情况下,找出数据流中出现频率较高的元素(Heavy Hitters)。
# 🧩 1.2 要解决的问题
给定一个数据流,找出所有出现次数大于某个阈值(比如 10%)的元素。
- 不保存整个数据流;
- 只扫描一次;
- 使用极少的内存;
- 返回一个 “可能频繁” 的元素列表(近似)。
# 🛠️ 1.3 算法流程(输入参数:允许误差 ε)
使用一个最多存 k = ⌊1/ε⌋
个元素及其计数的哈希表:
# 步骤:
- 初始化一个空表
C
(最多k-1
个元素); - 对于数据流中的每个元素
x
:- 如果
x ∈ C
:将其计数加 1; - 如果
x ∉ C
且表未满:将x
加入表中,计数设为 1; - 如果
x ∉ C
且表已满:将所有计数器减 1,删除计数为 0 的元素。
- 如果
# 💡 1.4 举个例子
数据流: A, B, A, C, A, B, D, A, C, C, C, C, B, ...
使用 Misra-Gries,可能发现:
A: 频繁
C: 频繁
B: 可能
D: 被忽略
# 📏 1.5 准确性保证(误差控制)
- 算法输出一个近似频率向量
𝑓̂
; - 满足误差上界:‖𝑓 - 𝑓̂‖_∞ ≤ ε ‖𝑓‖₁
- 即最大误差不超过总出现次数的 ε 倍。
# 📦 1.6 空间与时间复杂度
指标 | 复杂度 |
---|---|
时间复杂度 | 每个元素 O(1) |
空间复杂度 | O(1/ε) 个计数器 |
# 🔁 1.7 特点总结
特性 | 描述 |
---|---|
✅ 单次扫描 | 只遍历数据一次 |
✅ 确定性 | 非随机,输出固定 |
✅ 空间效率高 | 跟踪少量元素就能估计全局 |
✅ 控误差 | 误差最多 ε × 总数量 |
❌ 不可合并 | 不是线性 sketch,不能合并多个子数据流的结果 |
🧾 适用模型 | cash register model(只加不减) |
# 🧠 1.8 用途
- 找最常见的 IP 地址
- 检测最常点击的链接
- 实时舆情监控
- 高频交易流分析
# 2. 📘 Misra-Gries 与 Heavy Hitters - 幻灯片总结
# 第 1 页:Misra-Gries 算法回顾
# 📌 主要内容
Misra-Gries 是一个 sketching 算法
它可以近似记录频繁元素的信息;
但注意,不是 “线性” sketch(见第 3 点)。
不是线性 sketching 算法
意思是:不能把两个 sketch(比如两段数据流的 MG 结果)直接合并为整体结果;
限制了它在分布式或合并式处理中的应用。
输出误差保证
输出一个估计频率向量
𝜓 ∈ ℝⁿ
,满足:1
‖𝜓 - 𝜓‖∞ ≤ ε‖𝜓‖₁
其中:
‖𝜓‖₁:数据流中所有元素的总出现次数;
‖・‖∞:最大元素误差;
ε:误差容忍度;
这是在 cash register model 下成立的(只加不减)。
# 🧾 左下角范数符号说明:
‖x‖∞ = max |xᵢ|
:最大值范数;‖x‖₁ = ∑ |xᵢ|
:L1 范数(总和);
# 第 2 页:Heavy Hitters 中的范数 ℓ₁, ℓ₂, ℓ∞ 等
# 📌 不同范数的作用
ℓₚ范数定义:
1
‖𝜓‖ₚ = ( ∑ |fᵢ|ₚ )^(1/p)
# ✨ 重点范数:
符号 | 意义 |
---|---|
‖𝜓‖₀ | 非零元素个数(等价于不同元素数) |
‖𝜓‖₁ | 所有元素频率的总和(数据流总长度) |
‖𝜓‖₂ | 衡量数据流的 “方差”(振荡性) |
‖𝜓‖∞ | 最大元素的频率 |
具体相关的概念在随机算法基础文章中有记录
常用事实:
1
‖𝜓‖∞ ≤ ‖𝜓‖₂ ≤ ‖𝜓‖₁
# 💡 为什么重要?
有些算法提供
ε\2016𝜓\2016₂
误差控制;而
ε\2016𝜓\2016₁
的误差界限更宽松,因此 ℓ₂ 保证更强;选择不同 sketch 技术时,通常根据你希望控制的范数来决定使用哪种算法。
# 🔄 轻微推广(Generalization)
讲的是如何将 sketch 技术用于稍微复杂的数据结构,比如:
输入是 (element, count) 对;
最终可以保证:
1
‖𝜓‖₂ ≤ m × B
其中:
m
是不同元素数量;B
是最大计数的大小。