先上例子:
// dfs遍历时,确定一对数是否出现过:
Set<Long> seen = new HashSet<Long>();
// 放入这两个数的hash值
seen.add(hash(a, b));
public long hash(int[] state) {
return (long) state[0] * 1000001 + state[1];
}
1. 哈希的用处:
唯一标识状态: 在搜索问题中,使用哈希可以唯一标识当前状态,避免重复计算,提高算法效率。在这个问题中,使用哈希集合 seen 记录已访问过的状态,避免重复访问相同的状态。
状态映射: 哈希函数可以将状态映射为一个唯一的值,方便在哈希集合中进行查找。在这个问题中,使用 hash 方法将状态数组 [remain_x, remain_y] 映射为一个长整数,用于在 seen 中查找。
2. 选择哈希函数的常数因子:
质数的选择: 选择一个合适的质数作为哈希函数的乘法因子,可以提高哈希函数的散列性,降低冲突的概率。在这个问题中,选择 1000001 是为了确保足够大,避免发生溢出,并提高哈希函数的唯一性。
适应数据范围: 考虑数据范围和哈希表大小,选择适当范围内的常数因子。在这个问题中,根据数据范围 1 <= jug1Capacity, jug2Capacity, targetCapacity <= 10^6,选择 1000001 较为适当。