Допустим, у меня есть набор элементов и отношение порядка (не общее) между ними.
Для простоты, скажем, его одномерные сегменты с включением.
Из необработанного списка сегментов, как я могу построить график прямого включения (если это возможно из моего набора):
![enter image description here](https://i.stack.imgur.com/y8Ni7.png)
из черных сегментов, как я могу восстановить красный график?
У меня есть решение 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) && segment3.Includes(segment2))
isDirectChild = false;
break;
}
if (isDirectChild)
segment.Childs.Add(segment2);
}
}
if (isRoot)
{
result.Root = segment;
}
}
return result;
}
}