정규식을 효율적으로 일치시킬 수있는“작은”기계가 있습니까?


30

정규식은 정규식에 비례하는 크기의 비결정론 적 유한 오토 마톤 또는 잠재적으로 기하 급수적으로 큰 결정 론적 FA에 의해 인식 될 수 있다는 것이 잘 알려져있다. 또한 문자열 와 정규식 주어지면 NFA는, DFA는. NFA의 둔화는 본질적으로 우리가 오토 마톤에있을 수있는 가능한 상태 세트를 추적해야한다는 사실과 DFA의 기하 급수적 인 증가는 그 상태가 국가의 힘의 요소라는 사실에서 비롯됩니다. NFA.r | s | | r | | s |sr|s||r||s|

보다 강력한 기계를 사용할 수 있다면 효율적으로 (즉, 보다 효율적으로, 그리고 보다 나은 공간에서 정규식을 인식 할 수 있습니까? 유한 오토마타보다? (예를 들어, 푸시 다운 오토마타 또는 카운터 머신으로 일반 언어를 인식하는 데 간결한 이점이 있습니까?)O ( 2 | r | )O(|r||s|)O(2|r|)


2
"NFA가 "에 비례하여 시간에 따라 멤버쉽을 테스트 할 수 있다고 말할 때 NFA를 명백한 방식으로 시뮬레이트하는 (결정 론적) RAM 머신이 너무 많은 시간을 소비한다는 것을 의미합니까? 아니면 다른 계산 모델을 참조하지 않는 "NFA의 런타임"을 정의하는 다른 방법이 있습니까? (문자열 에 대한 NFA의 런타임 은 라는 현명하지만 유용하지 않은 정의는 제외 )s | s ||s||r|s|s|
Radu GRIGore

네, 제 질문에 대한 올바른 해석입니다.
Neel Krishnaswami

2
그런 다음 간단히 물어 보는 것이 더 자연스러운 것 같습니다. 문자열 가 에서 작동 하는 정규 표현식 의해 정의 된 언어 인지)를 결정하는 알고리즘이 있습니까 (RAM 시스템에) 있습니까? 시간과 공간? (특히 RAM 시스템의 관점에서 푸시 다운 오토마타의 런타임을 정의하는 경우)r o ( | s || r | ) o ( 2 | r | )sro(|s||r|)o(2|r|)
Radu GRIGore

1
문제를 정확히 이해하지 못합니다. 입력 값이 문자열이고 정규 표현식 r이고, 문제는 s가 정규 표현식 r에 의해 정의 된 언어인지 여부를 결정하는 것입니까?
Robin Kothari

@Robin : 그렇습니다. 더 많은 계산 능력을 사용하여 유한 오토마타보다 정규 표현식을보다 효율적으로 일치시킬 수 있는지 또는 추가 기능 (예 : 스택, RAM)이 도움이되지 않는지 알고 싶습니다.
Neel Krishnaswami

답변:


20

다음과 같이 공간을위한 시간을 절약 할 수 있습니다

정규식을 NFA로 변환-알고리즘 비교의 구체성을 위해 은 NFA 상태의 수 라고 가정 하여 NFA를 직접 시뮬레이션하기위한 시간이 유효하고 변환 된 DFA를 실행할 수있는 공간도 많은 메모리를 처리 할 수있는 RAM에서 작업 할 때마다 유효합니다.rO(rs)O(2r)

이제 NFA의 상태를 (임의로) 각각 최대 상태 의 서브 세트 로 분할하십시오 . 각각의 서브 세트 내 , 우리가 할 수있는 인덱스 서브 세트 의 행 번호에 의해 으로 .kSir/kSiAiSi02r/k1

테이블 여기서 와 는 0에서 사이의 범위에 있고 , 는 입력 기호이며, 는 의 부분 집합입니다 . 테이블에 저장된 값 (의 수치 인덱스)의 부분 집합이다 : 상태 인 의 경우에만, 속하는 하고있는 상태가 그 천이 행 입력 심볼에 .I , J의 K - 1 C I S I S J , Y T [ I , J , C , I ] Y S J I Y CT[i,j,c,Ai]ijk1cAiSiSjyT[i,j,c,Ai]ySjAiyc

