防止重复进入HashTable C ++

时间:2009-10-14 21:22:41

标签: c++

我想知道我是否可以获得一些帮助以防止重复输入我的哈希表:

bool hashmap::put(const stock& s, int& usedIndex, int& hashIndex, int& symbolHash)
{
    hashIndex = this->hashStr( s.m_symbol ); // Get remainder, Insert at that index.
    symbolHash = (int&)s.m_symbol;
    usedIndex = hashIndex;

    while ( hashTable[hashIndex].m_symbol != NULL ) // collision found
    {
        ++usedIndex %= maxSize; // if necessary wrap index around
        if ( hashTable[usedIndex].m_symbol == NULL )
        {
            hashTable[usedIndex] = s;
            return true;
        }
    }
    hashTable[hashIndex] = s; // insert if no collision 
    return true;

}

参数hashIndex使用java算法生成适当的索引以插入表中。 usedIndex参数是我在发现碰撞时插入表中的位置; symbolHash只获取传入的名称的地址.stock是一个类对象。

我的问题是,我如何防止重复输入?

3 个答案:

答案 0 :(得分:2)

当您检测到碰撞时,您知道条目哈希为相同的值。

此时将您插入的条目与使用相同散列存储的所有条目进行比较。如果已存储的任何条目等于您要插入的条目,请不要插入它。

答案 1 :(得分:1)

只需查看您在该索引中存储的对象。如果由于碰撞而必须移动索引,那么也要检查。如果它们与您要存储的内容相匹配,则抛出异常或其他内容。

我猜测你的代码......

bool hashmap::put(const stock& s, int& usedIndex, int& hashIndex, int& symbolHash)
{
    hashIndex = this->hashStr( s.m_symbol ); // Get remainder, Insert at that index.
    symbolHash = (int&)s.m_symbol;
    usedIndex = hashIndex;

    if(hastTable[usedIndex].m_symbol == s.m_symbol){
        return false;
    }
    while ( hashTable[hashIndex].m_symbol != NULL ) // collision found
    {
            ++usedIndex %= maxSize; // if necessary wrap index around
            if ( hashTable[usedIndex].m_symbol == NULL )
            {
                    hashTable[usedIndex] = s;
                    return true;
            }else if(hastTable[usedIndex].m_symbol == s.m_symbol){
                 return false;
            }
    }
    hashTable[hashIndex] = s; // insert if no collision 
    return true;

}

答案 2 :(得分:1)

相同数据的哈希值相同。除非您另外处理(通过查找未使用的索引),否则将在同一位置插入相同的内容。

如果要插入的数据的散列与现有数据的散列之间发生冲突,请检查数据是否匹配(因为如果数据匹配,则散列匹配)。每次碰撞都会进行检查,因此在迭代时需要检查数据。

if循环中的while之后,添加一个if hashTable[usedIndex] == s的检查,如果该条件为真则重复(所以请按照您的意愿处理,例如替换或抛出除外)。

您可能希望将if的内部内容替换为break;,因此代码不会重复。您还需要检查是否usedIndex == hashIndex,因为您可能会遇到无限循环。