我在练习实现哈希函数。我尝试使用线性探测在哈希表中插入。插入工作正常,但我对递归不满意。感觉不像是“好的递归”。Linear_Probing函数不是递归函数本身,而是使用另外两个函数(不包括哈希函数)进行递归插入:Index_Finder()及其辅助函数。
在这段代码中,有什么方法可以更好地将递归插入到哈希表中?
int Hash(int number); //<Hash function returns index by adding the first and last digit of a number;
bool Linear_Probing(int array[], bool flags [], int MAX_SIZE, int number, int &collisions); //<This function if possible inserts the number in the Hash Table
int Index_Finder(int number, bool flags[], int MAX_SIZE, int &collisions); //<This function finds the index where the number should be inserted. It returns -1 if no empty slot is found.
int Index_Finder(bool flags[], int MAX_SIZE, int index, int limit, int &collisions); //<This is an auxilary function
int main()
{
const int MAX_SIZE = 11;
int collisions = 0;
int array[MAX_SIZE];
bool flags[MAX_SIZE];
for (int i = 0; i < MAX_SIZE; i++)
{
array[i] = 0;
flags[i] = false;
}
//<Inserting numbers in hash table using linear probing
Linear_Probing(array, flags, MAX_SIZE, 67, collisions);
Linear_Probing(array, flags, MAX_SIZE, 19, collisions);
Linear_Probing(array, flags, MAX_SIZE, 3, collisions);
Linear_Probing(array, flags, MAX_SIZE, 808, collisions);
Linear_Probing(array, flags, MAX_SIZE, 337, collisions);
Linear_Probing(array, flags, MAX_SIZE, 1, collisions);
Linear_Probing(array, flags, MAX_SIZE, 86, collisions);
Linear_Probing(array, flags, MAX_SIZE, 38, collisions);
return 0;
}
bool Linear_Probing(int array[], bool flags[], int MAX_SIZE, int number, int &collisions)
{
int dummy_collisions = 0;
int index = Index_Finder(number, flags, MAX_SIZE, dummy_collisions);
if (index == -1)
return false;
else
{
collisions += dummy_collisions;
array[index] = number;
flags[index] = true;
return true;
}
}
int Index_Finder(int number, bool flags[], int MAX_SIZE, int &collisions)
{
int index = Hash(number);
if (index < MAX_SIZE && !flags[index])
return index;
if (index >= MAX_SIZE)
{
index = 0;
if (!flags[index])
return index;
else
collisions++;
}
else
{
collisions++;
}
int limit = index;
return Index_Finder(flags, MAX_SIZE, ++index, limit, collisions);
}
int Index_Finder(bool flags[], int MAX_SIZE, int index, int limit, int &collisions)
{
if (limit == index)
return -1;
if (index == MAX_SIZE)
index = 0;
if (!flags[index])
return index;
else
{
collisions++;
return Index_Finder(flags, MAX_SIZE, ++index, limit, collisions);
}
}
int Hash(int number)
{
int first_digit = 0, last_digit = 0;
bool first_time = true;
while (number > 0)
{
if (first_time)
{
first_digit = number % 10;
number -= (number % 10);
number /= 10;
first_time = false;
}
else
{
last_digit = number % 10;
number -= (number % 10);
number /= 10;
}
}
return (first_digit + last_digit);
}发布于 2014-12-26 17:37:21
std::fill_n():std::fill_n( MAX_SIZE,0);std::fill_n(标志、MAX_SIZE、false);虽然它在较小的程序中可能不重要,但它仍然更简洁,更安全。std::vector (动态)或std::array (静态)。选择为你完成工作的最佳人选。发布于 2014-12-26 20:20:06
std::array或std::vector的另一个优点是可以丢弃同名的MAX_SIZE常量和函数参数,因为标准容器通过size()方法知道它们的长度。MAX_SIZE,对于常量来说,所有大写大写都很好,但不应该在其他地方使用,因为这种表示法经常与常量和宏相关联,因此使用它作为函数参数名可能会引起混淆。if/else对时,例如: if (索引== -1)返回false;否则,{== += dummy_collisions;数组索引= number;标志索引= true;返回true;}不要使其成为if/else链。只需返回第一个if并省略else语句。这将避免不必要的嵌套。return 0在main()末尾是可选的。如果省略它,编译器默认为return 0。PascalCase应用于函数名,而不需要在单词之间加上下划线。camelCase和snake_case也非常流行于方法命名。发布于 2014-12-26 23:23:39
Index_Finder,甚至没有理由将其作为一个独立于insert的函数;它只是一个简单的迭代循环。考虑在插入函数中这样做: bool插入(int,size_t&冲突){ size_t start = n % mValues.size();//或对散列函数的调用等等。size_t pos =开始;size_t= 0;do { if (!mOccupancy位置) { mValues位置 = n;mOccupancy位置 = true;返回true;} ++collisions;pos = (pos + 1) % mValues.size();} while (pos != start);返回false;}这实现了简单的线性探测,作为insert的一部分,而不需要任何疯狂的代码流。https://codereview.stackexchange.com/questions/74935
复制相似问题