【刷题】hash妙用:将两个值映射为唯一状态标识

先上例子:

// 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 较为适当。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值