我正在编写一个回溯深度优先搜索算法,它有很多答案。
我想要所有这些,但我知道我正在做多余的工作。 (事实上超过k!次,其中k是集的数量)
我有一个列表列表,它们的联合是1到n的数字集合,没有任何重复。
我正在寻找一种方法,看看我之前是否检查了一个组合。
例如:A = [[1,2,4],[3]]应与B = [[3],[1,2,4]]
相同数字范围总是小于3 ^ k,其中(k + 1)是数集。
3组的含义,数字范围小于9。 对于4组,数字范围小于27(实际上是17),依此类推。 实际上,如果A_n表示将需要n组的最小数,则对于n> A_n <= 3 * A_(n-1)。 1.(我没有证明这一点,但我很确定)
我想出了一些可怕的解决方案,但我想我会发布它们,看看它们是否给了任何人一个想法。
1:我在每个列表中散列总共k个哈希值,然后做一些数学,(加,乘等)然后散列。或者只是把它放在一个元组本身并散列它。例如:
A = [ [1,2,4], [3] ]
def hashIt(A):
x = [hash(tuple(y)) for y in A]
x.sort()
return hash(tuple(x))
2:如果我的数字少于3 ^ 10,我想我可以创建一个整数n个数字,每个地方都代表它所在的位置。
例: A = [[1,2,4],[3]]将为0010.因为1位于第0个列表中,2位于第0个列表中,3个位于第1个... B = [[3],[1,2,4]]将是1101.因为1在第1列表中,2在第1列表中,3在第0列...
然后,我可以将一个数字改为其按时间顺序排列的最小形式,因为将所有的数字与零和0交换为一个,将是一个较小的数字,因此它在时间上也较小。使用10套这样做会非常慢,但仍然比检查每个可能的设置更快。
如果我有三组,A = [[1,2,4,8],[3,5,6,10],[7,9]]和B = [[7,9],[1] ,2,4,8],[3,5,5,10]]。然后 change_To_Hashable(A)= 0010112021 change_To_Hashable(B)= 1121220102
在这里,我们必须将0与0交换,然后将1与2交换。
但是C = [[1,2,4,9],[3,5,6],[7,8,10]] change_To_Hashable(C)= 0010112202
3:当你想检查和存储时对每个列表进行排序,这样搜索就不会太痛苦
4:首先搜索包含1的列表,然后浏览该列表
方法一似乎是最快的,但是一旦我有一个合理的解决方案,我想做一些严肃的数字运算。
感谢您的帮助。