微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

良好的散列功能

如何解决良好的散列功能

我正在寻找一个哈希表来存储一些我需要快速访问的数据,而不是遍历链表,并且在定义一个好的哈希函数时遇到了问题。

将S视为哈希表。

我用标签(0,...,0)和S [1 w 1 ]初始化S [1 0 ] = (v1 1 ,v1 2

然后我有两个循环,j = 2到N,a = 0到W。

N和W可以是任何正整数。

在那里,我做S [j a ] = addSomeDifferentStuff(S [(j-1) a ]),创建节点S [j 一个]。

我真的找不到不产生冲突的哈希函数,我的一个朋友建议使用hash = j + a * W。

有什么建议吗?

更新:

好的,所以我要澄清一下。这是基于标签算法的双标准0.1背包问题解决方案的实现,该算法将背包问题转换为最短路径问题。 W是我的能力,n是项目数。考虑w j 在项目j中的权重。

在循环中,我正在验证是否可以添加该项,如果是,则将使S [j a ] = S [(j-1) aw j ] +值[j 1 ,j 2 ],否则我只复制S [j a ] = S [(j-1) a ]。但是,通过链接访问S [(j-1) a ]或S [(j-1) aw j ]中的标签非常昂贵列出,因为我需要遍历每个元素直到找到它。这就是哈希表的目的。

解决方法

N和W可以是任何正整数。

那肯定会带来可计算性问题。您似乎在问如何为由分别从0 ... N和0 ... W范围绘制的整数对组成的对象构造完美的哈希函数。这样的函数必须计算List.size()个不同的值,并且N和W的界限会影响合适的数据类型和算法。

也请注意,将键视为整数,而不是整数 powers 可能是最有用的,因为N和W不需要获取在涉及的功能太大之前就变得非常大,以至于无法用您的实现提供的任何内置类型来表示。两对将更易于在多个级别上使用。

我的一个朋友建议使用hash = j + a * W。

我想你的朋友的意思是hash(j,a)= j + a *(N +1)。前提是它不会溢出,对于从指定范围得出的每对(j,a),将产生不同的值。另外,您也可以使用hash(j,a)= j *(W + 1)+ a,但要遵守有关溢出的相同条件。如果确实确实需要在您描述的整个域上具有完美的哈希函数,那么在性能方面,我看不到有太多改进的余地,除非可以通过用适当大的左移代替乘法。 >

这些函数的值确实会以完全系统的方式随a和j的变化而变化,这对于这种函数的某些使用将是不希望的特性。找到一个不具有该属性的完美哈希函数是一个难题。通常,人们会使用诸如gperf之类的程序来完成这项任务,但该程序不适合动态适应N和W的不同值。


请注意,尽管这回答了我认为您实际提出的问题,但我不确定这不是您真正想要的。由于您似乎已经拒绝将我对(N + 1) * (W + 1)的描述视为哈希表的数组,而不是回到单一的哈希表,我怀疑“哈希表”一词的含义与我的含义有所不同。不过,我想问的是有关散列函数的问题,您对该函数的使用是一个单独的问题。

,

也许可以同时查看https://github.com/Cyan4973/xxHash的xxHash及其竞争哈希函数列表。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。