2016-11-29 55 views
2

我正在为我的数据结构类创建自己的哈希表adt,并且遇到了一个问题。我用下面的函数来散列(键,值)在我的哈希表条目(关键是一个字符串,该值可以是任何数据类型,它是通用的):调整大小后未找到散列表中的旧元素?

private int hashCode(String key) 
{ 
    final int constant = 37; 
    int hash = 0; 

    for(int i=0;i<key.length();i++) 
    { 
     hash+=(int)key.charAt(i) * Math.pow(constant,i); 
    } 
    return hash; 
} 
private int hash(String key) 
{ 
    return hashCode(key) % capacity 
} 

使用线性探测插入件成表工作正常,但是如果我选择展开表散列(Key)的功能将不能充分的哈希表的GET(键)操作的能力已经改变工作(它会映射到不正确的位置之前,当它正确映射的表扩展名)。有没有什么简单的方法可以编辑这个考虑到散列表的扩展,可以说是两个因素。即:如果负载因子> 0.5增加2 *表的容量。

+0

重散列所有键调整大小后阵是一种常见的做法。你可能想看看你的教科书中有关如何完成的更深入的解释。 – 4castle

回答

3

一般来说,当您老调重弹一个哈希表,您需要通过遍历所有的元素在哈希表并重新分配根据它们的散列码,让他们在适当的位置结束。这通常需要比调整正常大小更多的时间,但否则表格无法正常工作。

另一种方法是使用不同的冲突解决方案,像extendible hashing,是专门建造,以避免将它们放在后感动的事情,但由于我在实践中只是线性多么盲目快速探测散列想象这种设置的放缓可能会不值得。

+0

好吧,我添加了一个重新分配函数来重新分配所有数据,一旦需要重新散布。感谢您的帮助! – JmanxC