动态多重集字典的构建与分析
1. 稀疏情况的动态多重集字典
当 $\log(u/n) = \omega(\log \log n)$ 时,存在一个简洁的动态多重集字典,并且在最坏情况下能以常数时间支持操作。
实现采用两个字典 $D_1$ 和 $D_2$(每个都带有附属数据)。$D_1$ 的空间为 $(1 + o(1)) \cdot ((\log(u/n) + 3 \log \log n) \cdot n + O(n)$,$D_2$ 的空间为 $(1 + o(1)) \cdot ((\log((u \log^3 n)/n) + \log n) \cdot \frac{n}{\log^3 n} + O(\frac{n}{\log^3 n}) = o(\log(u/n) \cdot n)$。所以,多重集字典 $MS - Dict(n)$ 的空间为 $(1 + o(1)) \cdot ((\log(u/n) + 3 \log \log n) \cdot n + O(n)$。在稀疏情况下,每个元素的空间下界是 $\log(u/n)$ 位,因此得到的 $MS - Dict(n)$ 是简洁的。
另一种替代方案是将重数存储在一个数组中,与存储多重集支持集的字典分开。设 $s$ 表示多重集支持集的基数,$h : U \to [s + o(s)]$ 是一个动态完美哈希函数,需要 $\Theta(s \log \log s)$ 位并能以常数时间支持操作。将元素 $x$ 的可变长度二进制计数器存储在数组的索引 $h(x)$ 处。该数组可以在线性于计数器总长度的空间内实现,并能以常数时间支持查询和更新操作。
2. 密集情况的多重集字典
当 $\log(u/n) =
超级会员免费看
订阅专栏 解锁全文
411

被折叠的 条评论
为什么被折叠?



