我之前已经知道过这样的问题,但答案有点被追踪。
我想开发一个哈希函数,它会接受一个字并吐出一个数组的地址。
所以,例如,如果你输入上帝:
对单词进行排序,d
对此执行某种功能以获取地址d o g - >一些数字
将'dog'插入array []中的some_number地址。
我似乎无法制作一个不会以某种方式搞砸的功能。
public static int hashCode(String word){
char[] x = word.toCharArray();
Arrays.sort(x);
int hash = 0;
for(int i =0; i<x.length; i++)
{
hash +=(x[i]-96)*(x[i]-96)*(x[i]-96)*(i+1)*(i+1)+i;
}
hash %=size; // get a value that's inside the bounds of the array
if(hash<0)
hash = hash + size;
return (hash);
}
这是我目前的算法,但有两个问题。
阵列大小非常大,因此没有大量的碰撞
仍有一些碰撞,例如椅子,产生:smarminess,parr,chair
你们觉得怎么样?我非常感谢你的帮助
答案 0 :(得分:2)
你的哈希函数看起来完全是任意的。你为什么要用它?
有一些常见的,众所周知的和相对较好的哈希函数,请参阅此处的说明:
答案 1 :(得分:0)
关于散列函数和冲突解决方案的研究很多。这是一个开始的地方:Hash Table
答案 2 :(得分:0)
我想 - 从你的标题和Arrays.sort(x)
函数 - 你正在寻找一个哈希函数,当两个字符串是彼此的字谜时明确地发生碰撞。它是否正确?如果是这样,您应该在问题中指定该要求。
Vinko建议的文章很好。对于您可能尝试的其他算法,我也建议使用Integer Hash Function。
祝你好运!答案 3 :(得分:0)
如果你真的想要开发一个故意碰撞所有字谜的“哈希”(换句话说,一个可以在哈希表中找到字谜),那么为什么不将字符串拆分成一个字符数组,过滤掉任何字符串您要忽略的字符(非字母)并对结果进行排序,连接然后哈希 字符串。
因此,“狗”和“上帝”都进入了“dgo”,这是所有“狗”字谜的关键。
在现代版本的Python中,所有这些措辞都可以在以下单行函数中进行总结:
def anagrash(s):
return ''.join(sorted([x for x in s.lower() if s.isalpha()]))
...您可以将其用作:
anagrams = dict()
for each in phrases:
ahash = anagrash(each)
if ahash not in anagrams:
anagrams[ahash] = list()
anagrams[ahash].append(each)
...从短语列表中构建可能的字谜词典。
然后,过滤掉所有没有找到anagram的短语:
for key,val in anagrams:
if len(val) < 2:
del anagrams[key]
所以,这是你的家庭作业。不到十几行Python。将其移植到教师正在教授的任何语言中,并将其包含在逻辑中以阅读短语并写出结果,这些都留给了学生。
答案 4 :(得分:0)
谢谢大家的帮助!对此,我真的非常感激。
Uh Clem是正确的,我并不真正理解碰撞的含义,我认为它们应该是故意的,我认为散列地址应该是绝对的,但似乎它们被用作指针到一个非常小的子集,而不是元素本身。
因此,它不是为您提供确切的住宅地址的哈希函数,而是为您提供3或4个房屋,您只需搜索一下即可。额外的房屋是碰撞。
非常感谢大家的帮助,你是一群很棒的人。