инкрементный алгоритм k-core - PullRequest
10 голосов
/ 04 июня 2009

Вычисление k-core графа путем итеративного сокращения вершин достаточно просто. Однако для моего приложения я хотел бы иметь возможность добавлять вершины в начальный граф и получать обновленное ядро, не пересчитывая все k-ядро с нуля. Есть ли надежный алгоритм, который может использовать в своих интересах работу, проделанную на предыдущих итерациях?

Для любопытных k-ядро используется в качестве этапа предварительной обработки в алгоритме поиска клики. Любые клики размером 5 гарантированно являются частью 4-го ядра графа. В моем наборе данных, 4-ядерное ядро ​​намного меньше, чем весь граф, поэтому его можно было бы перебором. Постепенное добавление вершин позволяет алгоритму работать с минимально возможным набором данных. Мой набор вершин бесконечен и упорядочен (простые числа), но я забочусь только о клике с наименьшим номером.

Edit:

Если подумать еще об этом, основываясь на ответе акаппы, обнаружение создания цикла действительно важно. На приведенном ниже графике 2-ядро пусто до добавления F. Добавление F не меняет степень A, но все равно добавляет A к 2-ядру. Это легко расширить, чтобы увидеть, как закрытие цикла любого размера приведет к тому, что все вершины одновременно присоединятся к 2-ядерному.

Добавление вершины может повлиять на остроту вершин на произвольном расстоянии, но, возможно, это слишком сфокусировано на поведении в худшем случае.

A -- B; A -- C; A -- D -- E; B -- F; C -- F;

Ответы [ 3 ]

3 голосов
/ 27 июня 2013

Это сложная проблема, но определенно не NP-Hard. Насколько я знаю, в академических кругах нет общих решений о постепенном обновлении K-ядер с любым числом K. Но следующие две статьи определенно заслуживают прочтения:

[1] Извлечение, анализ и визуализация треугольных мотивов K-Core в сетях. http://www.cse.ohio -state.edu / ~ zhangya / ICDE12_conf_full_179.pdf

[2] Потоковые алгоритмы для разложения по k-ядру. http://www.cse.ohio -state.edu / ~ sariyuce / файл / Publications_files / VLDB13.pdf

Они появляются на главных конференциях в области управления данными, поэтому методология должна быть надежной.

3 голосов
/ 04 июня 2009

Мне кажется, что для алгоритма инкрементного вычисления k-ядра, основанного на локальном исследовании графа, вместо "глобального" итеративного сокращения, потребуется детектирование инкрементного цикла, чтобы увидеть, какие ребра могут внести вклад вершина в k-ядре, что является сложной проблемой.

Я думаю, что лучшее, что вы можете сделать, это пересчитывать алгоритм k-core на каждом проходе, просто удаляя из графа вершины, которые уже находятся в k-core, и инициализируя в вершине карты -> "k- Ядро смежных вершин "количество смежных вершин, которые уже находятся в k-ядре.

2 голосов
/ 07 июня 2009

Быстрая идея: Вы можете сохранить историю в списке L, то есть сохранить порядок, в котором были удалены узлы. Всякий раз, когда вы добавляете новый узел v, начинайте с первого узла w в L, который смежен с v. Затем просто проходите оставшиеся узлы в L с w в линейном порядке. (И также проверьте узел v и, возможно, добавьте его в L).

...