当前位置:编程学习 > JAVA >>

hashtabe,hashmap,等为什么要用hash算法

如果是为了2分查找算法,生成一个整数, 好做排序的话, 那么每个字符实际上都对应一个assiic码值

比如
ac = 6163
bb = 6262
因此就算不用hash散列算法 也不会重复呀. 更何况,hash算法也不能保证不发生碰撞.  这个情况下, 为什么还要使用hash呢???  求明白的给个原因 --------------------编程问答-------------------- 使用hash算法就是为了减少查找数据时,比较的次数;
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。实际应用中不可取,但是由此我们可以看出hash在查找方面的高效性;
具体hash的讲解我就不说了,网上挺多的
--------------------编程问答-------------------- 我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复 --------------------编程问答-------------------- hash算法不是为了避免重复,而是加快访问速度 --------------------编程问答-------------------- 推荐讨论一下 --------------------编程问答--------------------
引用 2 楼 chichenzhe 的回复:
我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章 --------------------编程问答-------------------- --------------------编程问答-------------------- hash不是为了用2分查找


hash用的是hash查找。 还是去补补基础吧 --------------------编程问答-------------------- 算了,还是直接告诉你吧, hash值其实就是地址 --------------------编程问答--------------------  使用 hash 算法就是为了减少查找数据时,比较的次数;
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。 --------------------编程问答-------------------- 使用 hash 算法就是为了减少查找数据时,比较的次数; --------------------编程问答-------------------- 刚好五个字啊  --------------------编程问答-------------------- 我也要补补了,好多都不懂。。。 --------------------编程问答-------------------- 以为整个世界只有二分吗,lz就不是个明白人 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 刚好五个字 --------------------编程问答-------------------- --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 楼主说的这个问题。对数值的查找确实不适合使用hash算法,hash算法适合对字符串内容的查找。对数值的查找当然是能用2分法的话就用2分法。楼主问的意思是对的。 --------------------编程问答-------------------- 二分查找怎么就和hash扯上关系了?谁规定二分查找非得用hash?两个完全不相干的东西在一起比较没什么意思 --------------------编程问答--------------------
引用 1 楼 bingaabing 的回复:
使用hash算法就是为了减少查找数据时,比较的次数;
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。实际应用中不可取,但是由此我们可以看出hash在查找方面的高效性;
具体hash的讲解我就不说了,网上挺多的


1楼解释的挺好的,其实具体看看hashmap的源码,就明白了。 --------------------编程问答-------------------- 感谢您的分享 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 目测撸主培训班刚毕业。 --------------------编程问答-------------------- 刚好最近看过这个,我也说说我的了解,大家讨论一下
之所以用hash,是考虑两个方面
1、就是撸主提到的访问效率。通过hash得到一个地址值、或者数组下标,然后直接访问得到数据
2、存储空间的问题。如果仅仅是为了存储数十个数据,却用了较大的空间,明显有较大的空间浪费
至于发生碰撞的问题,有很多方法解决,比如hashset,就是用链表法解决冲突 --------------------编程问答-------------------- 楼主的意思是:
“我每个数值都给它分配一个变量,那么我需要这个数时,就可以直接访问这个变量得到,只需一次,不需要对比查找。”

楼主的程序语言还没入门 --------------------编程问答-------------------- 使数据在哈希表中尽可能的均匀,从而使得在数据量大的时候不同的key的查询速度基本一样,算是是一个平均速度 --------------------编程问答--------------------
引用
使用hash算法就是为了减少查找数据时,比较的次数;
查找时最理想的情况下,仅需一次比较就能找到,当然这种理想是以牺牲存储空间实现的。实际应用中不可取,但是由此我们可以看出hash在查找方面的高效性;
具体hash的讲解我就不说了,网上挺多的
--------------------编程问答-------------------- 因此就算不用hash散列算法 也不会重复呀. 更何况,hash算法也不能保证不发生碰撞.  这个情况下, 为什么还要使用hash呢???  求明白的给个原因  --------------------编程问答-------------------- 其实我也不明白 --------------------编程问答--------------------
引用 5 楼 udbwcso 的回复:
Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章


好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540

我其实就是不明白为什么要用hash算法算出个那么大的值来.   那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的.  这样的话要耗费多少内存来生成这么个数组呢? --------------------编程问答--------------------
引用 30 楼 chichenzhe 的回复:
Quote: 引用 5 楼 udbwcso 的回复:

Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章


好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540

