2

노드가 0에서부터 많은 자식을 가질 수있는 트리 구조가있는 경우 각 노드가 부울 스위치와 함께 일부 데이터 값을 보유하고 있는데 어떻게 특정 스위치 값을 가진 노드에 대해이 트리의 상태를 최소한으로 나타낼 수 있습니까?어떻게 체크 트리의 체크 상태를 최소한으로 표현합니까?

다음
A[0] -> B[1] -> C[1] 
     |-----> D[1] 
     |-----> E[1] 

우리가 4 개 노드가 확인 된 상태를, 간결한 방식으로이 상태를 표현하는 방법이있다 : 예를 들어

, 내 나무 같이 보입니다이라고? 순진한 접근법은 네 개의 노드를 검사하는 것으로 나열하는 것이지만 노드 B가 네 개가 아닌 100 개의 자식을 갖는다면 어떨까요?

현재 나의 생각은 각 노드의 조상을 데이터 구성 요소에 저장하고 상태를 나타내는 데 필요한 데이터를 최소화하는 조상 집합으로 확인 된 상태를 설명하는 것입니다. 아래 나무에서 노드 N의 조상은 n '으로 표현됩니다. 당신이 나무를 분석하고 노드 A의 모든 아이가 선택되어 있는지 확인하고 데이터 요소 노드가 '로 설정되어 간단하게 상태를 설명 할 수 이제

A[0, {a}] -> B[1, {a', b}] -> C[1, {a' b' c}] 
      |--------------> D[1, {a' b' d}] 
      |--------------> E[1, {a' b' e}] 

: 같은 위의 나무는 지금 뭔가를 보일 것이다 1, 또는 [a ']. 노드 D의 상태가 0으로 전환 된 경우 트리 상태를 [a 'not d]로 설명 할 수 있습니다.

이 유형의 문제를 해결하는 데 사용할 수있는 데이터 구조 또는 알고리즘이 있습니까? 더 나은 접근 방법에 대한 생각? 분석 알고리즘에 대한 생각은 없습니까?

감사합니다.

+0

이 체크 트리가 정확히 무엇입니까? 어떤 종류의 작업이 지원됩니까? 속도 또는 메모리 사용 공간을 최적화합니까? 속도가 가장 많이 사용되는 작업입니까? –

+0

체크 트리는 새 소프트웨어를 설치할 때 나타나는 기능 트리와 마찬가지로 사용자가 선택한 노드 목록입니다. 나중에 재구성해야하는 상태를 나타 내기 위해 사용되며, 이는 생성 시간 후에 삽입 및 삭제가 필요하지 않음을 의미합니다. 메모리는 자유롭고 속도는 상대적으로 무료입니다 (그러나 O (n^2)를 피하기를 원합니다). 최적화해야하는 것은 체크 트리의 상태를 재구성하는 데 필요한 데이터의 양입니다.따라서 노드 B에 100 개의 하위 항목이 있고 99 개의 항목이 선택되면 99 개의 데이터 요소를 사용하여이 상태를 설명하지 않아야합니다. – Victor

+0

트리 구조가 있으므로 이미 부울을 재구성하고 싶습니까? –

답변

2

루트에서 시작하는 선주문 트리 순회를 사용하십시오. 노드가 선택되면 자식을 트래버스하지 않습니다. 탐색 된 각 노드 저장에 대해 부울 비트 맵 (8 비트/바이트)에서 검사 된 상태 (부울 0/1)입니다. 마지막으로 zip/bzip 또는 다른 압축 기술을 사용하여 결과를 압축합니다.

상태를 재구성하면 먼저 압축을 풀고 선주문 트리 탐색을 사용하고 상태를 기반으로 각 노드를 설정하고 상태가 선택되어 있으면 모든 자식을 검사하도록 설정하고 건너 뜁니다.

0

일반적으로 검사 된 요소를 n 비트보다 적은 공간 (항상 n은 트리의 요소 수)에 저장할 수있는 기술이 없습니다. 이것의 배후에있는 이유는 2^n 개의 다른 가능한 체크 상태가 있기 때문에 적어도 2^n 개의 다른 인코딩이 필요하므로 2^n - 1 인코딩이 있기 때문에 길이가 2^n 인 코딩이 적어도 하나는 있어야합니다. 이보다 더 짧습니다.

이 점을 감안할 때 실제로 공간 사용을 최소화하려면 @yi_H가 제안하는 것과 같은 인코딩을 사용하는 것이 좋습니다. 각 인코딩에 대해 정확히 n 비트를 사용합니다. 비트에 표준 압축 알고리즘을 적용하여 대부분의 인코딩을 압축 할 수 있습니다.이 알고리즘은 검사 노드의 실제 집합에 대해서는 상당히 좋지만 최악의 경우에는 정상적으로 저하됩니다.

희망이 도움이됩니다.

관련 문제