请教,hash表的删除问题,在线等待,高分相送!

jiemmy 2005-09-04 10:17:22
一个字符串地hash表,根据字符串能够映射出一个整型:

定义hash的接口函数如下是否可以?
bool createhash()
bool insert(char*str)
int search(char *str)

bool delete(int index)

插入、查找都是按照字符串str进行,利用特定的hash函数hash(str)进行插入、查找操作。这都是没问题的。
如果delete(index)按照字符串对应的整型进行操作,是否可以呢?hash函数是固定的(只能以str作为参数),岂不是delete要遍历一下?

请帮忙,有高分送之。如果不够还可以继续增加!
...全文
189 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bugebear3 2005-09-08
  • 打赏
  • 举报
回复
当然可以了
darkstar21cn 2005-09-06
  • 打赏
  • 举报
回复
bool delete(int index)

表用这个名字,delete是C++关键字,会给你造成预想不到的问题。
nasi00 2005-09-06
  • 打赏
  • 举报
回复
那是不是如果

str = "aaaa" data = 1234
str = "bbbb" data = 1234

的话,这两个都要d掉呢?

删除一般是根据key来d数据的...
jiemmy 2005-09-05
  • 打赏
  • 举报
回复
兄台,不是那么容易啊!
hash函数是对string进行的,从而找到相应的链表:比如,
str = "abcd"
data = 1234
i = hash(str),
i = 2

从而把映射关系("abcd",1234)插入到list[2]中。

删除的时候,如果我不知道str,但是我想根据data=1234,来删除响应的元素。
那么我根据i=hash(str)就找不到相应的链了(str=?),不去遍历还应该怎么办呢?
ptb1212 2005-09-05
  • 打赏
  • 举报
回复
有一个hash的构建函数,还有一个解决冲突的函数,把你要删除的字符串通过这个hash函数找到第一个满足条件的位置,比较下值,是否就是你要的,如果不是,用解决冲突的函数,得到下一个位置,在比较......
nasi00 2005-09-05
  • 打赏
  • 举报
回复
没看懂index究竟是什么意思。

如果想对string作hash,那么删除应该是delete(char *s)吧,就是找到s对应的位置,然后删除就ok了。至于怎么找,就是要看你做的是什么样的hash表了。

比如h = hash(s), 那么如果是用链表来处理的话,就遍历h所对应的链表,找到s并del掉。如果是用线性探测的话,就从h开始向后找,找到s的话del掉。
doway 2005-09-04
  • 打赏
  • 举报
回复
就算是遍历也没用啊,难道哈嘻表中不能有重复的值吗?
doway 2005-09-04
  • 打赏
  • 举报
回复
会有这样要需求吗?
guyanhun 2005-09-04
  • 打赏
  • 举报
回复
上面的是链地址法构造的,
delete (index)按照字符串对应的整型进行操作,是否可以呢?
当然可以,
不用遍历的啊,遍历那hash 表还有什么意义啊,
index 不就是那个索引了吗 ?
令 hashtest->next=0; 这样。
guyanhun 2005-09-04
  • 打赏
  • 举报
回复



#include<iostream.h>
#include<stdlib.h>
#include<string.h>
#define M 20
#define N 13

struct hashtest{
int data;
hashtest *next;
};

int fun(int x)
{
return x%N;
}
int length(int str[])
{
int i=0;
while(str[i])
i++;
return i;
}

void createhash(hashtest * &hash,int str[],int fun(int ))
{
int i;
hash=(hashtest *) malloc(sizeof(hashtest )*M);
hashtest *p;
hashtest *q;
for(i=0;i<M;i++)
hash[i].next=0;
for(i=0;i<length(str);i++)
{
p=(hashtest *) malloc(sizeof(hashtest ));
p->next=0;
p->data=str[i];
q=hash[fun(str[i])].next;
if(q)
{
while(q->next && q->next->data<p->data)
q=q->next;
p->next=q->next;
q->next=p;
}
else
{
p->next=q;
hash[fun(str[i])].next=p;
}
}
}

void disphash(hashtest *hash)
{
hashtest *p;
for(int i=0;i<M;i++)
{
p=hash[i].next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
}

int searchhash(hashtest *hash,int key,int &count)
{
int tag=0;
count=1;
hashtest *p=hash[fun(key)].next;
for(;p;)
{
if(key==p->data)
{
tag=1;
break;
}
count++;
p=p->next;
}
return tag;
}

void destroyhash(hashtest *&hash)
{
hashtest *p,*q;
for(int i=0;i<M;i++)
{
p=hash[i].next;
while(p)
{
q=p;
p=p->next;
free(q);
}
}
free (hash);
}

void main()
{
int hashstr[M]={1,14,27,55,68,19,79,20,10,11,23,84},key,count;
hashtest *hash;
createhash(hash,hashstr,fun);
disphash(hash);
cout<<"请输入你想查找的关键字:"<<endl;
cin>>key;
if(searchhash(hash,key,count))
cout<<"找到了"<<key<<"找了"<<count<<"次"<<endl;
else
cout<<"没有找到"<<key<<"找了"<<count<<"次"<<endl;

destroyhash(hash);
}

这是我以前写的。改改 int 到 字符串 ,还有建立一个字符串到int 的对应转换就可以了,
 本次课程会带着大家学习Hash算法,从源码的角度去学习算法,更加容易理解的方式去学习,能够更高效的吸收学到的内容,也能培养出能够独自看源码,分析源码的能力。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。  哈希是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在中的存储位置,这种称为哈希或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与格和队列等相比,哈希无疑是查找速度比较快的一种。  通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果。如果输入数据中有变化,则哈希也会发生变化。哈希可用于许多操作,包括身份验证和数字签名。也称为“消息摘要”。  简单解释:哈希(Hash)算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。

69,336

社区成员

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

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