Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 链式哈希表与Deflate_C#_Algorithm_Compression - Fatal编程技术网

C# 链式哈希表与Deflate

C# 链式哈希表与Deflate,c#,algorithm,compression,C#,Algorithm,Compression,我目前正在尝试用C#创建一个自定义实现 我目前正在尝试实现“模式搜索”部分,其中我有(最多)32k的数据,并且正在尝试为我的输入搜索尽可能长的模式 定义Deflate的方法说明了该过程: 压缩器使用链式哈希表查找重复字符串, 使用对3字节序列进行操作的哈希函数。无论如何 在压缩过程中的给定点,让XYZ成为要压缩的下3个输入字节 被检查(当然不一定完全不同)。首先是 压缩器检查XYZ的哈希链。如果链条是空的, 压缩器只是将X作为一个文本字节写出,然后向前推进一个 输入中的字节。如果哈希链不是空的,

我目前正在尝试用C#创建一个自定义实现

我目前正在尝试实现“模式搜索”部分,其中我有(最多)32k的数据,并且正在尝试为我的输入搜索尽可能长的模式

定义Deflate的方法说明了该过程:

压缩器使用链式哈希表查找重复字符串, 使用对3字节序列进行操作的哈希函数。无论如何 在压缩过程中的给定点,让XYZ成为要压缩的下3个输入字节 被检查(当然不一定完全不同)。首先是 压缩器检查XYZ的哈希链。如果链条是空的, 压缩器只是将X作为一个文本字节写出,然后向前推进一个 输入中的字节。如果哈希链不是空的,则表示 序列XYZ(或者,如果我们不走运的话,用 最近发生了相同的哈希函数值),压缩器 将XYZ哈希链上的所有字符串与实际输入数据进行比较 从当前点开始的序列,并选择最长的 匹配

我知道什么是哈希函数,也知道什么是哈希表。但是什么是“链式哈希表”,如何设计这样一个结构来处理大量数据?不幸的是,我不明白RFC中描述的结构是如何工作的

我可以选择什么样的散列函数(有什么意义)


提前谢谢你

在本例中,它们描述了一个哈希表,其中每个元素都包含一个字符串列表——在本例中,所有字符串都以指定的三个字符前缀开头。您应该能够简单地使用标准的.net哈希表或字典原语——不需要复制它们的确切实现细节


32k不是很多数据,因此您不必担心扩展哈希表-即使这样,内置原语也可能比您自己编写的任何东西都更有效。

在本例中,它们描述的是一个哈希表,其中每个元素都包含一个字符串列表-在本例中,以指定的三个字符前缀开头的所有字符串。您应该能够简单地使用标准的.net哈希表或字典原语——不需要复制它们的确切实现细节


32k不是很多数据,因此您不必担心扩展哈希表-即使这样,内置的原语也可能比您自己编写的任何东西都更有效。

链式哈希表是一个哈希表,它存储您放入其中的每个项目,即使两个项目的键散列到相同的值,或者即使两个项目具有完全相同的键

DEFLATE实现需要以无特定顺序存储一组(键、数据)项,并快速查找具有该键的所有项的列表。 在这种情况下,键是3个连续字节的未压缩明文,数据是指向明文中3字节子字符串所在位置的某种指针或偏移量

许多哈希表/字典实现同时存储每个项的键和数据。 对于DEFLATE,不需要将键存储在表中,但除了在压缩过程中使用稍多的内存之外,这不会造成任何影响

一些HabStabor或字典实现,如C++ STL<代码> unordeDePald坚持认为存储的每个(密钥、数据)项都必须有唯一的密钥。当您尝试存储另一个(键、数据)项时,该项与表中已有的某个旧项具有相同的键,这些实现会删除旧项并用新项替换它。 这会造成伤害——如果你意外地使用C++ STL <代码> unordeDeMalp> <代码>或类似的实现,压缩文件将比使用更合适的库(如C++ STL<代码> HASHMultIAP)要大。 这种错误可能很难检测,因为产生的(不必要的大)压缩文件可以由任何标准的DEFLATE压缩器正确地解压缩到与原始文件完全相同的文件位。 DEFLATE和其他压缩算法的一些实现故意使用这种实现,故意牺牲压缩文件大小以获得压缩速度

正如Nick Johnson所说,在标准“哈希表”或“字典”实现中使用的默认哈希函数可能已经足够了


链式哈希表是一个哈希表,它存储您放入其中的每个项目,即使两个项目的键哈希为相同的值,或者即使两个项目具有完全相同的键

DEFLATE实现需要以无特定顺序存储一组(键、数据)项,并快速查找具有该键的所有项的列表。 在这种情况下,键是3个连续字节的未压缩明文,数据是指向明文中3字节子字符串所在位置的某种指针或偏移量

许多哈希表/字典实现同时存储每个项的键和数据。 对于DEFLATE,不需要将键存储在表中,但除了在压缩过程中使用稍多的内存之外,这不会造成任何影响

一些HabStabor或字典实现,如C++ STL<代码> unordeDePald坚持认为存储的每个(密钥、数据)项都必须有唯一的密钥。当您尝试存储另一个(键、数据)项时,该项与表中已有的某个旧项具有相同的键,这些实现会删除旧项并用新项替换它。 这会造成伤害——如果你意外地使用C++ STL <代码> unordeDeMalp> <代码>或类似的实现,压缩文件将比使用更合适的库(如C++ STL<代码> HASHMultIAP)要大。 这种错误可能很难检测,因为产生的(不必要的大)压缩fil