Java语言根据一个数组里每个数字的排列,求出构造这个数组成为一个哈希表并且不存在碰撞的算法是什么?什么算法的性能最高?为什么
构造一个没有碰撞的哈希表是一个常见且重要的问题。
有个常用的算法叫 开放寻址法
基本思路如下
1 初始化一个大小为N的哈希表,其中N为大于待存储元素个数的质数。
2 对于数组中的每个元素,计算其哈希值H。
3 如果哈希表中H位置为空,则将元素存储在该位置。
4 如果位置H已经被其他元素占用,则使用某种探测函数D来找到下一个可用的位置。常用的探测函数有线性探测、二次探测和双散列等。
5 重复步骤4,直到找到一个空位置,将元素存储在该位置。
性能最高的算法取决于具体的场景和数据特征。一般来说,线性探测法相对简单且容易实现,适用于较小的数据集。而二次探测法和双散列法虽然复杂一些,但在大数据集和高并发环境下表现更好。
开放寻址法的性能取决于负载因子 ,也就是哈希表中已存储元素的比例。当负载因子较大时,冲突的概率会增加,从而可能导致性能下降。所以说在选择算法和调整哈希表大小时,需要综合考虑数据量和内存消耗。
不知道你这个问题是否已经解决, 如果还没有解决的话:import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Pattern;
// 静态导入
import static java.util.regex.Pattern.*;
/**
* Created by Feng on 2020/2/21 17:01
* CurrentProject's name is java8
* 输入一行字符,分别统计出包含英文字母、空格、数字和其他字符的个数
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
// 正则匹配
Pattern[] patterns = new Pattern[]{
compile("[a-zA-Z]"), compile(" "),
compile("[0-9]"), compile("[^a-zA-Z 0-9]")
};
String message;
while((message = bufferedReader.readLine()) != null){
char[] chars = message.toCharArray();
// 个数:顺序是英文字母、空格、数字、其他字符
int[] result = new int[4];
for (char aChar : chars) {
for (int i = 0; i < patterns.length; i++) {
if(patterns[i].matcher(aChar + "").matches()){
result[i]++;
}
}
}
// 输出结果
for (int num : result) {
System.out.println(num);
}
}
}
}