NFA를 시뮬레이션하려면 입력의 접두사로 도달 할 수있는 의 상태 하위 집합 를 지정하여 각 마다 하나씩 인덱스를 유지 하십시오. 각 입력 기호 에 대해 표를 사용하여 각 쌍 에 대해 의 전환으로 의 상태에서 도달 할 수있는 의 상태 세트를 찾은 다음 비트 이진 또는 연산을 사용하십시오. 이러한 상태 집합의 숫자 인덱스를 사용하여 상태의 단일 하위 집합으로 결합합니다 . 따라서 시뮬레이션의 각 단계에는 시간 가 걸리고 시뮬레이션 의 총 시간은S i A i S ikSiAiSici,jSjAicSjO(k2)O(sk2) 입니다.

필요한 공간은 모든 테이블의 공간이며, 입니다. 시간 및 공간 분석은 많은 양의 메모리를 처리 할 수 ​​있고 많은 양의 메모리를 처리하기에 충분히 큰 단어에 대해 이진 연산을 수행 할 수있는 모든 RAM에서 유효합니다.O(k22r/k)

이로부터 얻은 시공간 상충 관계는 에 대한 2 차 의존성 때문에 NFA 시뮬레이션과 완벽하게 일치하지 않습니다 . 그러나 가 NFA 시뮬레이션에 적합한 시간 이라는 것에 회의적입니다 . 현재 활성에서 허용되는 모든 (2 차적으로 많은) 전이를 보는 것보다 NFA의 단일 단계를 더 빨리 시뮬레이션하는 방법 다른 상태로? 가 아니어야합니까 ?kO(rs)O(r2s)

어떤 경우 든 다양하게 설정하면 DFA와 NFA 경계 사이의 연속체에서 DFA보다 적은 공간으로 시간 범위를 확보 할 수 있습니다.k


귀하의 수정 사항이 정확하고 귀하의 답변이 내 질문에 대한 답변이라고 생각합니다. 그러나 내가 묻고 싶은 질문은 추가 계산 능력이 얼마나 도움이되는지입니다. (예를 들어, 카운터를 사용하면 O (1) 공간에서 문자열 를 일치시킬 수 있습니다 .) 마음에 들지 않으면 누군가가 그 대답을 알고 있는지 확인하기 위해 조금 더 오랫동안 질문을 열어 두겠습니다. ....ak
Neel Krishnaswami

@Neel : 경우 다윗의 솔루션은 최고 램 기계가 할 수있는, 다음 스택, 카운터 등 도움이되지 않습니다. (물론, 그는 하한이 아닌 상한 만 제공했습니다.)
Radu GRIGore

1
내가 알 수있는 한, 내 솔루션은 "추가 전력"을 사용합니다. DFA 또는 NFA 모델에서는 사용할 수없는 테이블 조회 및 정수 인덱스를 기반으로합니다. 그래서 나는 그것이 질문의 그 부분에 어떻게 대답하지 않는지 이해하지 못합니다.
David Eppstein

다음은이를 매개 변수화하는 대체 방법입니다. 단어 너비가 인 RAM 시스템에 있고 여기서 . 그런 다음 NFA 시뮬레이션은 시간과 공간을 사용합니다. (사용 가능한 공간이 충분하지 않은 경우) 인 경우 DFA 시뮬레이션을 수행 할 수 없습니다. 이 답변의 구성은 하고 시간 이 걸리고 사용 가능한 모든 공간을 사용합니다 (즉, 공간 부근의 무언가 ). 기본적으로 RAM 시스템에서 사용할 수있는 비트 병렬성을 활용하여 NFA 시뮬레이션을 더 빠르게 수행합니다. w lg r O ( s r 2 ) O ( r / w ) r w k r / w O ( s r 2 / w 2 ) 2 wwwlgrO(sr2)O(r/w)rwkr/wO(sr2/w2)2w
DW

4

이것은 답변이 아니지만 의견이 너무 깁니다. 제기 된 질문을 이해하기 어려운 이유를 설명하려고합니다.

디바이스 X의 계산 복잡성을 정의하는 두 가지 방법이 있습니다 .

첫 번째이자 가장 자연스러운 방법은 본질적 입니다. 장치 X 가 입력을 어떻게 사용 하는지 말해야 나중에 입력 의 크기 n 이 장치의 런타임 에 어떻게 영향을 미치는지 살펴볼 수 있습니다 . 또한 연산 (또는 단계 ) 으로 간주되는 것을 말해야합니다 . 그런 다음 간단히 입력 및 카운트 작업에서 장치를 실행시킵니다.

