标题:Hash应用 - 哈希(散列)表
只看楼主
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
还是未完成,加了更多注释,你认真理解

#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函数 { unsigned int h=0; //类加变量 for(int i=0; i<data.length(); i++) { h<<=3; //循环一次移3位 h+=(int)data[i]; //把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[]); //插入数据 };

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

int HashList::Insert(HashList &hl,string data[]) { int key[ItemsAmount]; for(int i=0; i<ItemsAmount; i++) { key[i] = Hash(data[i],HashMaxSize); LNode* p=new LNode; if(p==NULL) return 0; p->data=data[i]; p->next=HT[key[i]]; HT[key[i]]=p; } return 1; }

void main() { HashList hl; //实例化一个hash表 hl.InitHashList(); //初始化

string data[ItemsAmount]; //定义读文件储存的string Input(data); //把data.txt的数据传给data数组变量 if(hl.Insert(hl,data)==0) //从data插入到hash exit(1); //若失败就退出程序 }

2004-11-03 00:38
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
以上我调试了一下,基本上都通过了,insert还没写注释,你尽量看吧,我明天要早起坐车去上学,住宿啊~~~晚安了。
2004-11-03 00:40
dicklin
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2004-11-1
得分:0 
我11月7号就要交了!真的晕死!我对hash  认识就是它是中文叫离散图表!!!就是把一堆字节或文件分散再重新排列放到array里面~~~再除以一个数字,等每一个字串都有自己的一个特别门牌~~~~~我大概就理解那么多!不过我最近正在努力的看有关的书籍,真的不想这样每次麻烦人家!我知道你们也是用业余的时间来管理论坛的!!真的不好意思!
2004-11-03 04:45
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
得分:0 

难道他还不明白吗??

我的意思是让他拿STL的哈希表类,稍微改改去交作业,肯定很爽!


I am a big fan of c plus plus.
2004-11-03 08:27
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
得分:0 

我不是告诉你ifstream有方法吗。。。。

本来想让你去查一下啦(印象深刻),

它有个getline方法。


I am a big fan of c plus plus.
2004-11-03 08:38
dicklin
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2004-11-1
得分:0 
请楼上的那位可爱的斑主详细一点!你说的是什么软件阿??我真的一点概念都没有啊!!如果有好的方法希望赐教!!!真的希望你能帮到我!!因为另外一位版主去上课拉!!
2004-11-03 18:33
dicklin
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2004-11-1
得分:0 
来回答一下啊~~
2004-11-04 19:09
风中涟漪
Rank: 1
等 级:新手上路
帖 子:234
专家分:0
注 册:2004-8-9
得分:0 
STL不是软件,是VC6做好的类,在VC6中可以直接调用,想知道更多,请查阅STL想关资料。

2004-11-05 17:48
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
以下是引用dicklin在2004-11-02 01:00:52的发言: The following hashing function is suggested: H = int(k) mod 350, where int(k) = P*k+c summed for all ASCII codes c in the string, where k = 0 is the start value. P is a suitably chosen prime number (choose it yourself).

这一段看不懂,你翻译的我也没看懂。第二个函数用来做什么用?随便选择个素数然后怎么弄到ASCII码?

2004-11-05 18:33
三少爷
Rank: 1
等 级:新手上路
帖 子:192
专家分:0
注 册:2004-4-29
得分:0 

看着您二位讨论了老半天,偶也跟着思考了老半天。

总算托福整懂了点东西,也查了些资料,对哈希表第一次接触总算有了概念性质的突破~

查了些资料

开放地址法

Hi=(H(key)+di) MOD m i=1,2,...k(k<=m-1)

其中H(key)为哈希函数;m为哈希表表长;di为增量序列,可有下列三种取法:

di=1,2,3...m-1,称线性探测再散列 di=1平方,-1平方,2平方,-2平方,+-k平方,(k<=m/2)称二次探测再散列 di=伪随即数序列,称伪随即数再散列.

再哈希法

Hi=RHi(key) i=1,2,...k

RHi是不同的哈希函数,即在产生冲突时计算另一个哈希函数地址,直到冲突不在发生.

但最整不明白的就是原文中 where int(k) = P*k+c summed for all ASCII codes c in the string 这里的c是什么意思啊?是累加值吗?如果是,那是不是将所有在string里的ASCII codes加起来啊,有什么意义吗


2004-11-05 22:15



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




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

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