我是怎样自动机入门的
自动机貌似很难的噢
大学不是计算机专业,不过也看过编译原理,难哪,看不懂
读研了,有门课叫《形式语言与自动机理论》,当时用的这本书http://item.jd.com/11243080.html,看到个例子,才明白自动机是怎么回事
题目:
任何长度的二进制字符串,判断其是否可被3整除,余数是多少
转成十进制数显然是不行的,怎么办呢?
一个数被3除,余数有几种情况呢?
三种:0,1,2
被3除,余数是0的数可以表示为:3k(k为自然数)
被3除,余数是1的数可以表示为:3k+1
被3除,余数是2的数可以表示为:3k+2
以上对吧?
就是这三个状态了,有限的噢,状态数量有限,故叫有限状态自动机
要一边读字符,一边在这三个状态间转换
再加一个状态,叫开始状态(一般是用S表示的)
从左往右读,即从高位开始读
状态0表示余数为0,状态1表示余数为1,状态2表示余数为2
状态S: 第一个字符为1,进入状态1;第一个字符为0,进入状态0
状态0(3k+0):下一个字符为1,读入1,当前数变为2*(3k)+1,即6k+1,余数是1,所以进入状态1;
下一个字符为0,读入0,当前数变为2*(3k)+0,即6k,余数是0,所以进入状态0
状态1(3k+1):下一个字符为1,读入1,当前数变为2*(3k+1)+1,即6k+3,余数是0吧,所以进入状态0;
下一个字符为0,读入0,当前数变为2*(3k+1)+0,即6k+2,余数是2,所以进入状态2
状态2(3k+2):下一个字符为1,读入1,当前数变为2*(3k+2)+1,即6k+5,余数是2吧,所以进入状态2;
下一个字符为0,读入0,当前数变为2*(3k+2)+0,即6k+4,余数是1吧,所以进入状态1
读完所有的字符,最后停在哪个状态,余数就是对应的数,即最后是状态0,表示余数为0....
好了,自己写代码实现吧