트리 세트의 데이터 구조


10

평가판을 사용하면 요소 목록을 효율적으로 저장할 수 있습니다. 접두사는 공유되므로 공간 효율적입니다.

나무를 효율적으로 저장하는 비슷한 방법을 찾고 있습니다. 주어진 트리가 저장된 트리의 하위 트리인지 또는 주어진 트리의 하위 트리 인 저장된 트리가 존재하는지 알고, 멤버쉽을 확인하고 요소를 추가 할 수 있기를 원합니다.

일반적으로 높이가 50 미만인 불균형 이진 트리 약 500 개를 저장합니다.

편집하다

내 응용 프로그램은 일종의 메모를 사용하는 일종의 모델 검사기입니다. 나는 상태가 상상 다음과 같은 공식 : F = φg = ( φ ψ )φ는 복잡한 subformula되고, 그리고 내가 먼저 알고 싶은 상상 f는 보유 . 나는 ϕ이 붙었 는지 확인 하고 오랜 과정을 거친 후에 그것이 사실임을 알게됩니다. 이제 gs 에 있는지 알고 싶습니다 . 나는 f가 가지고 있다는 사실을 기억하고 g fsf=ϕg=(ϕψ)ϕfsϕgsfgf그래서 나는 도출 할 수있는 에서 거의 즉시. 반대로, 만약 gt붙지 않는다는 것을 증명했다면 , ft를 거의 즉시 붙잡고 있지 않다고 말하고 싶습니다 .gs
gtft

우리는 공식에 부분 순서를 만들 수 있으며 iff g f 입니다. 각 상태가 이야 , 우리는 공식의 두 세트를 저장; L ( s ) 은 보유하는 최대 공식을 저장하고 l ( s ) 는 보유하지 않은 최소 공식을 저장합니다. 현재의 상태가 주어지는 S 및 화학식 g는 , I가 보이면 F L ( S ) , F g 경우 또는 F L ( S )gfgfsL(s)l(s)sgfL(s),fg 이 경우에 나는 g s에 들어 있는지 직접 알 수 있습니다.fl(s),gfgs

현재 l 은 목록으로 구현되며 저장된 모든 수식을 개별적으로 반복해야하기 때문에 분명히 최적이 아닙니다. 내 수식이 시퀀스이고 부분 순서가 "접두사"인 경우 trie가 훨씬 빠릅니다. 불행히도 내 수식에는 ¬ , , 모달 연산자 및 원자 명제를 기반으로 한 구조와 같은 트리가 있습니다 .Ll¬,

@Raphael과 @Jack이 지적했듯이 트리를 순차적으로 만들 수는 있지만 관심있는 부분 순서가 "접두사입니다"에 해당하지 않기 때문에 문제가 해결되지 않을까 걱정됩니다.


간단한 아이디어 : 순서대로 트리를 순회하고 (순서 순회를 수행하고 그에 따라 방문한 노드를 나열하며 업스 프레스 다운 이동을위한 특수 요소를 추가) 트리에 저장하려고 시도 했습니까? 물론 이것은 의미만으로 왼쪽 하위 트리에 대한 검사 만 허용합니다.
Raphael

