Как построить в Java взвешенный ациклический граф - PullRequest
1 голос
/ 15 декабря 2011

Я провел поиск по похожим темам, но ответы слишком расплывчаты для моего уровня понимания и понимания, и я не думаю, что они достаточно конкретны для моего вопроса.

Похожие темы: Реализация дерева (направленного ациклического графа) * ​​1004 * Представление DAG (направленный ациклический граф)

Вопрос:

Я отформатировал текстовый файл, который содержит данные следующего формата ...Пример набора данных:GO: 0000109 # is_a: GO: 0000110 # is_a: GO: 0000111 # is_a: GO: 0000112 # is_a: Go: 0000113 # is_a: GO: 0070312 # is_a: GO: 0070522 # is_a: GO: 0070912 # is_a: GO:0070913 # is_a: GO: 0071942 # part_of: GO: 0008622GO: 0000112 # part_of: GO: 0000442GO: 0000118 # is_a: GO: 0016581 # is_a: GO: 0034967 # is_a: GO: 0070210 # is_a: GO: 0070211 # is_a: GO: 0070822 # is_a: GO: 0070823 # is_a: GO: 0070824GO: 0000120 # is_a: GO: 0000500 # is_a: GO: 0005668 # is_a: GO: 0070860GO: 0000123 # is_a: GO: 0005671 # is_a: GO: 0043189 # is_a: GO: 0070461 # is_a: GO: 0070775 # is_a: GO: 0072487GO: 0000126 # is_a: GO: 0034732 # is_a: GO: 0034733GO: 0000127 # part_of: GO: 0034734 # part_of: GO: 0034735GO: 0000133 # is_a: GO: 0031560 # is_a: GO: 0031561 # is_a: GO: 0031562 # is_a: GO: 0031563 # part_of: GO: 0031500GO: 0000137 # part_of: GO: 0000136

Я собираюсь построить взвешенный направленный DAG из этих данных (приведенный выше фрагмент кода).Весь набор данных 106 КБ находится здесь: Источник

--------------------------------------------------

Принимая во внимание построчно, данные каждой строки объясняются следующим образом ...Первая строка в качестве примера:GO: 0000109 # is_a: GO: 0000110 # is_a: GO: 0000111 # is_a: GO: 0000112 # is_a: GO: 0000113 # is_a: GO: 0070312 # is_a: GO: 0070522 # is_a: GO: 0070912 # is_a: GO:0070913 # is_a: GO: 0071942 # part_of: GO: 0008622

'#' - разделитель / токенизатор для данных линии.Первый член GO: 0000109 - это имя узла.Последующие термины is_a: GO: xxxxxxx ИЛИ part_of: GO: xxxxxxx - это узлы, которые подключены к GO: 0000109.Некоторые из последующих терминов также имеют связи, как показано в наборе данных.Когда это is_a, вес ребра составляет 0,8.Когда это part_of, вес края равен 0,6.

--------------------------------------------------

У меня есть Google-d о том, как DAGs, и я понимаю концепцию.Тем не менее, я до сих пор не знаю, как поместить это в код.Я использую Java.Насколько я понимаю, граф обычно состоит из узлов и дуг.Требует ли этот график списка смежности, чтобы определить направление соединения?Если это так, я не уверен, как объединить граф и список смежности, чтобы общаться друг с другом.После построения графика моей вторичной целью является выяснение степени каждого узла от корневого узла.В наборе данных есть корневой узел.

Для иллюстрации я нарисовал пример соединения первой строки данных ниже: Ссылка на изображение

Надеюсь, вы, ребята, понимаете, чего я здесь добиваюсь.Спасибо за просмотр моей проблемы.:)

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Поскольку об этом легче думать, я бы предпочел представлять его в виде дерева. (Также облегчает обход карты и сохранение промежуточных градусов.)

Вы можете иметь класс Node, который будет иметь коллекцию дочерних Node объектов. При необходимости вы могли бы также представить дочерние отношения как объект Relationship, который имел бы как вес, так и указатель Node, и вы могли бы хранить коллекцию объектов Relationship.

Затем вы можете пройтись по дереву, начиная с корня, и пометить каждый посещенный узел его степенью.

class Node{
    String name;
    List<Relationship> children;
}

class Relationship{
    Node child;
    double weight;
}

class Tree{
    Node root;
}

Здесь Tree, вероятно, должен иметь такой метод:

public Node findNodeByName(String name);

И Node, вероятно, должен иметь такой метод:

public void addChild(Node n, double weight);

Затем, когда вы анализируете каждую строку, вы вызываете Tree.findNodeByName (), чтобы найти соответствующий узел (и создаете его, если его нет ... но этого не должно случиться, если ваши данные хороши), и добавляете последующие элементы на линии к этому узлу.

Как вы указали, группы обеспечения доступности баз данных невозможно преобразовать в деревья, особенно потому, что у некоторых узлов есть несколько родителей. То, что вы можете сделать, это вставить тот же узел, что и дочерний элемент нескольких родителей, возможно, используя хеш-таблицу, чтобы решить, был ли пройден определенный узел или нет.

0 голосов
/ 20 декабря 2011

Читая комментарии, вы, кажется, смущены тем, как Узел может содержать Отношения, которые в свою очередь содержат Узел. Это довольно распространенная стратегия, ее обычно называют составной паттерн.

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

Разрешение Узлу отслеживать его дочерние элементы, и никакие другие части дерева также не эмулируют математический ориентированный граф - каждая вершина «знает» только о своих ребрах и больше ничего.

Пример реализации рекурсивного дерева

Например, для поиска элемента в бинарном дереве поиска вы должны вызвать метод поиска корня. Затем корень проверяет, равен ли искомый элемент меньше или больше самого себя. Если он равен, поиск завершается с соответствующим возвращаемым значением. Если оно меньше или больше, корень вместо этого вызовет поиск для левого или правого потомка, соответственно, и они будут делать то же самое.

Аналогично, чтобы добавить новый узел в дерево, вы бы вызвали метод add корня с новым узлом в качестве параметра. Корень решает, должен ли он принять новый узел или передать его одному из своих потомков. В последнем случае он выберет дочерний элемент и вызовет его метод add с новым Node в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...