두 번째는 외적 입니다. 우리는 다른 장치 Y에 대한 계산 복잡성을 정의한 다음 X에 대한 시뮬레이터 역할을하도록 Y 를 프로그래밍 합니다. YX 를 시뮬레이션 하는 여러 가지 방법이있을 수 있으므로 가장 좋은 방법을 사용해야한다고 덧붙여 야합니다. 나를 다른 단어와 같은 가정 해 봅시다 : 우리는 말할 X가 소요 크기의 입력에 시간을 N 의 시뮬레이터가있는 경우 X는 컴퓨터에 구현 Y 그 소요 시간.f ( n )O(f(n))f(n)

예를 들어 NFA의 내장 정의에 따르면 길이 n 의 문자열을 처리하는 데 n 단계가 필요합니다 . 장치 Y 로 RAM 시스템을 사용하는 외부 정의에 따르면 가장 알려진 상한은 아마도 David Eppstein이 대답 한 것입니다. (그렇지 않으면 (1) 다른 답변에서 지적한 가장 실제적인 구현이 더 나은 대안을 사용하지 않으며 (2) 여기에 더 나은 대안을 제시 한 사람이 아무도 없다는 것은 이상 할 것입니다.) 또한 장치 X 를 엄격히 말하면 정규식입니다. 하지만 NFA의 크기는 동일하므로 보고 있는 장치 X 로 간주하는 것이 안전합니다 .

이제 두 번째 종류의 정의를 사용할 때 장치 X 의 기능을 제한하는 것이 실행 시간에 어떤 영향을 미치는지 묻는 것은 거의 의미가 없습니다 . 그러나 장치 Y 의 기능을 제한하는 것이 작동 시간에 어떤 영향을 미치는지 묻는 것이 합리적 입니다. 분명히 더 강력한 머신을 허용하면 Y 를 통해 X를 더 빠르게 시뮬레이션 할 수 있습니다 . 따라서 우리가 구현할 수있는 가장 강력한 머신 중 하나를 가정하고 (예를 들어 비 결정적 머신을 배제) 하한 이 나오면 덜 강력한 머신이 될 수 없다는 것을 알고 있습니다 더 잘해Ω(f(n))

어떤 의미에서, 당신이 기대할 수있는 가장 좋은 대답은 NFA를 시뮬레이션하는 데 특정 시간이 필요하다는 셀 프로브 모델과 같은 증거입니다. NFA에서 DFA 로의 전환을 고려하면 큰 DFA를 기록 할 시간이 필요하므로 메모리 만 문제가되지는 않습니다.


4

정규 표현식 일치에 대해 배울 것이 없거나 오래된 것이 없다고 생각하더라도 오랫동안 만나 본 가장 아름다운 논문 중 하나를 확인하십시오 .S Fischer, F Huch 및 T의 정규 표현식대한 재생 윌케, ICFP 2010.

(MMT Chakravarty는이 논문을 추천 한 대가를받을 자격이 있습니다.)

편집 :이 백서가 관련된 이유는 RE에 해당하는 전체 NFA (DFA는 물론)를 구성하지 않는 새로운 기술 (60 년대의 Glushkov 기반)을 설명하기 때문입니다. 대신 수행되는 것은 RE의 구문 트리에서 NFA에 의한 단어의 수락을 결정하기 위해 잘 알려진 것과 유사한 마킹 알고리즘을 실행하는 것과 유사합니다. 성능 측정 결과 Google에서 최근에 게시 한 re2 라이브러리에서도 경쟁력이 있음을 나타냅니다.


읽을만한 좋은 종이 !!
Hsien-Chih Chang 張顯 之

1

Russ Cox 의이 기사 를 살펴보십시오 . 여기서는 입력 문자열 s 를 시간 O (| s |. c ) 및 공백 O (| r |. d ) 에서 정규식 r 과 일치시킬 수있는 Ken Thompson이 처음 사용하는 NFA 기반 접근 방식을 설명합니다 . cd 는 상한 상수입니다. 이 기사는 또한 기술의 C 구현을 자세히 설명합니다.


2
나는 그것이 기사에 대한 정확한 설명이라는 것을 확신하지 못한다. 필요에 따라 NFA에서 DFA를 구축하고 결과를 캐싱하는 것으로 보입니다. 그러나 캐시 크기는 r에서 지수가 될 수 있습니다.
David Eppstein
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.