从映射角度来看,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函数,使得冲突较小,平均查找长度较小?