(MIT6.045)自动机、可计算性和复杂性-正则表达式

语言(language)的计算性质:交、并、补、反转、拼接、星号(*)
在这里插入图片描述

星号是一元运算符,表示一个语言和自己的有穷次笛卡尔积。

回顾:正则语言(Regular Language)指可以用DFA描述的语言。

正则表达式

一个递归的定义。
在这里插入图片描述
其中,+、·和*的意义分别如下:
在这里插入图片描述

一个定理:
语言L可以被表示成某种正则表达式,iff语言L是正则的(可以用DFA描述)。

Generalized-NFA

将一个DFA写成正则表达式。从DFA读取单个字符(太麻烦)变为读取一个子串。

在这里插入图片描述
一个例子
在这里插入图片描述

再举一个例子。通过下面的步骤,我们可以将一个NFA转化成一个只有两个状态(起始和终止状态)的generalized-NFA。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

许多语言是不正则的。

比如:
在这里插入图片描述
对于上述例子中的C,我们需要时刻记住DFA和NFA的特性:有限状态(有限的记忆)。对于C,它的潜在状态可能是无穷多的,所以不能被DFA表示。
对于上述例子中的D,其结果为:
在这里插入图片描述

DFA最小化定理

(什么意义下的最小?)

对于每个正则语言A,都有一个唯一的(在状态re-labeling的情况下)最小的DFA M ∗ M^* M,使得 A = L ( M ∗ ) A=L(M^*) A=L(M)

一般地,最小NFA不唯一。

首先,介绍概念:
字符串 w w w区分了状态 p p p q q q,如果在状态 p p p q q q下,字符串被接受和被拒绝。

如果两个状态没法区分,那么他们就是冗余的。

于是我们可以构造等价类,每一个等价类里面的元素都是互相不可区分的。

根据上述的可区分概念,我们给出最小DFA的定义:
已知DFA M,其最小DFA M*是:

  1. L(M) = L(M*)
  2. 所有状态从起始状态开始都可达
  3. M*不可再约减(约减,指存在不可区分的状态)。

定理:满足上述123的状态机M*是唯一的、M的最小DFA。

由于DFA/NFA和正则表达式的等价性,我们自然会想,怎么证明两个正则表达式是等价的?

存在这样的算法,使得我们可以证明两个正则表达式等价。

Myhill-Nerode定理
对于语言L,要么有一个DFA可以描述,要么总是可以找到能骗过DFA的字符串。

和DFA的状态定义类似,我们也可以定义“状态”之间的等价关系。

L ⊂ Σ ∗ L \subset \Sigma^* LΣ x , y ∈ Σ ∗ x, y \in \Sigma^* x,yΣ。我们定义 x ≡ L y x \equiv_L y xLy,当且仅当 ∀ z ∈ Σ ∗ , x z ∈ L    ⟺    y z ∈ L \forall z \in \Sigma^*, xz \in L \iff yz \in L zΣ,xzLyzL。(显然这是个等价关系)。
注意,我们可以将这个定义和前述DFA的定义进行类比, x , y x, y x,y就像是决定了不同的状态,然后从不同的状态开始迭代。

基于这里的等价关系 ≡ L \equiv_L L定义,我们可以将 Σ ∗ \Sigma^* Σ分成若干个等价类。

于是,Myhill-Nerode定理表明:
如果等价类数量有限,则可以构建DFA。
否则不可构建DFA。

流算法(Streaming Algorithms)

Streaming Algorithms有三个组成部分:

  1. 初始化(变量和赋值)
  2. 当下一个符号是 σ \sigma σ的时候咋办(使用 σ \sigma σ和变量的伪代码)
  3. 当流跑完了(伪代码的输出,比如接受/拒绝)

Streaming Algorithms和DFA有几点大的不同。
4. 这玩意可能输出不止一个比特。
5. 这玩意的存储空间(也可以说是状态)可以随着读取字符串边长逐渐增长——这意味着它可以识别非正则语言。
6. 可以随机化、多通路

一个例子:
在这里插入图片描述
注意:和冯诺伊曼计算机不同,这里的存储空间使用不包括算法本身的存储。

DFA和流算法

定理: L ′ L' L可以被DFA M M M(有 2 p 2^p 2p个状态)识别,那么 L ′ L' L就可以被流算法A用p比特空间计算。

在这里插入图片描述

当alphabet的元素不止有0和1怎么办?

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43466027/article/details/130683761
今日推荐