PrepStack · Markdown HTML

频次表 / 坐标计数

前缀、差分与哈希状态 · HTML

数学 / 逻辑形态

构造 count[x]=|{i:a[i]=x}|。后续答案只通过键与频次计算;消费一个实例时 decrement,归零时可删除键。

识别信号

容易误判的相似信号

SignalWhy it is different
相邻顺序决定答案频次会丢失位置和排列信息,不能处理依赖顺序的模式。
巨大稠密数组值域不要按最大值开超大数组;用哈希或坐标压缩。

核心不变量

处理扫描前缀后,count[x] 精确等于其中 x 的出现次数;所有频次非负,其总和等于已计入元素数减已消费数。

状态、转移与处理顺序

ItemDefinition
Statekey→count 的数组/字典,可选的 distinct、最大频次或桶。
Transition读入 x 时 count[x]+=1;匹配/消费时在验证正频次后减 1,必要时删除零键。
Frontier / order已扫描元素被压缩成频次表;键域而不是输入索引成为后续遍历前沿。

Python 骨架

def multiset_equal(left, right):
    if len(left) != len(right):
        return False
    count = {}
    for value in left:
        count[value] = count.get(value, 0) + 1
    for value in right:
        remaining = count.get(value, 0)
        if remaining == 0:
            return False
        if remaining == 1:
            del count[value]
        else:
            count[value] = remaining - 1
    return not count

正确性思路

  1. 第一遍后 count 是 left 多重集合的精确表示。
  2. 第二遍每个 right 元素必须消费一个同值实例;缺少实例时立即证明不等。
  3. 等长且所有消费完成后表为空,当且仅当两侧每个键频次相同。

复杂度

TimeSpaceParameters
期望 O(n+m)O(k)n、m 为输入长度,k 为不同键数;有限小值域数组计数可给确定 O(1) 访问。

边界条件

错误模式

PatternWhy it fails / fix
使用 set 丢掉重数{a,a,b} 与 {a,b,b} 的 set 相同但多重集合不同。
归零键不删除却用 len(count)若 distinct 依赖字典长度,零频键必须删除。
按值域开不可控数组max-min 巨大时空间爆炸,应改哈希。

选择与排除规则

相关模板

RelationTemplateBoundary
哈希基础数据结构设计 / 操作不变量API 主要维护键到计数
规范键计数GCD / LCM 与整除结构按化简比例分组
optimization-context0/1 / 完全背包 DP大量同重量物品可先按频次分组再处理有界使用。
同哈希不同对象前缀状态 + 哈希频次计数对象从元素值变为历史前缀状态。
因子计数筛法与质因数分解聚合每个质因子的出现次数
周期摘要显式模拟 / 状态机状态只由有限计数分布决定
窗口状态组件可变长滑动窗口频次表只描述当前连续窗口。
频率排序Top-K 有界堆从 count 中选择最高频的 k 个键。
alternative双堆维护数据流中位数值域小且要频繁插入、删除与秩查询。
无序值域替代相向双指针有限值域计数可直接匹配互补值。
去重辅助同向双指针 / 读写指针保留规则依赖全局出现次数。

原创微型例子

环节内容
Result两者多重集合相等,尽管顺序不同。
Setup比较 [r,r,s] 与 [s,r,r]。
Trace左表 {r:2,s:1};右侧依次消费后为空。

Recall prompts

我的补充