`
lance5678
  • 浏览: 690 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java 散列算法计算重复数据

阅读更多
package com.lance.algorithm.算法;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Sanlie {

private static Sanlie instance = new Sanlie();

private Sanlie() {
};

public static Sanlie getInstance() {
return instance;
}

public static void main(String[] args) {

Sanlie instance = Sanlie.getInstance();

String[] str1 = new String[] { "11", "3", "3", "3" };
String[] str2 = new String[] { "3" };

List<Result> result = instance.doSanlie(str1, str2);

// List<Result> result = instance.doSanlie(str1);

for (Result resultValue : result) {
System.out.println(resultValue.getIndex() + " "
+ resultValue.getValue());
}
}

/**
* 获取两个数组中相同的字符
*
* @param str1
*            str1
* @param str2
*            str2
* @return List<String>
*/
public List<Result> doSanlie(String[] str1, String[] str2) {
List<Result> result = new ArrayList<Result>();
int max = str1.length > str2.length ? str1.length : str2.length;
int min = str1.length < str2.length ? str1.length : str2.length;

int[][] cache = new int[max * min][];

for (String str1Value : str1) {
int hash = hash(str1Value.hashCode());
int index = index(hash, max * min);

if (cache[index] == null) {
cache[index] = new int[1];
} else {
cache[index] = Arrays.copyOf(cache[index],
cache[index].length + 1);
}

for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == 0) {
cache[index][j] = hash;
break;
}
}
}

for (int i = 0; i < str2.length; i++) {
int hash = instance.hash(str2[i].hashCode());
int index = instance.index(hash, max * min);
if (cache[index] != null) {
for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == hash) {
Result repReault = new Result();
repReault.setIndex(i + 1);
repReault.setValue(str2[i]);
result.add(repReault);
break;
}
}
}
}
return result;
}

/**
* 查找数组中重复的字符
*
* @param str1
* @return
*/
private List<Result> doSanlie(String[] str1) {
List<Result> result = new ArrayList<Result>();
int max = str1.length;

int[][] cache = new int[max * max][];

for (int i = 0; i < str1.length; i++) {
int hash = hash(str1[i].hashCode());
int index = index(hash, max * max);

if (cache[index] == null) {
cache[index] = new int[1];
} else {
cache[index] = Arrays.copyOf(cache[index],
cache[index].length + 1);
}

for (int j = 0; j < cache[index].length; j++) {
if (cache[index][j] == 0) {
cache[index][j] = hash;
break;
} else if (cache[index][j] == hash) {
Result repReault = new Result();
repReault.setIndex(i + 1);
repReault.setValue(str1[i]);
result.add(repReault);
break;
}
}
}
return result;
}

/**
* 这个地方是重点
*
* @param hashCode
*            hashCode
* @return
*/
private int hash(int hashCode) {
hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12);
return hashCode ^ (hashCode >>> 7) ^ (hashCode >>> 4);
}

private int index(int hash, int length) {
return hash & (length - 1);
}

class Result {
private int index;
private String value;

public int getIndex() {
return index;
}

public void setIndex(int index) {
this.index = index;
}

public String getValue() {
return value;
}

public void setValue(String value) {
this.value = value;
}

}

}
分享到:
评论

相关推荐

    Java数据结构和算法.(第二版).rar

    《Java数据结构和算法》第二版是一本深入探讨如何在Java编程环境中应用数据结构和算法的书籍。数据结构是组织和存储数据的方式,而算法则是解决问题的步骤或指令集。这本书针对Java程序员,旨在提高他们对这两方面...

    数据结构与算法分析(Java版)

    在Java版本中,我们通常会深入探讨如何利用Java语言来实现各种数据结构和算法。这里我们将详细阐述几个关键的知识点。 首先,数据结构是存储和组织数据的方式,包括数组、链表、栈、队列、哈希表、树(如二叉树、...

    数据结构 课件java版本

    5. **集合框架**:Java提供了丰富的集合框架,包括Set(不允许重复元素)、List(有序,允许重复元素)和Map(键值对)。HashSet、ArrayList、HashMap分别是它们的常见实现。 6. **树结构**:如二叉树、二叉搜索树...

    JAVA经典算法90道

    通过将问题分解为子问题,然后存储子问题的解,避免重复计算,如背包问题、最长公共子序列、最短路径问题等。 4. **图论算法**:包括深度优先搜索(DFS)和广度优先搜索(BFS),以及Dijkstra算法、Floyd-Warshall...

    JAVA数据结构和算法

    在编程领域,掌握数据结构和算法是至关重要的,特别是对于使用Java这种广泛应用于企业级开发的语言。本资源“JAVA数据结构和算法”提供了一系列用Java语言编写的代码示例,旨在帮助初学者深入理解这些核心概念。虽然...

    Java数据结构和算法

    在编程世界中,Java数据结构和算法是程序员的基石,它们是解决问题和设计高效软件的核心。数据结构是指在计算机中组织和存储数据的方式,而算法则是解决特定问题的步骤或方法。了解并熟练掌握这两者对于提升编程技能...

    [数据结构(Java版)(第4版)][叶核亚][程序源代码].rar

    《数据结构(Java版)(第4版)》是由叶核亚编著的一本经典教材,专注于讲解数据结构与算法的实现,特别是采用Java语言进行编程。这本书通过深入浅出的方式,帮助读者理解和掌握各种数据结构及其在实际问题中的应用...

    java的MD5算法

    在计算机科学领域中,MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,能够将任意长度的数据转换为固定长度的128位(16字节)哈希值。由于其独特的特性,MD5被广泛应用于数据完整性检查、密码存储等多...

    JAVA版数据结构与算法

    在编程领域,数据结构与算法是核心组成部分,尤其是在使用Java这样的高级编程语言时。数据结构是组织、管理和存储数据的方式,而算法则是解决问题或执行任务的精确步骤。本资料包聚焦于“JAVA版数据结构与算法”,将...

    Java数据结构和算法(第二版).rar

    《Java数据结构和算法(第二版)》是深入学习编程基础和优化问题解决能力的重要教材。这本书涵盖了数据结构和算法的基础知识,以及如何在Java语言环境下实现这些概念。以下是其中的一些核心知识点: 1. **数据结构*...

    Java数据结构和算法中文第二版

    本资源“Java数据结构和算法中文第二版”是一个面向Java程序员的教材,虽然版本较旧,但依然包含了许多经典的知识点。 1. **数组**:数组是最基础的数据结构,它存储同一类型的数据集合。在Java中,数组的长度是...

    基于JAVA技术的MD5加密算法的设计与实现

    MD5(Message-Digest Algorithm 5)是一种广泛应用于数字签名、电子商务、信息加密等领域的散列算法。它能够将任意长度的消息压缩成一个固定长度的散列值(通常为128位),这个过程不可逆,且原始消息的微小改变会...

    Java数据结构和算法中文4(第二版)

    根据提供的信息,我们可以推断《Java数据结构和算法中文4(第二版)》是一本专注于Java编程语言中的数据结构与算法应用的专业书籍。虽然提供的部分内容并没有包含实际的章节或者具体的讲解内容,但根据书名、描述及...

    大学算法课程设计相关算法C,Java版解答

    C和Java都能有效地实现这些算法,它们各有优缺点,适用于不同的数据规模和场景。 2. **查找算法**:包括线性查找、二分查找、哈希查找等。二分查找在有序数组中效率较高,而哈希查找则利用散列函数快速定位,是解决...

    数据结构与算法分析(java)

    12. **动态规划**:动态规划是一种优化技术,通过将大问题分解为子问题来解决,避免重复计算,常用于最优化问题。 13. **字符串处理**:Java的String类提供了许多处理字符串的方法,如拼接、查找、替换等。字符串...

    Java加密 消息摘要算法SHA实现详解

    这为开发者提供了快速实现SHA散列算法的方法,无需手动处理字节数据和编码问题。 在实际应用中,消息摘要算法SHA用于多种场景,比如数字签名、数据完整性校验、密码存储等。数字签名通常会结合公钥加密算法使用,...

Global site tag (gtag.js) - Google Analytics