【问题标题】:Hash function to map unique array of int to an index of range 0..n哈希函数将唯一的 int 数组映射到范围 0..n 的索引
【发布时间】:2014-11-29 13:27:14
【问题描述】:

我需要将一个长度从 1 到 4 的最大排序整数映射到全局数组的索引。就像 [13,24,32] 成为 0..n 范围内的数字,并且没有其他数组映射到该相同数字。 数组的数量是几百万,并且映射必须是“唯一的”(或者至少对于较小的数组只有很少的冲突),因为这些数组表示项集,我使用 k-1 个较小的项集来构建尺寸 k。

我当前的实现使用了一个高效的散列函数,它为一个数组生成一个介于 0..1 之间的双精度数,我将项目集存储在 STL Map 中,双精度数作为键。从这篇文章中得到:

N。 D. Atreas, C. Karanikas “基于素数和散列近似的更快模式匹配算法”,2007 年

我将在 CUDA 中实现这个的并行版本,所以我不能使用像 STL Map 这样的东西。我可以轻松地为自己创建一个自平衡二叉搜索树作为 GPU 全局内存中的映射,但这会非常慢。所以为了尽量减少全局内存访问,我需要将项集映射到全局内存中的一个巨大的数组中。

我尝试将 double 转换为长整数并使用 64 位散列函数对其进行散列,但正如预期的那样,它会产生一些冲突。

所以,我问是否有一个“唯一”散列函数用于 0..1 之间的双精度数或大小为 1..4 的整数数组,它为大小为 N 的表提供唯一索引。

【问题讨论】:

  • 您正在寻找minimal perfect hash function
  • 但是我不需要提供输入来构建最小散列函数吗?我的数组会有所不同,它们是大小为 1 到 4 的单个项目数组的组合,它们也可以变化。
  • 恐怕我对它们的了解并不多于名字。我预计为数百万个元素构建这样一个函数非常耗时(也许是不可能的),尽管我可能是错的。

标签: c++ c arrays hash cuda


【解决方案1】:

如果我对您的数组做出这样的假设:

each item of your arrays (such as 13) are 32-bit integers.

那么你问的就是不可能的。

您至少有 2^(32*4) 个可能的值,即 128 位。而且您正试图将它们打包成一个更小的数组(一百万个条目为 20 位)。你不能在没有冲突的情况下做到这一点(或者元素之间存在一些协议,例如每个元素选择“下一个可用索引”,但这不是哈希)。

【讨论】:

  • 这些是可能的值,但只有几千万。实际上,这些数组元素可以是一个短整数,因为值不会超过 10000。我并不是真的在寻找完美的哈希,因为这需要数据输入,而是类似于我提到的文章中的算法,它只会在多次哈希后产生冲突。对于我的测试数据,它就像一个完美的哈希,因为我用很多测试用例测试了它并且没有冲突。问题是这个哈希是双精度的,我希望有人能给我一个索引。
猜你喜欢
  • 2013-07-29
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多