我其实就是不明白为什么要用hash算法算出个那么大的值来.   那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的.  这样的话要耗费多少内存来生成这么个数组呢?

key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码

 public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法

static int indexFor(int h, int length) {
        return h & (length-1);
    }
--------------------编程问答--------------------
引用 31 楼 lawrence860104 的回复:
Quote: 引用 30 楼 chichenzhe 的回复:

Quote: 引用 5 楼 udbwcso 的回复:

Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章


好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540

我其实就是不明白为什么要用hash算法算出个那么大的值来.   那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的.  这样的话要耗费多少内存来生成这么个数组呢?

key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码

 public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法

static int indexFor(int h, int length) {
        return h & (length-1);
    }


感谢,我已经基本明白了.
还有个问题: 如果确认一个动态的hashtable 或者map 元素数量肯定少于10万个,我提前把他的size设置为10万的话这个集合的查找,插入效率将大大提升呢? --------------------编程问答--------------------
引用 32 楼 chichenzhe 的回复:
Quote: 引用 31 楼 lawrence860104 的回复:

Quote: 引用 30 楼 chichenzhe 的回复:

Quote: 引用 5 楼 udbwcso 的回复:

Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章


好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540

我其实就是不明白为什么要用hash算法算出个那么大的值来.   那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的.  这样的话要耗费多少内存来生成这么个数组呢?

key的hash值也不是直接拿来当数组下标用的
下面hashMap的一段代码

 public V get(Object key) {
        if (key == null)
            return getForNullKey();
        int hash = hash(key.hashCode());
        for (Entry<K,V> e = table[indexFor(hash, table.length)];
             e != null;
             e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                return e.value;
        }
        return null;
    }

看table这个数组下标,是indexFor(hash, table.length)
下面是indexFor方法

static int indexFor(int h, int length) {
        return h & (length-1);
    }


感谢,我已经基本明白了.
还有个问题: 如果确认一个动态的hashtable 或者map 元素数量肯定少于10万个,我提前把他的size设置为10万的话这个集合的查找,插入效率将大大提升呢?

是这样的 --------------------编程问答-------------------- 这个要顶一下!费心了 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答--------------------
引用 楼主 chichenzhe 的回复:
如果是为了2分查找算法,生成一个整数, 好做排序的话, 那么每个字符实际上都对应一个assiic码值

比如
ac = 6163
bb = 6262
因此就算不用hash散列算法 也不会重复呀. 更何况,hash算法也不能保证不发生碰撞.  这个情况下, 为什么还要使用hash呢???  求明白的给个原因
d大调 --------------------编程问答--------------------
引用 30 楼 chichenzhe 的回复:
Quote: 引用 5 楼 udbwcso 的回复:

Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章


好吧, 我态度有问题, 表示歉意.
我明白 hashmap.get(hashcode) 就是直接从数组里端出来,没有循环(不冲突的情况)
我在C#区也发了个贴:
http://bbs.csdn.net/topics/390620540

我其实就是不明白为什么要用hash算法算出个那么大的值来.   那样的话[key的hash最小值]-->[key的hash最大值]是很恐怖的.  这样的话要耗费多少内存来生成这么个数组呢?
的方式的所得税 --------------------编程问答-------------------- hash表查找速度快,但是浪费内存空间。 --------------------编程问答--------------------
引用 5 楼 udbwcso 的回复:
Quote: 引用 2 楼 chichenzhe 的回复:

我都说了 我知道2分查找算法啊... 你还说什么 只需一次比较...何况这也不是所谓一次比较就能得出.

求明白人给个回复


说实话实在不想回这个贴,不管别人说的对不对你这个态度就有问题
根据实际情况找到合适的散列函数分配足够的空间,一次比较找到是有可能实现的
看数据结构散列这一章

对头,《数据结构与算法分析-c语言描述》 中的散列一节好好看看 --------------------编程问答-------------------- as700000000000896,"1 --------------------编程问答-------------------- 你看下源码。或者了解下hash算法。很强大。  --------------------编程问答-------------------- hash的作用就是散列,hashtable就是借助hash算法将数据分布到不同的地方,以此达到更高的查询效率,hash不是没有碰撞,只是机率比较小,而且大多数hashtable都是有resize的过程,所以大多数的数据能达到时间复杂度为O(1)。

至于你说的那个ac = 6163,bb = 6262,只是你列出来一个小字符串的ascii,当一个字符串很长的时候你用什么值来当key呢? --------------------编程问答-------------------- --------------------编程问答-------------------- 除
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,