Найти граф включения из упорядоченного множества

#algorithm #graph

#алгоритм #График

Вопрос:

Допустим, у меня есть набор элементов и отношение порядка (не общее) между ними.

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

Из исходного списка сегментов, как я могу построить график прямого включения (учитывая, что это возможно из моего набора):

введите описание изображения здесь

как я могу перестроить красный график из черных сегментов?

У меня есть O(n^3) решение на C #, которое совершенно уродливо, и мне интересно, есть ли что-нибудь лучше [псевдокод]:

 interface INode
{
    bool Includes(INode other);
    List<INode> Childs { get; set; }
}

class Graph
{
    public INode Root { get; set; }
}

class GraphBuilder
{
    public static Graph Build(IList<INode> nodes)
    {
        Graph result = new Graph();
        foreach (var segment in nodes) {
            segment.Childs = new List<INode>();
            bool isRoot = true;
            foreach (var segment2 in nodes)
            {
                if (segment2.Includes(segment))
                {
                    isRoot = false;
                }
                if (segment.Includes(segment2))
                {
                    bool isDirectChild = true;

                    foreach (var segment3 in nodes)
                    {
                        if (segment.Includes(segment3) amp;amp; segment3.Includes(segment2))
                            isDirectChild = false;
                        break;
                    }
                    if (isDirectChild)
                        segment.Childs.Add(segment2);
                }
            }
            if (isRoot)
            {
                result.Root = segment;
            }
        }

        return resu<
    }
}
  

Комментарии:

1. Что вы подразумеваете под отношением порядка? Не могли бы вы, пожалуйста, предоставить пример ввода и вывода?

2. @ReazMurshed я предоставил полный код на c #

Ответ №1:

Сначала выполните топологическую сортировку базы данных, используя эффективный алгоритм, такой как алгоритм Кана во времени O(V E) .

Для каждого элемента постройте просто стрелку от самого себя к наименьшему (в топологическом порядке) значению, которое меньше, чем в исходной базе данных. Выяснение этого также требует времени O(V E) .

Это ваш красный график во времени O(V E) .

Обратите внимание, что простое чтение базы данных требует времени O(V E) , так что это, с точностью до константы, лучшее, что вы могли бы сделать.

Комментарии:

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

2. Мой красный график представляет собой дерево. Итак, ваше решение идеально! Спасибо