字符串hash

2019.05.21

转载自:https://www.zybuluo.com/xzyxzy/note/1173636

哈希表常用于比较两个字符串是否相同(可以把状态看作字符串,从而比较状态是否相同)

实现方式

一个例子

通常将其看成一个进制数,比如 $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值尽可能分散,尽可能少的冲突

题单

发表评论