CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

简单介绍hash

楼主chenggn(chenggn)2001-10-23 20:38:36 在 专题开发/技术/项目 / 数据结构与算法 提问

rt 问题点数:32、回复次数:10Top

1 楼forulong(龙行天下)回复于 2001-10-23 22:37:37 得分 0

in   my   opinion,hashing   is   a   technology   which   facilites   the   querying   of   data.Top

2 楼starfish(海星)回复于 2001-10-23 23:02:18 得分 28

简单来说,hash就是找到一种数据内容和数据存放地址之间的映射关系。比如,由若干字符串要存放到一个哈西表中,希望能够  
   
  在O(1)的时间内在表中定位某个特定的字符串,我们可以用数组来实现哈西表,找到某种函数sting   ->   integer,记为   p   =    
   
  f(s),其中p是一个整数,s是一个字符串,p就是字符串s在数组中的下标。这样如果需要在数组中定位s,只要直接根据函  
   
  数p=f(s)就可以计算s的位置。在哈西表中添加一个字符串也类似,根据字符串的值计算出其应该存放在数组中的位置,然后将字  
   
  符串放入。但是这种函数(成为哈西函数)很难找,找到一个一一对应的函数几乎不可能,所以经常采用非一一对应的哈西函数  
   
  。比如对于上面的例子,我们可以设计一个简单的哈西函数,我们设f(s)定义为s的各个字符的Ascii码的和除以n的余数,这里n  
   
  是我们的数组的长度,我们假设了哈西表中最多需要存储n个元素。但是这个哈西函数有个显而易见的缺点,比如对于字符串s1=   "abc"和s2="acb",显然计算出来的哈西函数值都是一样的,但是一个位置上只能存放一个元素,如果先将s1放入哈西表的位置p1,再将s2放入哈西表,这时候因为计算出p2=f(s2)   =   p1,所以s2应该放置的位置已经被s1占据了,所以就出现了麻烦。这就叫做“冲突”。解决这个冲突的一个简单的办法是,因为p1已经被s1占据,我们就看p1+1,如果该位置为空,则放入s2,否则继续看p1+2,……一直找到一个空位。假设我们将s2放在p1+1,但是这时候要加入s3,而f(s3)恰好等于p1+1,s3的位置又被s2占据了,我们可以继续看p1+2,p1+3……是否为空,直到找到一个空位放入s3,依此类推。在查找s2的时候,我们先根据f(s2)计算出s2应该在p1位置上,然后我们看p1位置上的元素,发现不是s2(该位置上是s1),于是我们继续看p1+1,p1+2,……一直到找到s2,或者到表尾,或者发现一个空位就可以中止了,后两种情况表示s2不在表中。  
  显而易见,如果冲突发生的太多的话,哈西表的效率会下降。事实上我刚才举的例子中的哈西函数很不好,所以冲突发生的可能性很大。如果找一个比较好的哈西函数,哈西表的效率还是很高的。至于找哈西函数的方法,要根据具体的数据类型和应用场合来分析,也有一些原则,这里就不一一介绍了~~  
   
  打字累死我了~~不知道听懂了没有:)Top

3 楼starfish(海星)回复于 2001-10-23 23:03:57 得分 0

写错了,上文括号中应该是  
  “……但是这种函数(称为哈西函数)很难找……”  
  ....................~~~~......Top

4 楼lovedog(不坐飞机)回复于 2001-10-24 13:42:23 得分 0

楼在上的不错啊!:)  
  http://www.csdn.net/expert/topic/337/337498.shtmTop

5 楼ritchiex(hxx)回复于 2001-10-24 16:09:59 得分 4

说白拉,就是用一个记录的某个数据项的值(称为关键字)通过一个函数来求出这个记录的地址。Top

6 楼hz1101(lake)回复于 2001-10-24 17:11:30 得分 0

up  
  Top

7 楼dongmen(东门吹气)回复于 2001-10-24 18:06:03 得分 0

听懂了,不过也明白我没本事用Top

8 楼sclzmbie(忘我)回复于 2001-10-25 15:58:07 得分 0

一种快速查找的算法,或者说是一种压缩映象。Top

9 楼chenggn(chenggn)回复于 2001-10-25 20:52:59 得分 0

不一定一一对应吧  
  是不是影射出一个范围?Top

10 楼xml2002(xml)回复于 2002-03-29 11:03:01 得分 0

very   good.  
  解决了我想的“冲突”问题。  
  谢谢。Top

相关问题

  • 请简单介绍ARM
  • CGI技术简单介绍
  • 请简单介绍一下developer 2000
  • 请简单介绍一下Python.
  • 介绍一个简单的DLL类
  • 谁能帮忙介绍介绍自己定义的简单协议的实现?
  • 关于Lotus Domino,哪位大虾能简单介绍一下?
  • 有什么书介绍C++Builder比较简单的?
  • 谁能简单介绍一下有关“库”的知识
  • 那位高手为我简单介绍一下websnap!

关键词

  • 函数
  • 数据
  • 字符串
  • 哈西
  • 数组
  • 表
  • 一一对应
  • 放入
  • 位置
  • 空位

得分解答快速导航

  • 帖主:chenggn
  • starfish
  • ritchiex

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo