При обходе графа мне нужно проверить, разрешает ли дуга доступ к дополнительным узлам, которые не могут быть достигнуты через уже пройденные дуги. Поэтому на самом деле я хочу проверить, является ли набор преемников рассматриваемой дуги подмножеством объединенных преемников уже посещенных дуг.
Вот некоторый (неоптимальный) код для иллюстрации желаемой операции:
public static bool ReachesAdditionalSuccs(
ISet<int> additionalSuccCandidates,
ISet<int>[] succsAlreadyReachable)
{
ISet<int> curCombinedSuccsReachable = new HashSet<int>();
foreach (ISet<int> set in succsAlreadyReachable)
curCombinedSuccsReachable.UnionWith(set);
return (!additionalSuccCandidates.IsSubsetOf(curCombinedSuccsReachable));
}
Поскольку мне нужно выполнить эту операцию в процессе расширения и поиска динамического по времени игрового дерева, я не могу предварительно собрать объединенные наборы преемников из-за ограничений памяти. Ни одна из них не помечает узлы как посещенные. Я могу только создать прямой набор преемников, чтобы ускорить что-то.
Теперь мне интересно, какой самый быстрый способ сделать это. В приведенном выше коде я временно строю комбинированный набор в новом Hashset-объекте. Это очень много времени и, конечно, не самый умный способ. Различный подход, который мне пришел в голову, заключается в циклическом прохождении всех узлов и ручном тестировании на всех наборах деталей с использованием Hashsets. Но это также может быть не лучшим способом ...
Последнее, что я придумал, это использование SortedSets, так как они должны легко комбинироваться (в O (n), как в сортировке слиянием), а операция isSubset также имеет O (n) -сложность. Есть ли умный способ достичь этого без самостоятельного кодирования, так что, может быть, даже встроенный в Framwork? Или есть еще более быстрые подходы?