hash表的容量与算法问题

chichenzhe 2013-10-21 03:05:24
hash表 如果以 hash.get(hashcode) 方式从一个数组里直接定位元素的话(假设无哈希碰撞发生)

那么 他这个 数组该是多大呢???

我们知道 hash散列算出的正整数值是很恐怖的一个大数, 至少得long去装吧. 这么恐怖的数量级, 如果要实现数组的话, 最小值 --> 最大值 相减所得到的跨度 应该超过数百万是不稀奇的吧?

那么, 也就是说 如果要实现一个仅有3个元素的hashtable, 你就得new一个 几百万个元素的数组去装载这3个元素. 并且将来add之后还有可能扩大这个跨度.
-----

如果不用这个跨度全覆盖的数组去做的话, 也还有办法,就是二分查找. 折半方式去找. 但这势必不是多了运算量么. 所以, 我想知道这个东西到底是什么情况.

因为我想,为了实现高速索引(不冲突情况下一击即中) 是不可能用掉这么恐怖的内存资源的. 但是详细的技术细节是什么呢, 往高手告知.
...全文
99 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2013-10-21
  • 打赏
  • 举报
回复
通用的,完全不碰撞的hash表是不存在的。 碰撞的处理是hash表的基本功。由于hash码的限制,即使出现碰撞,实际使用搜索量也可以大幅度将减少。 这就像使用宿舍号码来作为学生的hash码,几个学生可以住同一个宿舍(hash碰撞),但用宿舍号来找人,已经极大地减少了搜索量。
 本次课程会带着大家学习Hash算法,从源码的角度去学习算法,更加容易理解的方式去学习,能够更高效的吸收学到的内容,也能培养出能够独自看源码,分析源码的能力。Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。  哈希是根据设定的哈希函数H(key)和处理冲突方法将一组关键字映射到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在中的存储位置,这种称为哈希或散列,所得存储位置称为哈希地址或散列地址。作为线性数据结构与格和队列等相比,哈希无疑是查找速度比较快的一种。  通过将单向数学函数(有时称为“哈希算法”)应用到任意数量的数据所得到的固定大小的结果。如果输入数据中有变化,则哈希也会发生变化。哈希可用于许多操作,包括身份验证和数字签名。也称为“消息摘要”。  简单解释:哈希(Hash算法,即散列函数。它是一种单向密码体制,即它是一个从明文到密文的不可逆的映射,只有加密过程,没有解密过程。同时,哈希函数可以将任意长度的输入经过变化以后得到固定长度的输出。哈希函数的这种单向特征和输出数据长度固定的特征使得它可以生成消息或者数据。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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