NFA를 사용하지 않고 정규식에서 DFA를 만드는 방법은 무엇입니까?


12

목표는 정규식에서 DFA를 작성하는 것이며 "정규 exp> NFA> DFA 변환"을 사용하는 것은 옵션이 아닙니다. 어떻게해야합니까?

나는이 질문을 교수에게 물었지만 그는 우리가 직관을 사용할 수 있다고 말했고 친절하게 설명을 거부했다. 그래서 물어보고 싶었습니다.

"정규 exp> NFA> DFA 변환"은 이러한 변환이 다소 복잡한 정규식을 변환하는 데 많은 시간이 걸리기 때문에 옵션이 아닙니다. 예를 들어, 특정 정규식 "regex> NFA> DFA"의 경우 1 시간이 걸립니다. 30 분 이내에 정규 표현식을 DFA로 변환해야합니다.


2
더 많은 컨텍스트를 제공해야합니다. 정규식을 번역하기 위해 현재 어떤 (비공식) 알고리즘을 사용하고 있습니까? 과 같은 예를 통해 프로세스를 설명하는 것이 도움이 될 수 있습니다 a(a|ab|ac)*a+. 이를 NDFA로 직접 변환하여 DFA로 줄이거 나 DFA에 즉시 매핑되는 것으로 정규화 할 수 있습니다.
amon

어떤 방법 으로든 특정 예제에서 수행해야합니까, 아니면 컴퓨터에서 적용하려면 일반 절차를 제공해야합니까?
babou

답변:


18

"30 분 이내에 정규 표현식을 DFA로 변환하기"를 원하기 때문에 상대적으로 작은 예제를 직접 작성하고 있다고 가정합니다.

이 경우 Brzozowski의 알고리즘 을 사용하여 언어의 Nerode 오토 마톤 (최소 결정 론적 오토 마톤과 동일 함)을 직접 계산할 수 있습니다. 파생 상품의 직접 계산을 기반으로하며 교차와 보완을 허용하는 확장 된 정규 표현식에도 적용됩니다. 이 알고리즘의 단점은 값 비싼 프로세스를 따라 계산 된 표현식의 동등성을 점검해야한다는 것입니다. 그러나 실제로 작은 예제의 경우 매우 효율적입니다.[1]

왼쪽 몫 . 하자 의 언어가 될 * 및하자 단어합니다. 그러면 U - 1 L = { V * | u는 v에 L } 언어 - 1 L가 착신되는 좌측 몫 (또는 유도체 왼쪽 )의 L이 .LAu

u1L={vAuvL}
u1LL

Nerode 오토 마톤 . Nerode 오토 마톤 결정적 오토 마톤이고 ( L ) = ( Q , , , L , F ) 여기서, Q = { U - 1 L | U * } , F = { U - 1 L | U L } 및 전환 함수가 정의됩니다. 각 a LA(L)=(Q,A,,L,F)Q={u1LuA}F={u1LuL} , 화학식 ( U - 1 L는 ) A는 = - 1 ( U - 1 L ) = ( U ) - 1 L이 이 다소 추상적 정의주의. A의 각 상태는단어에 의해 L 의 왼쪽 몫이므로 A * 의 언어입니다. 초기 상태는 언어 L 이고 최종 상태 세트는 L 단어로 L 의 모든 왼쪽 몫 세트입니다.aA

(u1L)a=a1(u1L)=(ua)1L
ALALLL

a,b

