哈希表常用于比较两个字符串是否相同(可以把状态看作字符串,从而比较状态是否相同)
实现方式
一个例子
通常将其看成一个进制数,比如 $ABAF$ 看成 $1216$,那么哈希值就是$Hash = 1*base^3 + 2*base^2 + 1*base +6$,可以自由决定,如果说状态量有限,可以使用较小的$base$使得所有状态不冲突,若状态量较大且分散,可以采用取模或者自然溢出的方式尽可能避免冲突
优缺点
优点是可以$O(1)$比较(数组是$O(1)$如果用map就要加一个$log$) 缺点是会有冲突,为避免冲突可以选择双哈希或三哈希等(选取不同的模数)
哈希方式
进制哈希(用于判断状态/数组是否相同)
$$ Hash[i] = Hash[i-1]*base + val[i] $$
树哈希(用于判断树的同构)
$$ Hash[x] = \sum_{xor-sum}{(Hash[son_{1...k}]+bash1)*(siz[x]+base2)+deep[x]*base3} $$
其实没有一定要求这么写,只是树的同构要求深度相同,孩子也同构但是与孩子的顺序无关,所以信息就是儿子的和深度和大小,可以灵活处理
注意:base的选取原则是使得Hash值尽可能分散,尽可能少的冲突