我是怎样自动机入门的

自动机貌似很难的噢

大学不是计算机专业,不过也看过编译原理,难哪,看不懂

读研了,有门课叫《形式语言与自动机理论》,当时用的这本书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....


好了,自己写代码实现吧

原文地址:https://www.cnblogs.com/yjh4866/p/6253974.html