`
leon_a
  • 浏览: 77788 次
  • 性别: Icon_minigender_1
  • 来自: 拜月神教
社区版块
存档分类
最新评论

散列,全散列

阅读更多
这是回复某一篇关于散列,完全散列的帖子写的代码。
再把问题描述一遍:
在两个很大的字符串数组中,求两个数组中共有的字符串

写一个o(m*n)的算法很容易
实际上引入hash,完全把复杂度降到o(m+n)

但是引入hash,需要注意hash冲突;当hashcode冲突时,需要在hash数组上纵向bucket;将重复hashcode存入到纵向bucket。
hash查询时,查询到某一bucket,再进行一次迭代查找hashcode

理想状态无冲突的复杂度为o(m+n)
假设平均冲突为常数k,则复杂度变为o(k(m+n))
实际情况下,当ary足够大,冲突会变得足够小,k可忽略不计。即o(k(m+n))=o(m+n)

下面是回复内容


mylazygirl 写道
leon_a 写道
算了,放代码,冲突是必须的,但当ary数组足够大,能有效避免冲突。
public class Main {

	public static void main(String[] args) {
		String[] strArr1 = { "xiaoxin", "niutou", "shanqiu", "luobo" };
		String[] strArr2 = { "xiaoxin", "ggg", "shanqiu", "meile", "dddsf", "niutou" };
		int max = strArr1.length > strArr2.length ? strArr1.length : strArr2.length;
		int[] ary = new int[max*4];
		for (int i = 0; i < strArr1.length; i++) {
			int hash = hash(strArr1[i].hashCode());
			int index = indexFor(hash,max*4);
			ary[index] = 1;
		}
		for (int i = 0; i < strArr2.length; i++) {
			int hash = hash(strArr2[i].hashCode());
			int index = indexFor(hash,max*4);
			if(ary[index] == 1){
				System.out.println(strArr2[i]);
			}
		}
	}

    static int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

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



这位兄弟的代码我没看懂,用hash我倒是明白,但hash()方法就不知道是做什么的了,打印了一下值,发现有重复,于是将输入换一下
String[] strArr1 = { "xiaoxin", "niutou", "shanqiu"};
		String[] strArr2 = { "ggg", "shanqiu", "meile", "dddsf", "niutou", "luobo"};

结果就错了,这个hash()方法莫不是随便做了做位操作而已,没什么意义?希望明白的人解答

那我就再放代码,无冲突版本
package test;

import java.util.Arrays;

public class Hash {

    public static void main(String[] args) {
        // String[] strArr1 = { "xiaoxin", "niutou", "shanqiu", "luobo" };
        // String[] strArr2 = { "xiaoxin", "ggg", "shanqiu", "meile", "dddsf", "niutou" };
        String[] strArr1 = { "xiaoxin", "niutou", "shanqiu" };
        String[] strArr2 = { "ggg", "shanqiu", "meile", "dddsf", "niutou", "luobo" };
        int max = strArr1.length > strArr2.length ? strArr1.length : strArr2.length;
        int[][] ary = new int[max * 4][];
        for (int i = 0; i < strArr1.length; i++) {
            int hash = hash(strArr1[i].hashCode());
            int index = indexFor(hash, max * 4);
            if (ary[index] == null) {
                ary[index] = new int[1];
            } else {
                ary[index] = Arrays.copyOf(ary[index], ary[index].length * 2);
            }
            for (int j = 0; j < ary[index].length; j++) {
                if (ary[index][j] == 0) {
                    ary[index][j] = hash;
                }
            }
        }
        for (int i = 0; i < strArr2.length; i++) {
            int hash = hash(strArr2[i].hashCode());
            int index = indexFor(hash, max * 4);
            if (ary[index] != null) {
                for (int j = 0; j < ary[index].length; j++) {
                    if (ary[index][j] == hash) {
                        System.out.println(strArr2[i]);
                    }
                }
            }
        }
    }

    static int hash(int h) {
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

    static int indexFor(int h, int length) {
        return h & (length - 1);
    }
}
分享到:
评论

相关推荐

    java的散列算法

    java的散列算法,java的散列算法,java的散列算法,java的散列算法,方便有需要的兄弟,java的散列算法java的散列算法java的散列算法java的散列算法

    散列法的实验研究

    散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。对于几种典型的散列函数构造方法,做实验观察,不同的解决冲突方法对查询性能的影响。

    散列表 (哈希表,线性探测再散列)

    散列表,也称为哈希表。根据设定的哈希函数H(key)和处理冲突的方法将一组... 处理冲突的方法:1)开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列) 2)再哈希法 3)链地址法 4)建立一 公共溢出区

    10散列法的实验研究

    10散列法的实验研究,散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。

    散列结构的画图解释图

    散列结构

    JS实现图片散列特效

    慕课网javascripts教程中的散列画廊特效.

    SHA-1散列认证算法原代码

    SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)...

    MD5散列算法

    MD5散列算法 将任意字符串转化为32位的散列值

    SHA(安全散列算法)

    安全散列算法 SHA (即Secu re Hash AIgorlthm 安全散列算法)是一种 常用的数据加密算法.它由美国国家标准与技术局(NatlonaI InstItute of Standards and TechnoIogy)于1 993年作为联邦信息 处理标准公布(即第一代...

    数据结构c语言散列查找(实验报告)

    (1)自己定义一个散列函数,例如f(x)=x mod 11,从键盘输入一个数列,依次插入到散列表中去,采用线性探测方法解决碰撞问题。 (2)输入一个数字,根据所选择的散列函数进行相应的查找,输出查找结果。

    线性开型寻址散列

    山东大学软件学院数据结构课程设计线性开型寻址散列源代码

    哈希表线性探测再散列(纯数字)

    c代码实现哈希表线性探测再散列。关键字均为纯数字。查找时为单次查找,未加入循环

    散列算法(C++)

    散列算法 #include #include #include #include enum{ NPREF=2, NHASH=4093, MAXGEN=10000 }; typedef struct State State; typedef struct Suffix Suffix; struct State{ char *pref[NPREF]; Suffix *...

    数据结构7.4散列查找技术

    本节主要讲散列表查找实现思想,几种常见散列函数和解决冲突方法。

    jsmd5散列算法

    js md5加密,$.md5(String)返回十六进制数,支持中文

    区块链基础:散列法

    区块链基础-散列法Hashing原理讲解

    md5、sha1散列码生成工具

    自己写的md5和sha1码生成工具,网上有文件的散列码生成工具,也有字符串在线生成散列码工具,此工具支持字符串的散列码生成,可直接打开执行,方便快捷。

    散列DMA设计的高速串口驱动技术

    详细地介绍了DMA数据传输的特点,提出了一套完整的基于散列DMA的工业级高速串口驱动设计方案,并利用该方案在SPEAR300处理器平台上设计了可在12Mbps下稳定工作的高速串口。该方案极少产生中断,大大提高了数据传输的...

    两种适用于中文信息搜集的URL散列函数的研究

    两种适用于中文信息搜集的URL 散列函数的研究 硕士论文

    论文研究-一种基于散列链的自适应网格安全路由协议.pdf

    针对LEACH路由协议簇头分布不均匀,节点死亡率高,易产生路由空洞及其所面临安全威胁等问题,提出一种基于散列链的区域划分网格自治安全路由协议LEACH-SEED。剔除低能量节点入选簇头的权利,改进簇头选举机制,簇头...

Global site tag (gtag.js) - Google Analytics