我正在了解散列表的工作方式,因此我理解散列函数如何计算一个唯一的(为了这个问题的目的)散列表值与存储值一起使用,所以当搜索存储的值时哈希函数为计算机提供哈希表值。
好的,现在我们有哈希表值,但这怎么样更好?在找到匹配的哈希表值之前,我们还不得不迭代吗?
答案 0 :(得分:2)
哈希函数将用于直接映射到数组中的索引。所以没有搜索或迭代完成
答案 1 :(得分:1)
哈希表存储在一个数组中。哈希值映射到数组索引。根据实现情况,散列值是数组索引,或者它是一个更大范围的数字,取模数的大小。
然后,一旦它查看数组中的那个点,就必须检查那里的值是否匹配,因为多个值可能具有相同的哈希值。通常,它实际上导航已散列到散列表中相同位置的所有值的链接列表。这是一个比完整列表短得多的列表(特别是如果哈希表的大小与其中的数据量成比例)。
答案 2 :(得分:0)
有许多不同的哈希表,每个哈希表都有不同的实现细节,但最简单的哈希表使用哈希代码作为数组的索引:
#define TABLESIZE 1000
char **gHashTable[TABLESIZE];
void clearHashTable() {
memset(gHashTable, 0, sizeof(gHashTable));
}
int calculateHashCode(char *string) {
int val = 0;
for (int i = 0; string[i] != '\0'; ++i)
val += string[i];
return val;
}
void insertInHash(char *string) {
int hashCode = calculateHashCode(string);
gHashTable[hashCode % TABLESIZE] = string;
}
int isInHashTable(char *string) {
int hashCode = calculateHashCode(string);
return gHashTable[hashCode % TABLESIZE] != 0;
}
现在这个简单的哈希支持快速查找字符串。它不能很好地处理冲突,哈希函数很糟糕,还有许多其他问题,但它会起作用。