Anagram Hash函数

时间:2009-11-20 23:06:42

标签: java hash hashtable

我之前已经知道过这样的问题,但答案有点被追踪。

我想开发一个哈希函数,它会接受一个字并吐出一个数组的地址。

所以,例如,如果你输入上帝:

  1. 对单词进行排序,d

  2. 对此执行某种功能以获取地址d o g - >一些数字

  3. 将'dog'插入array []中的some_number地址。

  4. 我似乎无法制作一个不会以某种方式搞砸的功能。

      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

    你们觉得怎么样?我非常感谢你的帮助

5 个答案:

答案 0 :(得分:2)

你的哈希函数看起来完全是任意的。你为什么要用它?

有一些常见的,众所周知的和相对较好的哈希函数,请参阅此处的说明:

http://www.azillionmonkeys.com/qed/hash.html

另见https://stackoverflow.com/questions/263400#263416

答案 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个房屋,您只需搜索一下即可。额外的房屋是碰撞。

非常感谢大家的帮助,你是一群很棒的人。