我想知道我是否可以获得一些帮助以防止重复输入我的哈希表:
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是一个类对象。
我的问题是,我如何防止重复输入?
答案 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
,因为您可能会遇到无限循环。