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

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是一个类对象。

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

最佳答案

只需查看存储在该索引中的对象即可。如果由于碰撞而不得不移动索引,也请检查这些索引。如果它们与您要存储的内容匹配,请抛出异常或其他内容。

我正在猜测您的代码,所以...

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;

}

关于c++ - 防止重复输入哈希表C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1569085/

10-13 08:10