- 论坛徽章:
- 0
|
有很多状态的转换表很相似, 比如说状态s1, s2,s3,假设区别仅仅在'a' (97) 上的转换,分别转换到 s4, s5, s6
看一下转换表:
tran[s1] = {...., s4 ..}; //'a'
tran[s2] = {...., s5 ..};
tran[s3] = {...., s6 ..};
defualt[s1] = s1;
default[s2] = s1;
default[s3] = s1;
next[0 ... 257] = {.... s4..., s5, s6}, next[258 ..](防止越界用的) = -1;
check[0 ... 255] = {s1, ... s1, s2, s3}; check[258..] = -1;
base[s1] = 0;
base[s2] = 256-'a' = 159;
base[s3] = 257-'a' = 160;
base是根据next的空闲位置而计算出来的, 比如当1找到位置0的时候, check[0-255]都瞒了, 然后对于s2, 只有当pos = 159,才发现 base[159+'a'] = -1(空闲) ;然后设置s2的base,并改next,check分别为s5,s2
然后拿这个例子跟一下就知道了
nextstate(s, a) |
|