a11=0a1b={1if a=b0if aba1(L1L2)=a1L1u1L2,a1(L1L2)=a1L1u1L2,a1(L1L2)=a1L1u1L2,a1L=(a1L)L
a1(L1L2)={(a1L1)L2si 1L1,(a1L1)L2a1L2si 1L1

L=(a(ab))(ba)

11L=L=L1a1L1=(ab)(a(ab))=L2b1L1=a(ba)=L3a1L2=b(ab)(a(ab))(ab)(a(ab))=bL2L2=L4b1L2=a1L3=(ba)=L5b1L3=a1L4=a1(bL2L2)=a1L2=L4b1L4=b1(bL2L2)=L2b1L2=L2a1L5=b1L5=a(ba)=L3
최소한의 오토 마톤

[1]

편집 . (2015 년 4 월 5 일) 방금 비슷한 질문을 발견 했습니다. 주어진 정규 표현식에서 설명하는 언어를 인식하는 DFA를 구축하기 위해 어떤 알고리즘이 존재합니까? cstheory에 물었다. 이 답변은 복잡성 문제를 부분적으로 해결합니다.


이 알고리즘의 복잡성에 대해 더 말할 수 있습니까?
babou

@babou RE를 DFA로 변환하는 것은 PSPACE-hard이므로 확실히 지수입니다.
jmite

이것은 아마도 대답에 들어가야합니다. OP는 "NFA를 통한 표준 구성이 너무 느리다"로 시작하고 답의 일부는 "불운, 정말 빠른 해결책은 없습니다"인 것 같습니다. 이것이 표준 구성보다 나은지 여부는 여전히 논의 중입니다. (cc @jmite)
라파엘

@jmite 네, 기대하고있었습니다. 내 질문에 대한 이유는 DFA를 구축하는 이러한 방법이 왜 더 쉬운 지 고려해야하는 이유입니다. (참고 : @ jmite 답변을 알려주는 데 하루 종일 걸렸습니다).
babou

2

제이 Pin은 형식 성과 완전성 측면에서 더 나은 답변을 제공하지만 교수님이 암시하고있는 "직관"에 대해 언급 할 것이 있다고 생각합니다.

대부분의 경우 가장 쉬운 방법은 정규식을보고 어떤 언어를 받아들이는지 이해 한 다음 창의력 / 영리성을 사용하여 해당 언어를 받아들이는 DFA를 구성하는 것입니다.

다른 사람이 제공 한 알고리즘 외에는이 작업을 수행하는 간단한 방법은 없지만 다음은 유용한 것으로 입증 될 수있는 몇 가지 지침입니다.

  1. 부울 또는 매우 작은 정수 변수 만 사용하여이 RE를 허용하는 프로그램을 작성할 수 있습니까? 그런 다음 해당 프로그램을 작성하고 모든 값 조합에 대한 상태가있는 DFA로 변환하십시오.

  2. 결정적으로 받아 들일 수있는 정규식의 부분을 찾으십시오. "이것을 보면 RE의이 부분과 일치해야합니다." 이러한 요소가 항상 많지는 않지만 이러한 부분을 식별하면 DFA를 쉽게 만들 수있는 부분이 표시 될 수 있으므로 실제로 비결 정성이 필요한 부분에 더 많은 시간을 할애 할 수 있습니다.

  3. NFA-> DFA의 서브셋 구성은 실제로 알고리즘이 그렇게 복잡하지 않습니다. 따라서 이것이 시험 문제가 아닌 과제라면 구현을 코딩하고 프로그램에서 NFA를 DFA로 변환하는 것이 더 빠를 수 있습니다. 자신의 코드를 사용한 경우에는 표절 문제가 없어야합니다.

P=NP=PSPACE

알고리즘에 많은 단계가 필요하지만 그 결과가 분명한 곳에 직관을 사용할 수있을 때 "미리보기"를 시도하십시오.


-2

이것이 올바른 방법은 아니지만 대부분의 경우 작동합니다.

첫 번째 단계 : 정규식에서 허용 할 수있는 가장 작은 문자열을 찾으십시오. 두 번째 단계 : 최소 문자열 수락 기계의 트랜잭션으로 필요한 상태를 그립니다. 세 번째 단계 : 모든 주에 대해 나머지 알파벳 거래를 그립니다.

예 : 정규식 (0 + 1) * 1 "1로 끝나는 문자열"1 단계 : 가장 작은 문자열 : 1 2 단계 : Q0과 Q1의 두 상태. Q0에서 Q1까지 1의 트랜잭션이 있습니다. Q1은 수락 상태입니다. 3 단계 : Q0 상태의 경우 Q0 1 트랜잭션은 Q1입니다. 이제 Q0 자체에서 0 트랜잭션을 작성하십시오. Q1 상태 Q1 1의 경우 거래는 Q1에 ​​남아 있습니다. 그리고 0 거래는 0 분기에 진행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.