2009-12-16 4 views
2

나는 자바 프로그램의 힙 덤프 (heap dump)로 인해 유향 그래프 (directed graphs)를 많이 사용한다. 그것들을 특징 짓는 한 가지는 반복되는 패턴이 많이 포함되어 있다는 것입니다. 그래프의 필수 구조를 유지하면서 그러한 패턴을 압축하는 방법을 찾고 싶습니다. 예를 들어 다음과 같은 "분자"를 고려해유향 그래프에서 반복 분기를 압축하는 방법은 무엇입니까?

|   | 
    A1  A5 
/\  /\ 
B2 C4  B6 C8 
\/  \/
    D3  D7 

편지 개체의 유형을 나타내는 숫자는 고유 ID (또는 dfnum)를 나타냅니다. 분명히 두 번째 분자는 서로 다른 ID를 가진 첫 번째 분자의 반복이다. 힙 분석 관점에서 실제 ID는 중요하지 않으므로 A5의 분자를 "A1의 다른 사본"이라고 효과적으로 말하는 것으로 대체 할 수 있습니다. 감압시 (예를 들어 힙 분석기에 입력하기 위해) 임의의 고유 ID를 지정할 수 있습니다.

그래프의 dfs 중에 오브젝트 유형의 해시를 유지함으로써 이러한 패턴을 발견 할 수 있습니다. 따라서 A1의 해시에는 (예를 들어) "A^B^C^D"가 포함되며 A5의 해시와 일치합니다.

내가 가진 문제는 외부 분자를 가리키는 분자 때문입니다. 외부에서 나는 dfs에서 더 일찍 방문한 것을 의미합니다. 이 상황에 대한

|   | 
    A1  A5 
/\  /\ 
B2 C4 B6 C7 
\ \ //
    \ \//
    \ | |/
    \ | |/
    \| |/ 
     D3 

내가 A5에서 내가 D3 이미 방문한 된 것을 찾아 내려 온 (추한 아스키 그래픽에 대한 죄송합니다) 예를 들어. 그래서 A5의 해시 코드가 형식이 아닌 D3의 고유 값을 나타 내기를 바랍니다. 나는. "A^B^C^D3"과 같은 것입니다. 그래서 압축/압축 해제에서 우리는 A5를 다른 A가 아닌 A의 복사본으로 차별화합니다. B와 C는 다른 D를 가리 킵니다.

제 질문은 그러한 계산을 수행하는 트릭이 있는지 여부입니다. D가 우리의 분자 인 "외부"에 있다고 말할 수 있습니까? 이것은 또한 효율적인 방법으로, 바람직하게는 하나 또는 두 개의 dfs로 수행되어야합니다. (힙 덤프에는 수천만 개의 개체가 포함되어 있습니다.) A가 후보라는 것을 미리 알 수 없으므로 아마도 dfs 중에 알고리즘을 수행해야합니다. 어쩌면 지배자 나무가 관련이 있을까요?

희망이 맞습니다!

편집 : A1 및 A5 자체가 부모를 가지며 전체 그래프의 DFS 보행 중에 발견 된 임의의 노드라는 사실을 명확히하기 위해 다이어그램을 업데이트했습니다.

명확한 설명 : 본인의 목적 상 100 % 보장된다는 것은 중요하지 않습니다. 위와 같이 해시 코드를 사용하면 해쉬 콜리 전 (hash collision)이 발생할 가능성이 매우 적어서 알고리즘이 잘못 분자를 잘못 분류하게됩니다. 이러한 콜리 존은 드물기 때문에 전반적인 그림에 많은 영향을 미치지 않습니다.

답변

0

너의 문제를 너무 깊이 생각하지 않고 나는 trie을 사용하여 내 연구를 위해 웹 데이터를 압축하는 문제를 해결했다. 압축을 위해 데이터를 트라이에 직렬화 할 수 있어야합니다.

+0

무슨 뜻인지 이해가 안됩니다. 우리는 후보 분자가 어디서 시작되는지 미리 알지 못한다는 것을 기억하십시오. 위의 다이어그램에서 A1과 A5 자체는 부모를 가지며 DFS 중에 우리가 마주 치는 노드 일뿐입니다. 퍼즐은 A5가 A1의 복사본임을 인식하는 것입니다. –

0

내가 알 수있는 바로는이 메시지는 graph isomorphism problem과 관련이 있습니다. 위키피디아 페이지에는이 문제에 대한 현재 접근법에 대한 몇 가지 지침이 있습니다. 그러나, 간단한 스키밍에서, 이들 대부분은 두 개의 전체 그래프를 고려하고 큰 그래프 내에서 동형 서브 그래프를 찾지 않도록 설계되었습니다.

검색 알고리즘과 관련하여 필자는 깊이 우선 검색이이 문제에 대한 올바른 접근 방법이 아니라는 것을 알고 있습니다. 너비 우선 탐색이 할 수있는 일에 대해 조금 생각할 수도 있습니다.적어도 여러분이 묘사 한 구체적인 예에서, 여러분은 A1과 A5를 먼저 보았을 것입니다. 어느 쪽이든 특정한 "분자"모양을 만들기 전에 말입니다.

+0

재미있는 포인터입니다. 해시 충돌과 관련하여 위의 질문을 명확히했습니다. 내가 문제를 정확하게 풀려고한다면 NP 문제가있을 수 있다는 것을 이해할 수 있지만 100 % 신뢰할만한 것이 만족 스러울 것입니다. –

+0

순수한 복잡성 이론의 관점에서 볼 때, 그래프 동형이 NP 완전하지 않다는 것이 나에게 흥미 롭다. 그러나 그와 상관없이, 나는 당신이 일종의 휴리스틱 접근법을 찾고 싶다는 데 동의한다. 작은 그래프에서는 각 노드를 방문하여 자신이 속한 "작은"도형의 후보 집합을 만든 다음 가장 압축률이 높은 도형을 선택할 수 있습니다. 하지만이 아이디어는 수천 또는 수백만 개의 개체가있는 사실적인 그래프로 스케일링하는 데 어려움이있을 수 있습니다. –

0

이것은 실제로 도움이되는 너무 추상적 인 답변이지만 반복 패턴 당 하위 그래프를 만든 다음 각 하위 패턴을 각 하위 그래프 구조에 대한 포인터와 함께 단일 노드로 축소 할 수 있습니다. 노드는 패턴에 연결된 모든 에지를 관리합니다. 이러한 에지는 연결되는 패턴의 노드를 기억해야하므로 표현의 세부 사항은 숨기지 만 그래프는 마치 "의도 한대로"트래버스하는 그래프 통과를 제공 할 수 있습니다. 내부 표현을 추상화하지 못하고 알고리즘이 중첩 그래프를 이해해야하는 경우이 작업은 복잡합니다. 그래프 동형 힘든 문제는 일반적으로 동안 보조 노트로

, 귀하의 경우 당신은 표시 그래프를 가지고에 해당하는 그래프에 너무 많은 메타 데이터 (예를 들어, 개체 유형, 필드 이름 등)가 매우 희귀하고 선택적인 레이블이 있습니다. 그러한 레이블 크게 동형 패턴을 찾는 데 필요한 노력을 치우십시오 (물론 작은 크기까지, 그렇지 않으면 패턴 캐시가 모든 메모리를 채 웁니다).

계급 정의를 철저하게 따르는 개체가 많을 것이므로 (상속이 없으면 개체가 구조체이고 해당 런타임 유형이 정의와 정확하게 일치합니다), 나는 당신이하려고하는 것이 do는 객체 그래프를 크게 압축 할 가능성이 있습니다.

관련 문제