使用浮点数/双打的Hashtables / Dictionaries

时间:2009-06-03 17:59:44

标签: data-structures dictionary hashtable

我在某处读到了类似于哈希表,字典的其他数据结构但不是使用整数,而是使用浮点数/双精度等等。

任何人都知道它们是什么?

4 个答案:

答案 0 :(得分:8)

如果你的意思是在你的哈希中使用浮点数/双打作为键,这很容易。例如,在.NET中,它只使用Dictionary<double,MyValueType>

如果你所说的哈希是基于double而不是int ....

从技术上讲,您可以将任何元素作为内部哈希。通常,这是使用int或long完成的,因为它们很快,并且散列算法很容易计算。

然而,哈希真的只是一个BitArray,所以任何事情都可行。除了可能允许更大的哈希值集合(例如:如果你的哈希值为8字节或更大的类型),制作除int或long以外的东西确实没有多大优势。

答案 1 :(得分:6)

你的意思是钥匙?这让我觉得很棘手。

如果你将它们用作任意键,它们并不比整数更好。

如果您希望计算浮点值并使用它在哈希表中查找某些内容,那么您的生活非常危险。浮点数不具有无限精度,并且以两种略微不同的方式计算相同的事物可能导致结果中的微小差异。散列键依赖于每次都得到完全相同的东西,所以你必须小心圆,并且在任何时候都以完全相同的方式进行舍入。顺便说一句,这比它听起来更棘手。

那么,你会用浮点哈希做什么?

答案 2 :(得分:2)

一般而言,哈希算法只是一个从较大输入产生较小输出的函数。良好的散列函数具有有趣的属性,例如输入中的小变化输出的大变化,并确保它们为某些输入产生每个可能的输出值。

编写一个输出浮点值而不是整数值的简单多项式散列函数并不难,但很难确保生成的散列函数具有所需的属性而无需深入了解特定的细节使用浮点表示法。

至少部分原因是散列函数几乎总是在整数运算中实现,因为证明有关整数计算的各种属性比对浮点计算执行相同操作更容易。

很容易证明某些(素数因子的总和)模(另一个素数)必然必然会为某些输入产生每个可能的输出。对一堆浮点分数进行计算也是如此。

再加上存储和传输浮点值而没有损坏的相对困难,这是不值得的。

答案 3 :(得分:0)

您的问题历史记录显示您使用.Net,因此我将在该背景下回答。

如果您想要一个可识别类型的词典,以便您可以指定它应使用浮点数或双精度值或键值,请使用System.Collections.Generic.Dictionary<T, U> http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

如果你想要一个类型为盲的词典,这样你就可以使用浮动和双精度来获得键和值,使用System.Collections.HashTable http://msdn.microsoft.com/en-us/library/system.collections.hashtable.aspx

相关问题