数据结构与网络协议中的优化策略
1. 前缀树节点压缩
前缀树(Trie)是一种节点树状的数据结构,每个节点是一个包含 M 个元素的数组。在网络领域,前缀树可用于 IP 地址查找、桥接查找和多路分解过滤等任务。
1.1 前缀树搜索过程
设 $c = log_2 M$ 为前缀树的块大小。搜索前缀树时,先将输入字符串拆分为大小为 c 的块,从最高有效位开始,依次使用这些块对前缀树的节点进行索引,从根节点开始。当使用块 j 索引当前前缀树节点的位置 i 时,位置 i 可能包含指针或键。若位置 i 包含指向节点 N 的非空指针,则搜索继续在节点 N 上使用块 j + 1;否则,搜索终止。
然而,若许多前缀树节点稀疏,会造成大量空间浪费。例如,在某些情况下,16 个位置中只有 4 个包含有用信息,最坏情况下,每个前缀树节点可能仅包含 1 个指针或键,导致内存浪费达到 M 倍。
1.2 节点压缩问题与解决方案
为解决空间浪费问题,一种简单的方法是将每个前缀树节点替换为形式为 (i, val) 的线性对列表,其中 val 是节点位置 i 中的非空值(指针或键)。但这会使前缀树搜索速度减慢 M 倍,因为现在每个节点的搜索可能需要遍历 M 个位置的列表,而非单个索引操作。
因此,问题变为如何在不使搜索速度减慢太多的情况下压缩前缀树节点以去除空指针。由于 M < 32,可使用大小为 32 的位图轻松放入计算机字中。通过添加位图,零位表示空指针的原始位置,去除空指针。前缀树节点现在可替换为位图和压缩前缀树节点,压缩前缀树节点是仅包含原始节点中非空值的数组。
搜索前缀树节点时,由于搜索从对未压
超级会员免费看
订阅专栏 解锁全文

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



