Я много работаю с ориентированными графами, полученными из дампов кучи Java-программ. Их характеризует то, что они содержат много повторяющихся паттернов. Я хотел бы найти способ сжатия таких шаблонов, сохраняя при этом основную структуру графика. Например, рассмотрим следующие «молекулы»:
| |
A1 A5
/ \ / \
B2 C4 B6 C8
\ / \ /
D3 D7
буква представляет тип объекта, а число представляет его уникальный идентификатор (или dfnum). Очевидно, что вторая молекула является повторением первой только с разными идентификаторами. С точки зрения анализа кучи фактические идентификаторы не важны, так что вы можете заменить молекулу на A5 чем-то, что фактически говорит «другая копия A1». При декомпрессии (например, для ввода в анализаторы кучи) вы можете просто назначить произвольные уникальные идентификаторы.
Я мог бы обнаружить такие паттерны, поддерживая хэш типа объектов во время dfs графа. Таким образом, хэш для A1 будет содержать (например) «A ^ B ^ C ^ D», и это будет соответствовать хэшу для A5.
У меня проблема с молекулами, которые указывают на какую-то внешнюю молекулу. Под внешним я имею в виду то, что было посещено ранее в DFS. Например (извините за уродливую графику ascii):
| |
A1 A5
/ \ / \
B2 C4 B6 C7
\ \ / /
\ \ / /
\ | | /
\ | | /
\| |/
D3
для этой ситуации, когда я прихожу, чтобы спуститься с A5, я обнаружил, что D3 уже был посещен. Поэтому я хотел бы, чтобы хэш-код для A5 представлял уникальное значение для D3, а не только тип. То есть что-то вроде "A ^ B ^ C ^ D3". Таким образом, при сжатии / декомпрессии мы дифференцируем A5 как копию A1, а не как некоторую другую A, чьи B и C указывают на некоторые другие D.
Мой вопрос заключается в том, существуют ли какие-либо хитрости для такого расчета, то есть как определить, что D находится "вне" нашей молекулы, корнем которой является A? Это также должно быть сделано эффективным способом, предпочтительно с одним или двумя dfs. (Heapdumps содержат десятки миллионов объектов). Вы не знаете заранее, что A является кандидатом, поэтому, вероятно, это должен быть алгоритм, который делает это во время dfs. Может быть, с чем-то связано дерево доминатор?
Надеюсь, что это имеет смысл!
Редактировать: обновлены диаграммы, чтобы прояснить тот факт, что сами A1 и A5 имеют родителей и являются просто произвольными узлами, обнаруженными во время обхода DFS всего графа.
Уточнение: для моих целей не важно, чтобы матч был гарантирован на 100%. Используя хеш-коды, как указано выше, я рад, что очень маловероятно, что произойдет коллизия хеш-кода, и алгоритм ошибочно классифицирует молекулу неправильно. Поскольку такие столкновения будут редкими, они вряд ли сильно повлияют на общую картину.