构建确定性单带图灵机:识别奇长度单词中间字符并拒偶长输入
没问题,我来帮你一步步搞定这个图灵机!核心思路是**「两端消去法」**:从字符串左端标记一个字符,再跳到右端标记一个,来回循环——直到剩下最后一个未被标记的字符(那就是中间字符),此时停机接受;如果循环到最后没有剩余字符(偶长度),直接拒绝停机。
状态与符号定义
状态说明
q0:初始状态,负责标记左端未处理的字符q0_check:标记左端后,检查当前标记的字符是否是中间字符q1:向右扫描,寻找右端未处理的字符q2:找到右端空白后,回退定位右端未处理字符q2_mark:标记右端字符后,向左扫描寻找左端已标记的字符q3:找到左端标记后,定位下一个左端未处理字符q4:拒绝状态(偶长度或空字符串时进入)q5:接受状态(找到中间字符时进入)
符号说明
- 输入符号:
a,b,_(_代表空白符) - 标记符号:
X(标记左端已处理的字符),Y(标记右端已处理的字符)
完整状态转移表
所有转移遵循格式:STATE, SYMBOL -> STATE, SYMBOL, DIRECTION(DIRECTION为l左移、r右移、s停留)
q0, a -> q0_check, X, rq0, b -> q0_check, X, rq0, _ -> q4, _, sq0_check, a -> q1, a, rq0_check, b -> q1, b, rq0_check, Y -> q5, X, sq0_check, _ -> q5, X, sq1, a -> q1, a, rq1, b -> q1, b, rq1, X -> q1, X, rq1, _ -> q2, _, lq2, a -> q2_mark, Y, lq2, b -> q2_mark, Y, lq2, X -> q4, X, sq2_mark, X -> q3, X, rq2_mark, a -> q2_mark, a, lq2_mark, b -> q2_mark, b, lq2_mark, Y -> q2_mark, Y, lq3, a -> q0, a, sq3, b -> q0, b, sq3, Y -> q4, Y, sq3, _ -> q4, _, s
流程解释与示例
奇长度输入示例(aba)
- 初始状态
q0遇到第一个a,标记为X,右移进入q0_check q0_check遇到b,进入q1持续右移,直到碰到空白符_- 进入
q2左移一步,碰到a,标记为Y,进入q2_mark持续左移,直到碰到X - 进入
q3右移一步,碰到b,回到q0标记为X,右移进入q0_check q0_check碰到Y,判定当前X(原b)是中间字符,进入q5停机接受
偶长度输入示例(ab)
- 初始状态
q0遇到a,标记为X,右移进入q0_check q0_check遇到b,进入q1持续右移,碰到空白符_- 进入
q2左移一步,碰到b,标记为Y,进入q2_mark持续左移,碰到X - 进入
q3右移一步,碰到Y,判定为偶长度,进入q4停机拒绝
这个图灵机可以适配所有由a/b组成的输入,完美区分奇偶长度,准确定位奇长度单词的中间字符~
内容的提问来源于stack exchange,提问作者jippy

