Ich habe ein Array a [i] [j]. Die Elemente sind char, interpretiert als Teilmengen der Menge {1, ..., 8} (das Element k ist in der Teilmenge, wenn das k-te Bit 1 ist). Ich denke nicht, dass es relevant ist, aber jedes Element hat genau 4 Bits gesetzt.Vergleichen Sammlungen von Subsets bis Permutation
Jede Zeile a [1] [j] .. a [n] [j] ist eine Sammlung von Teilmengen von {1, ..., 8}. Ich muss doppelte Zeilen entfernen, wobei zwei Zeilen als Duplikate betrachtet werden, wenn man durch eine Permutation von {1, ..., 8} von der anderen erhalten werden kann.
Beispiel (0bxxxxxxxx bedeutet Binärzahl):
0b11000000, 0b01100000, 0b00110000
ist ein Duplikat
0b00110000, 0b00011000, 0b00100100
weil erstere durch Anwenden der Permutation von diesem erhalten werden kann
8->8, 7->7, 6->1, 5->4, 4->3, 3->2, 2->5, 1->6
und das Ergebnis neu ordnen.
Aus Leistungsgründen enthält das Array etwa 2000 Zeilen mit jeweils maximal 20 Elementen. Jede Zeile ist bereits geordnet, und auch die Zeilen sind in lexikographischer Reihenfolge angeordnet, falls dies helfen könnte. Der Rest des Algorithmus ist in C geschrieben, daher wäre eine C-Lösung bevorzugt.
Danke für Ihre Hilfe.
In der Grafik ist dies das Isomorphieproblem für 4-gleichförmige Hypergraphen. Es gelang mir, einige Ad-hoc-Vereinfachungen zu machen, die das Problem für Bruteforcing geeignet machten, aber ich frage mich immer noch über gute allgemeine Algorithmen. – user175348