我有一个数组 a[i][j]。元素是 char,解释为集合 {1,...,8} 的子集(如果第 k 位为 1,则元素 k 在子集中)。我认为这无关紧要,但每个元素都设置了 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 解决方案。
谢谢你的帮助。