У меня рефлексивное асимметричное транзитивное отношение, представленное в виде n
x n
разреженной scipy
csr
матрицы.
Теперь в результате некоторых преобразований у меня осталось много «ненужных»пары:
set([('a','b'),('b','c'),('a','c')])
Мне нужно удалить пары ('a','c')
, которые можно рассматривать как «прямые» ребра, когда есть «косвенные».
Сначала я подумал, что это особый охватывающее древовидность , но фактически в следующем случае:
set([('a','b'),('b','d'),('a','c'),('c','d')])
... ни одна пара не должна быть удалена. Результатом не обязательно является дерево.
Есть ли название для такого рода проблемы?
Есть ли реализация в scipy
?
Если нет, можете ли вы предложить эффективный алгоритм в python
/ numpy
/ scipy
?
РЕДАКТИРОВАТЬ: Похоже, это называется переходное сокращение ? Но реализации scipy.sparse.csgraph
нет?
РЕДАКТИРОВАТЬ: Я думаю, чтобы получить ациклический ориентированный граф, мне пришлось бы (временно) удалить «рефлексивность», но этоне проблема.