【发布时间】:2016-04-16 20:28:55
【问题描述】:
开发一个散列函数来为给定的交通许可证号码生成一个介于 0-4999 之间的索引值。您的散列函数应该产生尽可能少的冲突。散列函数应该使用许可证号的属性。哈希方法应该将许可证号作为单个字符串并返回一个索引值。我们假设许可证编号采用以下格式: 城市代码是介于 10 和 99 之间的数字。三个字母是英文字母表中的任意字母组合,有 26 个字符。两位数是 10 到 99 之间的数字。
我写了一些关于这个问题的东西,但是碰撞很多(5k 1800)
static long printValue(String s) {
long result = 0;
for (int i = 0; i < s.length(); i++) {
result += Math.pow(27, MAX_LENGTH - i - 1) * (1 + s.charAt(i) - 'A');
}
result = result % 5009;
return (int) result;
}
public int hashF(String str) {
String a = str.substring(0, 2);
String b = str.substring(5, 7);
String middle = str.substring(2, 5);
int q = (int) printValue(middle);
String last = a + q + b;
int index = Integer.parseInt(last);
index = index % 5009;
return index;
}
Link for orjinal file of licence numbers.
这些是交通许可证号文件中的一些示例。碰撞次数必须为 300(最大值)。
65HNM25 93DTV23 94WPX23 31RKK46 15YXX90 31MDV74 45BOG99 65JRM50 77VXR55 39TKY41 80MJU73 63QYE57 38FCO80 45ORI16 17CHN73 70SXR63 87CVM74 27EEE85 32PFJ91 50PBA66 70TVK72 15YLS20 80MPM74 21ZRN20 36VVE84 58IDW24 77VDC89 19BVK93 28SUF63
【问题讨论】:
-
"三位数字是介于 100 和 999 之间的数字。"我在您的数据集中没有看到任何三位数。
-
"0-4999 之间的索引值" - 您的索引在 0 和 5008 之间!
-
我编辑了问题。
-
没错,索引应该是 5000,但是使用素数我们可以减少碰撞。我们可以改变一点。
标签: java data-structures hash hashtable