日期:2014-05-20  浏览次数:20623 次

哈希表
想实现一个功能,为快速查找这个url是否已存在,构造一个哈希表。将不同的url字符串,计算出一个哈希值,并将这个哈希值映射到内存中的一段连续空间以二进制表示,如果为true则url存在,如果为false则将它对应的位置设为true,要求这个哈希值不能过长不超过(20位)

------解决方案--------------------
你是要自己开发一个HashTable还是咋?

Java自带HashSet可以进行快速查找;
此外String自带hash()函数能自动生成哈希值。
------解决方案--------------------
探讨
自带的有个弊端就是,要是我使用自带的,要多存一次吧,貌似有多余的时间开销

------解决方案--------------------
add进去,本身就是建立内存映射的过程。除了映射数组所需的索引空间外,不需要额外空间。

你自己实现,绝对不会比这个有本质优势的。你看看HashSet的源码就知道,原理就是那些原理,数据结构早就学过了。

求出String的Hash值(比如54321),然后MOD运算到映射数组上(比如数组实际上只有100大小),数组存入String的内存地址(Java中称之为引用)。最后还要解决Hash值冲突问题,一般会通过链表来解决;当然也可以使用二次Hash或下一地址来解决。
------解决方案--------------------
不解决碰撞问题是不可能的,因为你没法保证hash值绝对不重复。

20个元素的量?用:HashSet set = new HashSet(20*2);
------解决方案--------------------
布隆过滤器啊,如果你是海量信息存储的话,性价比效果可能还比较可以。

如果只是 数十万规模以下的信息的话,性价比恐怕够呛;如果想降低向量空间来提升性价比,误判率就会比较高。
------解决方案--------------------
主要难度其实是在Hash算法设计上,要求选择差异性较大的Hash算法,否则算出来结果相似度高这个检索效果就很撮了。

建议楼主参考下这里:
http://blog.csdn.net/eaglex/article/details/6310727

提供了9种针对字符串的Hash算法,而且带源码。