【问题标题】:Making a 'hash' of two floats制作两个浮点数的“哈希”
【发布时间】:2023-03-20 21:07:01
【问题描述】:

我有两个 32 位浮点数。我想记录这两者的任何组合发生的频率。从技术上讲,我可以通过将它们连接成一个字符串并使用常规哈希映射来跟踪计数来做到这一点,但是在我的应用程序中这样做的开销是相当大的,所以我在想是否有更好的方法。我不需要保持 32 位浮点数的完整精度,而且我知道一个数字永远不会 > 10,另一个永远不会 > 100。所以我可以在技术上将第一个乘以 10000,将第二个乘以 1000,投将结果转换为 int 以截断逗号后的任何内容,将第一个 nr 16 位移位并将它们 & 一起变成一个整数。然后我可以分配一个由 MAX_INT 元素组成的数组,并使用我刚刚创建的整数作为该数组的索引。

但是,这会给我留下一个 2GB 的数组,其中大部分是空的,所以我想避免这种情况。我想知道是否有任何散列算法以更复杂的方式解决这个问题,或者任何以“分层”方式工作的数据结构,比如首先对每个第一个数字的组合进行查找的树数字,然后是第二个数字,依此类推,这样就不需要为任何未知的组合分配空间。 (这种确切的方法可能存在问题,这只是我正在考虑的方向的一个例子)。或者任何其他方式也可以 - 就像将两个浮点数散列在一起的更复杂的方式一样,结果在 0 和某个数字之间缩放,选择那个“某个数字”会给我一种方法调整内存中查找表的最大大小。

有什么想法吗?

【问题讨论】:

  • 您应该使用字典(哈希表、哈希映射...)。您问的是哪种语言?
  • 像 trie 这样的数据结构怎么样?
  • 这听起来像是布隆过滤器的一个很好的用例:en.wikipedia.org/wiki/Bloom_filter(还要注意,乘以浮点数可能无法保持您正在寻找的准确性)
  • 我同意@trincot。听起来你把它复杂化了。在许多语言中,一个简单的哈希映射可以使用浮点数作为键,甚至是一对浮点数。
  • 你没有说你有多少元素或者它们的分布是什么样的。在这 2GB 中,有多少单元格会被填充?计数的分布是什么样的?既然浮点数可能会出现精度错误,为什么还要比较它们呢?

标签: algorithm hash


【解决方案1】:

您可以将浮点数复制到一个缓冲区,然后散列该缓冲区,如下所示(这是 c/c++):

int hashNumbers(float a, float b){
    char bytes[2 * sizeof(float)];

    memcpy(bytes, &a, sizeof(float));
    memcpy(bytes + sizeof(float), &b, sizeof(float));

    //I don't know your implementation of the actual hash function
    return hash(bytes, 2 * sizeof(float)); //assuming the hash function would take in an array of bytes with its size.
    //I don't know it's output type here. I'm assuming it's an int.
}

至于您的 has 函数,您可以使用模数,例如,如果您只采用具有 2^32 种可能性的 int 并且执行x = x % 100,那么您将有 100 种可能性来判断 x 可能是什么。

如果你取的不是 100,而是 2 的幂(2、4、8、16 等)。您可以通过使用bitwise operations 而不是使用模数来加速此过程。通过这样做:x = x >> 24。你现在只有 256 种 x 的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 2014-04-18
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多