社区
C语言
帖子详情
求救.........字符串Hash 如何实现
adfsssd
2007-07-11 04:14:25
求一个字符串Hash 表的实现例子。
请高手多指教一下.
搞了几天了,也没搞定,唉,,头晕了。
...全文
341
10
打赏
收藏
求救.........字符串Hash 如何实现
求一个字符串Hash 表的实现例子。 请高手多指教一下. 搞了几天了,也没搞定,唉,,头晕了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yalexfan
2007-07-12
打赏
举报
回复
哦,谢谢
iambic
2007-07-12
打赏
举报
回复
字符串hash用的数字不止一种。最常见的是37,Java API中的String.hashCode()用的就是37。127是《C算法》中用的。还有个数字很常用,忘了是多少。
yalexfan
2007-07-12
打赏
举报
回复
static int hash(char *key)
{
int h = 0, a = 127, i;
for(i = 0; key[i]; ++i)
h = (a * h + key[i]) % NELEMS(symtab);
return h;
}
a选127有什么考虑么?我以前看到过使用37的。
是否有什么实践的经验?分享一下啦
chai2010
2007-07-12
打赏
举报
回复
刚重新给你整理了一个。
好久没写hash表了.
#include <assert.h>
#include <string.h>
// 计算数组大小
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))
/* 保存标号的哈希表 */
static struct symtab
{
struct symtab *link;
char *key;
} *symtab[211];
static int hash(char *key)
{
int h = 0, a = 127, i;
for(i = 0; key[i]; ++i)
h = (a * h + key[i]) % NELEMS(symtab);
return h;
}
// 添加
void insert(const char *key)
{
assert(key != NULL);
assert(strlen(key) > 0);
struct symtab *p;
int h = hash(key);
p = symtab[h];
while(p != NULL) {
if(!strcmp(key, p->key)) return;
p = p->link;
}
if(p == NULL) {
int len = strlen(key);
p = malloc(sizeof(*p) + len + 1);
assert(p != NULL);
p->key = (char *)(p + 1);
strcpy(p->key, key);
p->link = symtab[h];
symtab[h] = p;
}
return p->val;
}
// 删除(比较复杂)
bool delete_key(const char *key)
{
assert(key != NULL);
assert(strlen(key) > 0);
struct symtab **pp;
int h = hash(key);
for (pp = &symtab[h]; *pp; pp = &(*pp)->link)
if (!strcmp(key, (*pp)->key) == 0) {
struct symtab *p = *pp;
*pp = p->link;
free(p);
return true;
}
return false;
}
/* 查询 */
bool search(const char *key)
{
assert(key != NULL);
assert(strlen(key) > 0);
struct symtab *p;
int h = hash(key);
p = symtab[h];
while(p != NULL) {
if(!strcmp(key, p->key)) return true;
p = p->link;
}
return false;
}
chai2010
2007-07-12
打赏
举报
回复
/* 保存标号的哈希表 */
static struct symtab {
struct symtab *link;
char *key, *val;
} *symtab[211];
static int
hash(char *key)
{
int h = 0, a = 127, i;
for(i = 0; key[i]; ++i)
h = (a * h + key[i]) % NELEMS(symtab);
return h;
}
/* 生成新的地址标号 */
char *new_id(void)
{
static char id[6+1] = "@AAAAA";
static int i = 0;
char *p = malloc(sizeof id);
if(p == NULL) error("overflow");
if(id[5] >= 'Z') error("too many id");
id[(i++)%6]++; strcpy(p, id);
return p;
}
/* 获取变量对应的CASL标号 */
char *get_id(char *key)
{
struct symtab *p;
int h = hash(key);
p = symtab[h];
while(p != NULL) {
if(!strcmp(key, p->key)) return p->val;
p = p->link;
}
if(p == NULL) {
int len = strlen(key);
p = malloc(sizeof(*p) + len + 1);
if(p == NULL) error("overflow");
p->key = (char *)(p + 1);
strcpy(p->key, key);
p->val = new_id();
p->link = symtab[h];
symtab[h] = p;
}
return p->val;
}
/* 定义所有的变量 */
void def_id(void)
{
int i;
for(i = 0; i < NELEMS(symtab); ++i) {
struct symtab *p;
p = symtab[i];
while(p != NULL) {
emit("%s\tDC 1\t; -> %s", p->val, p->key);
p = p->link;
}
}
}
这是我以前做的小编译器中用到的hash表。
是用于处理tiny语言中出现的标号。
iambic
2007-07-11
打赏
举报
回复
不懂就抄一个好了。何必还找别人代抄。
CathySun118
2007-07-11
打赏
举报
回复
http://burtleburtle.net/bob/hash/doobs.html
hilary0810
2007-07-11
打赏
举报
回复
搞不定就直接用stl好了,已经封装好了,干嘛还费尽自己写
bargio_susie
2007-07-11
打赏
举报
回复
有问题找百度。。。。
http://hi.baidu.com/wertywang/blog/item/1fe7d2ee1faaed282cf5340f.html
adfsssd
2007-07-11
打赏
举报
回复
自己顶一下
【
字符串
-KMP-哈希】中山纪念中学暑期游Day13——seek
前言 自己看出来了是道可以用KMP做的题... 然而因为我理解不够深入,所以没打出正解 题目 俗话说“好命不如好名”,小h准备给他的宠物狗起个新的名字,于是他把一些英文的名字全抄下来了,写成一行长长的
字符串
,小h觉得一个名字如果是好名字,那么这个名字在这个串中既是前缀,又是后缀,即是这个名字从前面开始可以匹配,从后面开始也可以匹配,例如abc在 abcddabc中既是前缀,也是后缀,而ab...
python 全栈开发,Day61(库的操作,表的操作,数据类型,数据类型(2),完整性约束)
昨日内容回顾 一、回顾 定义:mysql就是一个基于socket编写的C / S架构的软件 包含: ---服务端软件 - socket服务端 - 本地文件操作 - 解析指令(mysql语句) ---客户端软件 - socket客户端 - 发送指令 - 解析指令(mysql语句) 重点理解: 数据库服务器、数据管理系统、数...
C++笔试题汇总(6)
1.引言本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分 析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。 许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最 简单的strcpy 函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个 strcpy 函数吗?我们都觉得自己能,可是我们写出的strcpy 很可能只能拿到10 分中的2 分。 读者可从本文看到strcpy 函数从2 分到1
阿里java开发一面 面试题及个人解析答案
1: 自我介绍 自我介绍首先描述自己的基本情况,其次是描述自己的技术亮点,做过的亮点项目或产品。如果没有做过有技术亮点的事,每天都在做增删改查功能或重复性的工作,需要好好反思下,这样下去技术上没有多少增长。如果工作中就是做这个怎么办?可以考虑利用业余时间参与开源项目或自己做一些工具或框架。 2:
Hash
Map怎么解决
Hash
冲突的
Hash
Map的数据结构是:数组Node[]...
C语言面试题汇编
1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。 2.如何引用一个已经定义过的全局变量?
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章