对于hash的比之前更深的理解

最近看了一些hash的东西,发现对于这个理解不够深入。


从映射角度来看,hash应该既不是单射,也不是满射,也即 http://zh.wikipedia.org/wiki/%E5%8D%95%E5%B0%84%E3%80%81%E5%8F%8C%E5%B0%84%E4%B8%8E%E6%BB%A1%E5%B0%84 中的第四种。

因为为了保证查找性能,冲突尽可能少,装填因子alpha<0.8(java中<0.75,再打就要resize),所以不满,而且极有可能含同义词,因此不单

(另外看这个还了解到映射的一个定义差异,值域是定义域在f下的象的集合,陪域才是X->Y中的Y,因此满射也即值域等于陪域的映射)


还有一篇hash极好的文章,通俗易懂~http://www.nowamagic.net/academy/detail/3008010

ELFhash函数代码,只可惜没有算法文字描述:http://www.cnblogs.com/Jason-Damon/archive/2012/04/02/2430230.html

目前存有一些疑惑:


1.是否hash表 没有重复元素存在。如果是的话,建立hash表的时候,如果有两个一样的元素怎么处理?
我又翻看了下BST,发现如果插入的元素在BST中已有,则不能插入,那为啥用普通的线性表存,二分查找又允许元素重复呢,不懂?

2.http://blog.csdn.net/feixiaoxing/article/details/6885657#reply

学习了这个代码之后,对于hash的实现有更深的理解,也是包含插入,删除,查找的操作,其中是用%10hash 函数以及开放寻址法实现。理论上的研究还比较浅.

补充:这篇文章当时还有个细节没有注意到,后面考虑实际应用的时候注意到了。就是hashtable里面是申请了一个指针,同义词都放在对应表象为head结点的单链表里。

这样设计比用数组是有好处的,因为指针可以初始为null(实际用memset设置内存清0,0为null指针),这样保证hash表不管存什么类型的数据都是用null表示此处没有放数据,判断时只需要判断hash到的指针是否为null就可以了,而数组的话,可能不好设定值表示此处没有数据,(-1 万一数据有负数,最大最小又不方便,否则还有再设置一个flag的bool数组来表示是否此处有值)。




3.提出一个想法:选择hash函数具有人工干扰,类似于机器学习选择feature,是否可以效仿深度学习,从原始数据中自动选择出一个hash函数,使得冲突较小,平均查找长度较小?
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值