C语言中的散列结构
所以我尝试实现一个哈希表,它将哈希包含单词的结构 结构与此类似:C语言中的散列结构,c,pointers,hash,struct,C,Pointers,Hash,Struct,所以我尝试实现一个哈希表,它将哈希包含单词的结构 结构与此类似: #ifndef HASHTABLE_H #def HASHTABLE_H typedef int (*HashFunctionT) (char* string, int upperbound); struct node_ { char * word; struct node * next; } typedef struct node_ * node; struct nodehash_ { int si
#ifndef HASHTABLE_H
#def HASHTABLE_H
typedef int (*HashFunctionT) (char* string, int upperbound);
struct node_
{
char * word;
struct node * next;
}
typedef struct node_ * node;
struct nodehash_
{
int size;
struct node * hash[100];
}
typedef struct nodehash_ * nodehash;
Hashtable createHashTable();
void addtohash(node list, nodehash hash);
#endif
我希望哈希函数的工作方式如下:
#include "hashtable.h"
int hashFunction(char *word, int hashTableSize)
{
int length = strlen(word);
int h = 0;
int i;
for(i = 0; i<length; i++)
{
h=31 *h + word[i];
}
return h % hashTableSize;
};
nodehash createHashtable()
{
nodehash hashtable;
hashtable = malloc(sizeof(struct nodehash_));
hashtable->size = 100;
hashtable->hash = malloc(100 * sizeof (node));
int i;
for (i = 0; i < hashtable->size; i++)
{
hashtable->table[i] = NULL;
}
return hashtable;
};
void addtohash(node list, nodehash hashtable)
{
int nodehashnumber;
nodehashnumber = hashfunction(list->word, hash->size);
hashtable->hash[nodehasnumber] = list;
};
假设不存在冲突,因为要散列的每个单词都是不同的
基本上,我想知道我是否遗漏了和明显的逻辑错误或缺陷
任何帮助都将不胜感激
谢谢。我没有对代码进行详细阅读,但是第一件非常明显的事情是哈希表的大小,
100
。最好使用a来帮助避免冲突。您似乎对分号有问题:
struct node_
{
char * word;
struct node * next;
} /* <<-- HERE */
typedef struct node_ * node;
struct节点_
{
字符*字;
结构节点*下一步;
}/*这会更好吗?哦,我甚至不知道它的存在。。。谢谢你让我知道!你不能仅仅因为每个词都不一样就认为不可能有冲突。散列函数可以为多个不同的输入生成相同的输出。此外,如果假设没有冲突,那么为什么要将节点结构与下一个指针一起使用?如果不考虑冲突,您可以使用char*数组。这是实现LRU缓存的大型项目的一部分。。。基本上,我们得到一个.txt文件作为输入,我们需要标记该文件,并使用优于O(n^2)的时间搜索该文件(因此基本上,线性搜索是不可能的,我们被鼓励使用哈希表)。LRU缓存将包含令牌,并且将是动态的:也就是说,用户指定自己的缓存大小。这是一个神奇的数字,出现在几个地方。@FredLarson:难怪它如此迅速地脱颖而出:)--gfppaste,一定要用变量或#define
替换硬编码的100
,因此,您可以在将来更轻松地更改表的大小。我认为在这种情况下,素数的性能并不一定更好。如果有足够的分散度(在《不是城里最好的》中提到的K&R散列,但对于长度合理的字符串就可以了),模100的性能不会比模101差太多。而且,考虑到显然没有输入冲突的可能性,这其实并不重要。:)
struct node_
{
char * word;
struct node * next;
} /* <<-- HERE */
typedef struct node_ * node;
int hashFunction(char *word, int hashTableSize)
{
int length = strlen(word);
int h = 0;
int i;
for(i = 0; i<length; i++)
{
h=31 *h + word[i];
}
return h % hashTableSize;
}; /* <<-- NOT here */