hash查找字符串的问题

chm_study 2008-02-03 11:18:30
例如原字符串是SrcString:ffjdsaljfldsajflvncxznvcxznmfsah)
假设已经构造好了hash函数(参数是字符串string)
{
返回一个long类型的数据(LongRet);
}
在对数据LongRet做%运算,得到hashTable的index,问题是在创建hashTable时,hashTable[index]里面应该填什么,按理说应该是要查找的字符串string在原字符串出现的位置,但实际在构造的时候,用户要查找的string是不固定的,怎么能事先确定在构造hash表时hashTable[index]里面应该赋值成什么?
...全文
727 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
a523841303 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

用一个静态数组给你简单模拟一下:

#include <stdio.h>

#define HASH_TABLE_SIZE 13 //哈希表的大小应是个质数
struct mapping
{
void *key;
void *data;
} hash_table[HASH_TABLE_SIZE];

unsig……
[/Quote]


while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);

上面的代码是什么意思?老看不懂,hash这么大,不是很容易溢出吗?还有返回值为什么是hash & 0x7FFFFFFF?这个函数的目的又是干什么用的?帮我解释一下,谢谢
michney 2008-02-14
  • 打赏
  • 举报
回复
lz还是去找一些全文检索的倒排索引的资料看看吧
那些算法很复杂的
chm_study 2008-02-14
  • 打赏
  • 举报
回复
楼上说得很对,我想知道的就是怎么建索引表的问题:
例如:abdjfl
我可以把这个字符串分成(长度为3)的字串abd bdj djf jfl,通过hash函数映射得到对应的index值,而hash[index]保存的是映射的字串在abdjfl的位置,
我现在是在做一个压缩程序(使用lzss算法),abdjfl相当于滑动窗体中载入的字符串,我设定载入的字符串为4096k,问题是字符串会不断的向前移动,在字符串尾部加入新的字符,头部移出字符,(保持大小4096k)那岂不是每次变化都需要重新建立Hash表吗?
arfi 2008-02-03
  • 打赏
  • 举报
回复
看的有些糊涂,原始字符串是不是固定的?写一个初始化函数,在hashTable[index]里面填写上所有原始字符串的地址值。

用户在进行HASH查找时,只需根据用户输入的字符串计算出index,看看其中记录的地址值是否为NULL,以确定原始字符串中是否包含该字符串应该就可以了。
阿呆_ 2008-02-03
  • 打赏
  • 举报
回复
楼主的问题其实是有关全文查找的那个索引表怎么建的问题。
一种最简单的分词方法就是设定一个最短查找长度和一个最长查找长度, 然后将原文分别按各个长度切分成各种子字符串组合(也就是关键字),然后对将所有这些关键字建立成hash表(每个hash值可以对应多个关键字并记录一些关键信息比如关键字长度, 原文位置, 甚至第二hash值等), 在查找时根据要找的字符串(如果比最长关键字长度还长的话只取前n个字符)计算出的hash值找到对应的索引项, 然后遍历其中各关键字进行一些初步比对和筛选, 再对应到相应原文中进行精确比对.
netxuning 2008-02-03
  • 打赏
  • 举报
回复
至于字符串数组的创建并不受特别的影响,哈希算法只不过将你的字符串映射到哈希表特定的位置上,使快速查找.

struct hash_table ht; //随便起个名字举例
const char *strs[] = {"sdfsdl", "dfs", "ddd"};
const char *res;
int i;
//现循环将数组所有的字符串映射(插入)进哈希表.
for (i = 0; i < sizeof (strs) / sizeof (strs[0]); ++i)
hash_table_insert (ht, strs[i]);
res = hash_table_query (ht, "dfs"); //在哈希表中查找字符串"dfs"
...
netxuning 2008-02-03
  • 打赏
  • 举报
回复
用一个静态数组给你简单模拟一下:

#include <stdio.h>

#define HASH_TABLE_SIZE 13 //哈希表的大小应是个质数
struct mapping
{
void *key;
void *data;
} hash_table[HASH_TABLE_SIZE];

unsigned int
RSHash (char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0 ;

while (*str)
{
hash = hash * a + (*str++);
a *= b;
}
return (hash & 0x7FFFFFFF);
}

int
main ()
{
char *str = "we are the world!";
char *filename = "myfile.txt";
unsigned int hash_offset;
//初始化哈希表
memset (hash_table, 0x0, sizeof (hash_table));

//将字符串插入哈希表.
hash_offset = RSHash (str) % HASH_TABLE_SIZE;
hash_table[hash_offset].key = str;
hash_table[hash_offset].data = filename;

//查找str是否存在于hash_table.
hash_offset = RSHash (str) % HASH_TABLE_SIZE;
if (hash_table[hash_offset].key)
printf ("string '%s' exists in the file %s.\n", str, hash_table[hash_offset].data);
else
printf ("string '%s' does not exist.\n", str);
}

这个没有哈希冲突处理,楼主可以自己实现一下
chm_study 2008-02-03
  • 打赏
  • 举报
回复
不好意思,可能是我没有说清楚,hash查找,原数组是一个字符串数组,根据hash函数计算出Index,也就是TableHash[index]对应的值就是要查找字符串在字符串数组的位置,但问题是怎么创建字符串数组,
比如:要在ndsjakfnkasnckasjnkcarjeqwoijreqowjfsadljfldkasjflkdasjlfcjzdnc,mzxNcZ<XNckjasdfkhsadfkjhksajhfdkjnvasnckasdjncdnaskcdnaskjncd...大概是1M的字符串中建立hash,查找指定字符串,怎么建立字符数组?

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