2

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

有谁知道它们是什么?

4

4 回答 4

8

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

如果您正在谈论让哈希基于 double 而不是 int....

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

但是,哈希实际上只是一个 BitArray,所以任何事情都可以。除了可能允许更大的散列值集(即:如果您为散列使用 8 字节或更大的类型)之外,将其设置为 int 或 long 确实没有太多优势。

于 2009-06-03T18:05:46.377 回答
6

你是说钥匙?这让我觉得很棘手。

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

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

那么,您将如何处理浮点哈希?

于 2009-06-03T18:24:16.213 回答
2

一般来说,散列算法只是一个从较大输入中产生较小输出的函数。良好的散列函数具有有趣的特性,例如输入的微小变化导致输出的大变化,以及确保它们为某些输入产生每个可能的输出值。

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

哈希函数几乎总是在整数运算中实现的至少部分原因是因为证明整数计算的各种属性比对浮点计算做同样的事情更容易。

证明某些(素因数之和)模(另一个素数)必须为某些输入产生所有可能的输出是相当容易的。对一堆浮点分数的计算做同样的事情会很麻烦。

再加上在不损坏的情况下存储和传输浮点值的相对困难,这是不值得的。

于 2009-06-03T18:36:37.143 回答
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

于 2009-06-03T18:06:48.620 回答