У меня есть массив множеств перестановок, и я хочу удалить изоморфные перестановки.
У нас есть
Sмножества перестановок, где каждый набор содержит подстановкиK, и каждая перестановка представляется как и массив элементовN. Я сохраняю его как массивint pset[S][K][N], гдеS,KиNфиксированы, а N больше K.Два набора перестановок
AиBявляются изоморфными, если существует перестановкаP, которая преобразует элементы изAвB(например, еслиAявляется элементом множестваA, тоP(a)является элементом множестваB). В этом случае мы можем сказать, чтоPделаетAиBизоморфным.
Мой текущий алгоритм:
- Выберем все пары
s1 = pset[i]иs2 = pset[j], такие, чтоi < j - Каждый элемент из выбранных множеств (
s1иs2) числится от1доK. Это означает, что каждый элемент может быть представлен какs1[i]илиs2[i], где0 < i < K+1 - Для каждой подстановки
TэлементовKмы делаем следующее:- Найдите перестановку
R, такую, чтоR(s1[1]) = s2[1] - Проверьте, является ли
Rперестановка, которая делает изоляциюs1иT(s2), гдеT(s2)является перестановкой элементов (перестановок) множестваs2, поэтому в основном мы просто проверяем, еслиR(s1[i]) = s2[T[i]], где0 < i < K+1 - Если нет, то переходим к следующей перестановке
T.
- Найдите перестановку
Эти алгоритмы работают очень медленно: O(S^2) для первого шага, O(K!), чтобы перебрать каждую перестановку T, O(N^2), чтобы найти R и O(K*N), чтобы проверить, что R является перестановкой, которая делает s1 и s2 изоморфной - так что это O(S^2 * K! * N^2).
Вопрос: Можем ли мы сделать это быстрее?

