2013-07-01 2 views
2

특정 조건을 만족하는 노드를 찾는 것이 빠른 (로그)이되도록 유한 결정 성 오토 마톤의 노드를 저장하는 데이터 구조가 필요합니다. 문제의 조건은 다음과 같다 :DFA의 노드를 저장할 데이터 구조

나는 노드 p를 가지고 있고, 나는 노드 q 같은 것을 찾을 수있다 : (p ∈ F ≡ q ∈ F) & (∀ a : a ∈ Σ : δ(p,a) = δ(q,a))합니다. 즉, pq은 모두 final이거나 둘 다 아니며 동일한 노드로 전환됩니다.

나는 느릴 수 있기 때문에 모든 노드를 통과하고 싶지 않습니다. 분명히, q에 전환이있는 알파벳 문자 집합이 p에 전환이있는 집합과 다른 경우 q은 내가 찾고있는 노드가 아닙니다.

pq의 전환 수가 다른 경우 q은 내가 원하는 노드가 아닙니다. 그래서 노드의 최종성과 전환 수에 따라 노드를 정렬하는 데이터 구조를 생각했습니다. 그래서 모든 노드를 살펴볼 필요가 없습니다. 최종 노드가 동일하고 전환 수가 동일해야합니다. 그러나 그것은 여전히 ​​대수적이지 않습니다. 어떤 아이디어.

저는 C++을 사용하고 있습니다.

+0

당신은 dfa를 비교하기를 원 하나, 동일한 언어를 생산하든 그렇지 않든 **?** –

+0

아니요, 점진적으로 최소 비순환 DFA를 구성하고 있습니다. –

+0

ok 단일 단일 DFA로 작업하고 있습니다. –

답변

0

나는 각 노드에 대해 문자열을 구성했으며이 문자열을 AVL 트리에 넣었습니다. 해시 함수와 정렬되지 않은 맵을 사용하는 솔루션보다 더 빨리 실행되고 훨씬 적은 메모리가 사용되었습니다.

다음 노드를 나타내는 문자열 보인다 :이 노드가 최종인지에 따라, 0 또는 1로 시작 여부 다음 쌍 (a,n) 다음과 같이 코딩된다 : a이 위치에 대응하는 int 인 알파벳 a은 알파벳이고 n은 또 다른 int이며, 심볼이 a 인 것으로 전환 된 노드의 색인입니다.

+0

이미 원했던 것처럼 보입니다. 그러나 더 많은 속도 향상이 필요한 경우 BDD (이진 의사 결정 다이어그램)를 찾는 것이 좋습니다. BDD는 논리적 수식을 저장하는 매우 빠른 방법이지만 유한 상태 시스템을 저장하는 데에도 사용할 수 있습니다. 웹에서 몇 가지 정보를 찾을 수 있습니다 – Zane

0

는 노드 q에서 정보의 두 종류가있다 :

  • 부울 정보 (q ∈ F)
  • 쌍 목록 (a,n)되도록 캐릭터 δ (Q, a) == N (즉, 목록/목적지 노드 쌍은 q에서 도달 가능)

이 두 가지 정보 (부울 및 쌍 목록)는 단일 시퀀스로 표시 할 수 있으며이 경우 해시 키를 계산할 수 있습니다 기다림.

이렇게하면 관심있는 속성으로 노드를 해시 할 수 있습니다. 주어진 노드 에 대해 후보 노드 q을 검색하면 O (1)에 가까워집니다.

(코멘트에서 언급 한 최소화 알고리즘의 경우 반복 중에 수행 된 작업의 결과로 쌍의 대상 노드 포인터가 변경되므로이 반복을 다시 작성해야합니다.)

+0

나는 그것을했다. 나는 정보를 나타내는 문자열을 만들었고 djb2 해쉬 함수를 사용했지만, 큰 사전 (오토 마톤이 받아 들여야 할 4 000 000 단어가 포함되어 있음)에는 메모리가 부족했습니다. –

+0

'(a, n)'쌍을 문자열로 변환했을 때 대상 노드를 어떻게 나타 냈습니까? 그것들을'int' 또는'node *'로 나타내야하고 해쉬 함수가 그것들을 문자열로 직렬화하기보다는 그것으로 처리하도록해야합니다. 전체 문자열의 복사본이나 전체 노드의 복사본 대신 해시에'node *'만 넣을 수도 있습니다. 또한, 메모리에 보유하고있는 해시 테이블의 수를 확인해야합니다 (최소화를 몇 번 반복 할 경우 각 반복마다 새 테이블을 만들고 이전 복사본을 유지할 수 있습니다 ..) – jogojapan

+0

정보를 나타내는 문자열 노드가 최종 노드인지 아닌지에 따라 '0'또는 '1'로 시작하고 '(a, n)'쌍은 다음과 같이 코딩됩니다. 'a'는 다음에 해당하는 'int'입니다. 알파벳 'a'의 알파벳과 'n'의 위치는 또 다른 'int'이며, 노드의 색인은 기호 'a'로 전환됩니다. 그런 다음'unordered_map '을 사용합니다. 여기서'unsigned long'은 해시 함수'djb2'에서 반환 된 값이고'node * '는 문자열이 만들어진 노드입니다. –