我是初学者。我从未做过哈希搜索。但现在,我必须这样做。
我有一个包含大约3500个随机整数的链表,最多可达10万(1000000)。我想使用哈希搜索来搜索任何元素。
调试器首先在函数ht_set中给出seg错误if if(condition)。 请告诉我如何解决? 这是我的代码:
typedef struct entry_s
{
int key;
int value;
struct entry_s *next1;
} entry_t;
typedef struct hashtable_s
{
int size;
entry_t **table;
}hashtable_t;
int ht_hash(hashtable_t *hashtable, int key)
{
int index;
index=key%hashtable->size;
return index;
}
entry_t *ht_newpair( int key, int value )
{
entry_t *newpair;
if((newpair = malloc( sizeof( entry_t)))== NULL || newpair->key == key || newpair->value==value)
return NULL;
newpair->next1 = NULL;
return newpair;
}
void ht_set( hashtable_t *hashtable, int key, int value )
{
int bin = 0;
entry_t *newpair = NULL;
entry_t *next1 = NULL;
entry_t *last = NULL;
bin = ht_hash(hashtable, key);
next1 = hashtable->table[bin];
while( next1 != NULL && key==next1->key)
{
last = next1;
next1 = next1->next1;
}
if( next1 != NULL || key==next1->key)
next1->value =value;
else
{
newpair = ht_newpair( key, value );
if( next1 == hashtable->table[ bin ] )
{
newpair->next1 = next1;
hashtable->table[ bin ] = newpair;
}
else if ( next1 == NULL )
last->next1 = newpair;
else
{
newpair->next1 = next1;
last->next1 = newpair;
}
}
}
由于
答案 0 :(得分:2)
你似乎错过了哈希的基本思想,它是如何在hash table数据结构中常用的。请仔细阅读。
基本上,搜索链表时通常不使用哈希值;哈希用于构建表(数组)的索引,以便将内容快速映射到数组位置。
一些哈希表解决了与separate chaining的冲突,其中每个表槽都是所有已散列到同一位置的项目列表的头部。因此,当您搜索该列表时,您不通过哈希搜索(请记住,列表中的所有项具有相同的哈希值),但要进行完全比较。