首页 / 软件开发 / 数据结构与算法 / 算法速成(五)五大经典查找之哈希查找
算法速成(五)五大经典查找之哈希查找2014-04-28 csdn博客 特种兵—AK47大家可否知道,其实查找中有一种O(1)的查找,即所谓的秒杀。哈希查找:对的, 他就是哈希查找,说到哈希,大家肯定要提到哈希函数,呵呵,这东西已经在我们脑子里面形成固有思维了。大家一定要知道“哈希“中的对应关系。比如说: ”5“是一个要保存 的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“和“2”就 建立一种对应关系,这种关系就是所谓的“哈希关系”,在实际应用中也就形成了”2“是key,”5“ 是value。那么有的朋友就会问如何做哈希,首先做哈希必须要遵守两点原则:①: key尽可能的分散,也就是我丢一个“6”和“5”给你,你都返回一个“2”,那么 这样的哈希函数不尽完美。②: 哈希函数尽可能的简单,也就是说丢一个“6 ”给你,你哈希函数要搞1小时才能给我,这样也是不好的。其实常用的做哈希的手法有“五 种”:第一种:”直接定址法“。 很容易理解,key=Value+C; 这个“C" 是常量。Value+C其实就是一个简单的哈希函数。第二种:“除法取余法”。 很 容易理解, key=value%C;解释同上。第三种:“数字分析法”。 这种蛮有意思 ,比如有一组value1=112233,value2=112633,value3=119033, 针对这样的数我们分 析数中间两个数比较波动,其他数不变。那么我们取key的值就可以是 key1=22,key2=26,key3=90。第四种:“平方取中法”。此处忽略,见名识意 。第五种:“折叠法”。这种蛮有意思,比如value=135790,要求key是2位数的散列值 。那么我们将value变为13+57+90=160,然后去掉高位“1”,此时key=60,哈哈,这就是他们 的哈希关系,这样做的目的就是key与每一位value都相关,来做到“散列地址”尽可能分散的 目地。正所谓常在河边走,哪有不湿鞋。哈希也一样,你哈希函数设计的再好,搞不好哪一次 就撞楼了,那么抛给我们的问题就是如果来解决“散列地址“的冲突。其实解决冲突 常用的手法也就2种:第一种: “开放地址法“。所谓”开放地址“,其实就是数组 中未使用的地址。也就是说,在发生冲突的地方,后到的那个元素(可采用两种方式:①线性 探测,②函数探测)向数组后寻找"开放地址“然后把自己插进入。