【发布时间】:2011-07-26 14:14:22
【问题描述】:
我目前正在尝试在 C# 中创建自定义 Deflate 实现。
我目前正在尝试实现“模式搜索”部分,其中我拥有(最多)32k 数据,并且正在尝试为我的输入搜索最长的模式。
定义 Deflate 的 RFC 1951 说明了该过程:
压缩器使用链式哈希表来查找重复的字符串, 使用对 3 字节序列进行操作的哈希函数。在任何 压缩期间的给定点,让 XYZ 成为接下来的 3 个输入字节 进行检查(当然,不一定完全不同)。首先, 压缩器检查 XYZ 的哈希链。如果链是空的, 压缩器只是简单地将 X 写成一个字面字节并前进一个 输入中的字节。如果哈希链不为空,说明 序列 XYZ (或者,如果我们不走运,其他一些 3 个字节与 相同的哈希函数值)最近发生了,压缩机 将 XYZ 哈希链上的所有字符串与实际输入数据进行比较 从当前点开始的序列,并选择最长的 匹配。
我知道哈希函数是什么,也知道哈希表是什么。但是什么是“链式哈希表”?如何将这种结构设计为高效(在 C# 中)处理大量数据?不幸的是,我不明白 RFC 中描述的结构是如何工作的。
我可以选择什么样的哈希函数(什么是有意义的)?
提前谢谢你!
【问题讨论】:
-
维基百科回答你的问题;无论如何,“chained”是用来描述哈希冲突解决策略的。 (哈希条目“指向”映射到它的键)
-
@lijie 好的,但我仍然不明白如何查找所有数据。考虑模式“A B B C A B B C A”,哈希表会是什么样子?前三个元素(分别是它们的哈希)“ABB”需要一个存储桶,但值是多少?只有 C 的哈希? BBC的哈希?以及插入新元素后丢弃第一个元素时的移位操作是如何进行的?
-
呃...桶和密钥之间存在差异...可能许多密钥映射到同一个哈希桶...内容是密钥(在这种情况下是三元组).. . 所以你所指的“价值观”应该是这些三元组
标签: c# algorithm compression