У меня есть массив a [i] [j]. Элементы являются char, интерпретируются как подмножества множества {1, ..., 8} (элемент k находится в подмножестве, если k-й бит равен 1). Я не думаю, что это актуально, но каждый элемент имеет ровно 4 бита.Сравнение наборов подмножеств с точностью до перестановки
Каждая строка a [1] [j] .. a [n] [j] представляет собой набор подмножеств {1, ..., 8}. Мне нужно удалить повторяющиеся строки, где две строки считаются дубликатами, если их можно получить из другой путем перестановки {1, ..., 8}.
Пример (0bxxxxxxxx означает двоичное число):
0b11000000, 0b01100000, 0b00110000
является дубликатом
0b00110000, 0b00011000, 0b00100100
поскольку первые может быть получен из последнего путем применения перестановки
8->8, 7->7, 6->1, 5->4, 4->3, 3->2, 2->5, 1->6
и переупорядочение результата.
Для соображений производительности массив содержит около 2000 строк, каждый из которых содержит не более 20 элементов. Каждая строка уже упорядочена, а также строки в лексикографическом порядке увеличения, если это может помочь. Остальная часть алгоритма написана на C, поэтому было бы предпочтительным решение C.
Благодарим за помощь.
В теории графов это задача изоморфизма для 4-однородных гиперграфов. Мне удалось сделать некоторые специальные упрощения, что сделало проблему подходящей для bruteforcing, но мне все еще интересно о хороших общих алгоритмах. – user175348