У меня есть массив множеств перестановок, и я хочу удалить изоморфные перестановки.
У нас есть
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)
.
Вопрос: Можем ли мы сделать это быстрее?