2
다음 속성을 가진 트리 의 직렬화 를 간단히 사용한 경우 : TS ( T )S ( T ' ) 의 하위 문자열 인 경우에만 T ' 의 하위 트리입니다 . 그런 S를 만드는 것은 간단합니다 [처음에 나무의 정식 형태를 찾으면]. 그 후, 귀하의 질문은 하위 문자열 일치와 동일하며 이는 문자열 학에서 널리 연구되는 문제입니다. STTS(T)S(T)S
Jukka Suomela

1
용어 인덱싱을 살펴보십시오 .
starblue

1
또 다른 빠른 아이디어는 모든 트리 t1, t2, ..를 하나의 큰 트리 T에 저장하는 것입니다. 각 엣지마다 트리 세트의 일부를 기억합니다. 그런 다음 f가 저장된 트리 중 하나의 하위 트리인지 확인하려면 f가 T의 하위 트리인지 확인한 다음 예인 경우 해당 하위 트리의 모든 에지 레이블 세트와 교차합니다. 교차점이 비어 있지 않은 경우 대답은 '그렇다'입니다. (두 단계를 결합 할 수도 있습니다).
Martin B.

답변:


5

g-tries 를 확인하고 싶을 수도 있습니다 . 이것은 본질적으로 찾고있는 데이터 구조이지만 트리 대신 일반 그래프와 함께 사용하도록 설계되었습니다. 따라서, 나는 g-tries가 좋은 이론적 보증을 가지고 있는지 확신하지 못합니다-그래프 정규화 알고리즘을 서브 루틴으로 사용한다고 생각하지만 실제로는 잘 작동하는 것 같습니다.

(연결된 논문이 "생물학적 네트워크의 네트워크 모티프"에 관한 것이 아니라고 걱정하지 마십시오. g-trie는 그래프에 대한 완벽한 추상 데이터 구조입니다.)


4

특수한 형태의 지속성지속성입니다 . Driscoll, Sarnak, Sleator 및 Tarjan에 의한 데이터 구조 영구 작성 및 관련 트리의 패밀리를 저장하는 Sarnak & Tarjan의 영구 검색 트리를 사용한 평면 점 위치 작성 논문을 참조하십시오.


1
참조 해 주셔서 감사합니다. 현재 데이터 구조 영구 작성에 액세스 할 수 없지만 지속성 개념에 어느 정도 익숙합니다. 그러나 지속성을 사용하여 문제를 해결하는 방법을 알 수 없습니다. 실제로 나무를 부울로 매핑하는 사전을 사용하고 싶으며 동일한 트리가 다른 사전의 다른 값에 대한 열쇠가 될 수 있습니다.
Abdallah

1
응용 프로그램이 무엇인지 잘 모르기 때문에 접두사를 공유하여 문자열을 저장하는 시도를 비유했습니다. "동일한 트리가 다른 사전에서 다른 값의 열쇠가 될 수 있습니다"라는 의견도 시도와 맞지 않는 것 같습니다. 아마도 당신은 당신이 찾을 수있는 나무 (및 모든 하위 트리)에 대한 서명 모음을 원할 것입니까? (예를 들어, 이진 트리에 카탈로니아 어 번호를 사용하거나 레이블이있는 트리에 Prufer 코드를 사용합니다.)
Jack

1

이것은 마치 숲과 비슷하게 들립니다 ( 분리 된 숲 ).

순위 별 통합 (union) 이라는 기술 과 경로 압축을 사용한 검색 작업을 통해 삽입 비용을 절감 합니다. 나는 Sylvain Conchon과 Jean-Christophe Filliâtre가 개발 한이 구조 의 지속적인 버전이 있다는 것을 알고 있지만 이것이 Jack이 언급 한 것과 같은지 전혀 모른다.



0

"순수한 기능적 데이터 구조"(1998)에서 Chris Okasaki는 유형 집계 (10.3.2)를 사용하여 이진 트리 시도를 제안합니다.

이것이 즉시 도움이 될지 모르겠습니다. 주어진 솔루션은 직접 구현할 수 없습니다.


0

프로그래머 링고에서 : 공통 하위 표현식 / 트리 / DAG에서 트리를 작성하면 멋진 컴팩트 모델이됩니다. 방향성 비순환 그래프. 그러면 나무가 충분할 것입니다.

공개 클래스 트리 {문자열 연산; Tree [] 하위 트리;

public int compareTo(Tree rhs) {
    if (rhs == null) return false;
    int cmp = operation.compareTo(rhs.operation);
    if (cmp == 0) {
        cmp = Arrays.compareTo(subtrees, rhs.subtrees);
    }
    return cmp;
}

...}

map commonSubExpressions = 새 HashMap ();

Tree get (String expressionSyntax) {트리 t = 새 트리 (); t. 조작 = ...; t.subtrees = ... 하위 표현식을 얻기위한 재귀 호출; 트리 t2 = commonSubExpressions.get (t); if (t2 == null) {t2 = t; commonSubExpressions.put (t2, t2); } 반환 t2; }}

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