标题:Hash应用 - 哈希(散列)表
只看楼主
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
以下是引用Dream在2004-11-06 20:52:53的发言:

这个版主确实不错!

在什么地方都能看见她的回贴!我也支持!!!

1。谢谢你支持。 2。我是男的。 3。我是纯粹无聊才在论坛狂灌水。 4。只有我不够啊,我技术有限,帮不了太多人。

2004-11-06 21:13
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
以下是引用dicklin在2004-11-06 21:07:20的发言: 3少爷你也参加讨论阿~~哈哈~~谢谢!!等待斑主的消息!!不过他难得放假回家还要他来帮我想问题!真得不太好意思阿!晕死!

那我不帮你你就不用不好意思咯哈哈!

[此贴子已经被作者于2004-11-07 01:53:51编辑过]

2004-11-06 21:14
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
以下是引用dicklin在2004-11-06 20:10:44的发言:

刚才问了问老师原来 P的值是你自己任算一个质数(请注意一定是质数,不是素数)

之后C的意思是你随便输入一个数字电脑自动帮你转换成ASCII code 之后放到公式里面进行计算!!

大概意思就是这样!!希望有帮助!!!因为题目我自己都有点混乱!不好意思!

我更晕了,质数就是素数,prime,不过好像有点理解题目的意思。
2004-11-06 23:07
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
完成,but未调试

#include<iostream> #include<string> #include<fstream> using namespace std;

const int HashMaxSize = 350; //hash表大小 const int ItemsAmount = 425; //数据数量

void Input(string data[]) { ifstream hashdata("e:\\data.txt"); //打开data.txt for(int i=0; i<ItemsAmount; i++) { hashdata>>data[i]; } }

int Hash(string data,int m) //hashing函数 { int P=5; //取prime=5 int c=6; //取任意c=6 unsigned int temp; unsigned int h=0; //类加变量 for(int i=0; i<data.length(); i++) { temp=(int)data[i]*P+c; //data[i]是字符串里的each字符 h+=temp; //把data[i]算式的int值累加到h上 } return h%m; //取模 }

struct LNode{ //单结点结构 string data; LNode* next; };

class HashList { private: LNode* HT[HashMaxSize]; //指针数组

public: void InitHashList(); //初始化hash表 int Insert(HashList &hl,string data[]); //插入数据 string* Search(HashList hl,int m,string item); //查找元素 };

void HashList::InitHashList() { for(int i=0; i<HashMaxSize; i++) HT[i]=NULL; //把每个指针数组的头结点都赋初值 }

int count[HashMaxSize]; //链结点记数变量

int HashList::Insert(HashList &hl,string data[]) { int key[ItemsAmount]; //键值

for(int i=0; i<ItemsAmount; i++) { key[i] = Hash(data[i],HashMaxSize); //计算键值

//新建临时结点p储存hash数据 LNode* p=new LNode; if(p==NULL) //当内存用完返回0 return 0; p->data=data[i]; p->next=hl.HT[key[i]]; hl.HT[key[i]]=p;

count[key[i]]++; //加结点后记数变量+1 } return 1; }

string* HashList::Search(HashList hl,int m,string item) { int d=Hash(item,m); LNode* p=hl.HT[d]; while(p!=NULL) { if(p->data==item) //string比较 return &(p->data); else p=p->next; } return NULL; }

void main() { HashList hl; hl.InitHashList();

string data[ItemsAmount]; Input(data); if(hl.Insert(hl,data)==0) exit(1);

//analyze the efficiency unsigned int efficiency[HashMaxSize]; for(int i=0; i<HashMaxSize; i++) efficiency[count[i]]++;

//improve hashing scheme if collisions is excessive. for(int j=0; j<HashMaxSize; j++) cout<<efficiency[i]<<" ";

cout<<endl; //to improve youself please

char judge; string seek; cout<<"do you want to search for words?(Y/N)"; cin>>judge; while(1) { if(judge=='y') { cout<<"input the words you want:"; cin>>seek; string* temp=hl.Search(hl,HashMaxSize,seek); if(temp!=NULL) cout<<temp<<"\nthe word exist"<<endl; }

else break; } }

2004-11-07 01:42
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

楼上的是完成的,就是包括了题目要求的功能(如果我没理解错题意的话),但是我没有调试过,就是说我不知道会不会出错,但是大概就是这样做了,还可以做得好一点,不过,楼主同志,我们广州现在的时间是凌晨1点40分,我好累了,唉,以后都不多事了,如果不是答应帮你,我都不想写下去了,现在已经没心机调试。

告诉你我帮你的原因吧,我开始的时候以为你是“林迪”,他是广州某电台的一个DJ,我也喜欢听他节目,所以,不过没关系,我也想看一下散列表的操作。

散列表,又称哈希表,hash,有两种方法解决冲突问题,一种是线性探查法,一种是链接法,题目要求用后者——“dynamic linked list version”,也幸好用后者,因为我看不懂前者,呵呵,反正我就很累很累,不帮你调试了,本来想讲解一下散列表的,不过我快挂了。

最后申明,下不为例!!!

2004-11-07 01:50
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 

我可能会把代码优化改进一下,或者写得完善,不过是在你交作业以后……

我现在还有数据库作业没做,下周又期中考,斑竹真是难做啊,向静哥请辞算了。

2004-11-07 01:52
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
要求斑竹给加精,没功劳都有苦劳。。。要睡了,快挂了……晚安。。。
2004-11-07 01:54
风中涟漪
Rank: 1
等 级:新手上路
帖 子:234
专家分:0
注 册:2004-8-9
得分:0 
以下是引用dicklin在2004-11-06 20:48:20的发言:

这位大哥!如果我自己之前学过,加上有点基础,我一定不会来问!难道你什么懂吗?

我相信我的电气化自动控制不会比你差吧!!编成的东西我才刚刚接触!

你不帮我没有关系,但是希望尊重别人的发问权!

其实论坛是交流知识的地方,拿作业上来问是不对的,只是她的语气过分了点,不过如果是一般作业,我看live41也没兴趣,叫他翻书温习一下数据结构也好,哈哈!


2004-11-07 02:00
dicklin
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2004-11-1
得分:0 
我晕死啦!!斑主!你以为我是DJ阿??哈哈!哪一方面让你觉得阿?我也知道这样问作业是很不对!但是时间紧迫我实在没有办法,才向你请教!我保证下不为例!!!!如果我作业上有问题,,我一定自己研究透彻之后才针对某点内容发问!!!最后希望你中考顺利!!!继续加油!我一定把这个论坛的人气推到极点!!!
2004-11-07 23:04
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
得分:0 

live41斑竹,你真的好帅!

一定要好好研究下你的程序!


2004-11-07 23:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-6919-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.336641 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved