【发布时间】:2021-02-15 17:56:12
【问题描述】:
我正在寻找一个哈希表来存储一些我需要快速访问的数据,而不是遍历链表,我在定义一个好的哈希函数时遇到了问题。
将 S 视为哈希表。
我用标签 (0,...,0) 初始化 S[10] 和 S[1w1] = (v11,v12)
然后我有两个循环,j=2 到 N,a=0 到 W。
N 和 W 可以是任意正整数。
在那里,我做 S[ja] = addSomeDifferentStuff(S[(j-1)a]),创建节点 S[j一个]。
我真的找不到不会产生冲突的哈希函数,我的一个朋友建议 hash = j + a * W。
有什么建议吗?
更新:
好的,所以我要澄清一下自己。这是基于将背包问题转换为最短路径问题的标记算法的双准则 0.1 背包问题的解决方案的实现。 W 是我的容量,n 是项目数。考虑 wj 项目 j 的权重。
在循环内部,我正在验证是否可以添加该项目,如果可以,那么我将 S[ja] = S[(j-1) awj] + values[j1,j2],否则我只是复制 S[ja ] = S[(j-1)a]。但是使用链接访问 S[(j-1)a] 或 S[(j-1)awj] 中的标签很昂贵列表,因为我需要遍历每个元素,直到找到它。这就是哈希表的目的。
【问题讨论】:
-
不是我的头,但是有一些关于算法的书籍,它们对哈希函数有很好的起点。您应该只取其中一个并通过您的数据运行它以首先尝试。
-
如果哈希空间小于输入空间,所有哈希函数都会产生冲突。
-
对不起,但我不确定我是否遵循您的符号或算法描述。您是否在按位和运算符的正常 C 意义中使用
^符号?如果S是哈希表,那么我不明白你为什么要根据其他元素的值来计算它的元素。 -
另外,我不遵循循环的目的。我想他们正在生成要存储在哈希表中的对象,但是这些对象是什么?值
j^a?如果是这样,那么您确实意识到,您生成的不同值比 (j,a) 对少吗? -
更正:
^作为按位异或。抱歉,来晚了。
标签: c hashtable hash-function