这是回复某一篇关于散列,完全散列的帖子写的代码。
再把问题描述一遍:
在两个很大的字符串数组中,求两个数组中共有的字符串
写一个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的散列算法
散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。对于几种典型的散列函数构造方法,做实验观察,不同的解决冲突方法对查询性能的影响。
散列表,也称为哈希表。根据设定的哈希函数H(key)和处理冲突的方法将一组... 处理冲突的方法:1)开放定址法(线性探测再散列,二次探测再散列,伪随机探测再散列) 2)再哈希法 3)链地址法 4)建立一 公共溢出区
10散列法的实验研究,散列法中,散列函数构造方法多种多样,同时对于同一散列函数解决冲突的方法也可以不同。两者是影响查询算法性能的关键因素。
散列结构
慕课网javascripts教程中的散列画廊特效.
SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)...
MD5散列算法 将任意字符串转化为32位的散列值
安全散列算法 SHA (即Secu re Hash AIgorlthm 安全散列算法)是一种 常用的数据加密算法.它由美国国家标准与技术局(NatlonaI InstItute of Standards and TechnoIogy)于1 993年作为联邦信息 处理标准公布(即第一代...
(1)自己定义一个散列函数,例如f(x)=x mod 11,从键盘输入一个数列,依次插入到散列表中去,采用线性探测方法解决碰撞问题。 (2)输入一个数字,根据所选择的散列函数进行相应的查找,输出查找结果。
山东大学软件学院数据结构课程设计线性开型寻址散列源代码
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 *...
本节主要讲散列表查找实现思想,几种常见散列函数和解决冲突方法。
js md5加密,$.md5(String)返回十六进制数,支持中文
区块链基础-散列法Hashing原理讲解
自己写的md5和sha1码生成工具,网上有文件的散列码生成工具,也有字符串在线生成散列码工具,此工具支持字符串的散列码生成,可直接打开执行,方便快捷。
详细地介绍了DMA数据传输的特点,提出了一套完整的基于散列DMA的工业级高速串口驱动设计方案,并利用该方案在SPEAR300处理器平台上设计了可在12Mbps下稳定工作的高速串口。该方案极少产生中断,大大提高了数据传输的...
两种适用于中文信息搜集的URL 散列函数的研究 硕士论文
针对LEACH路由协议簇头分布不均匀,节点死亡率高,易产生路由空洞及其所面临安全威胁等问题,提出一种基于散列链的区域划分网格自治安全路由协议LEACH-SEED。剔除低能量节点入选簇头的权利,改进簇头选举机制,簇头...