哈希表 想实现一个功能,为快速查找这个url是否已存在,构造一个哈希表。将不同的url字符串,计算出一个哈希值,并将这个哈希值映射到内存中的一段连续空间以二进制表示,如果为true则url存在,如果为false则将它对应的位置设为true,要求这个哈希值不能过长不超过(20位) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是要自己开发一个HashTable还是咋?Java自带HashSet可以进行快速查找;此外String自带hash()函数能自动生成哈希值。 不存在“多存一次”,对象都是引用的。自己开发反而很难达到Java自带的所能提供的性能。HashSet<String> hs = new HashSet<String>();hs.add("http://xxxooo.com/xxoo"); // 增加if (hs.contains("http://xxxx.com/ooo")) // 检测 你看,每次都要先add进去,如果采用内存映射呢,就只需要遍历一次集合,不用add进去了。 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算法,而且带源码。 这几种hash算法都测试过,其实他的碰撞概率还是很大的, private int getHashCode(string url) { int mapCode = -1; if (null != url && "" != url) { for (int i = 0; i < url.Length; ++i) { mapCode += url[i]; mapCode += (mapCode << 16); mapCode ^= (mapCode >> 10); } mapCode += (mapCode << 6); mapCode ^= (mapCode >> 13); mapCode += (mapCode << 16); if (mapCode < 0) { mapCode = Math.Abs(mapCode); } mapCode = mapCode % m_bitArraySize; } return mapCode; }以上的hashcode的碰撞稍微少一点,希望楼撒谎能够不吝赐教啊 处理null有什么好方法? android sdk 安装错误 jTable初级问题 很郁闷的问题啊!!大家帮我! 线程间通讯的错误,请多帮忙! @@@急!!!大家帮我看看,为什么书上明明这么写着,我编译也通过了,就是执行时不能通过? java字符串中将"替换成\"输出,如何解决. 关于多线程,急急急! 数据库的问题 如何把几张图片合成有特殊转场效果的视频 package包层次出现编译问题 java中如何调用本类里的方法?
此外String自带hash()函数能自动生成哈希值。
不存在“多存一次”,对象都是引用的。自己开发反而很难达到Java自带的所能提供的性能。HashSet<String> hs = new HashSet<String>();
hs.add("http://xxxooo.com/xxoo"); // 增加
if (hs.contains("http://xxxx.com/ooo")) // 检测
http://blog.csdn.net/eaglex/article/details/6310727提供了9种针对字符串的Hash算法,而且带源码。
private int getHashCode(string url)
{
int mapCode = -1; if (null != url && "" != url)
{
for (int i = 0; i < url.Length; ++i)
{
mapCode += url[i];
mapCode += (mapCode << 16);
mapCode ^= (mapCode >> 10);
}
mapCode += (mapCode << 6);
mapCode ^= (mapCode >> 13);
mapCode += (mapCode << 16);
if (mapCode < 0)
{
mapCode = Math.Abs(mapCode);
}
mapCode = mapCode % m_bitArraySize;
}
return mapCode;
}以上的hashcode的碰撞稍微少一点,希望楼撒谎能够不吝赐教啊