在python

时间:2016-02-07 20:09:38

标签: python hash dynamic-programming depth-first-search backtracking

我正在编写一个回溯深度优先搜索算法,它有很多答案。

我想要所有这些,但我知道我正在做多余的工作。 (事实上​​超过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的列表,然后浏览该列表

方法一似乎是最快的,但是一旦我有一个合理的解决方案,我想做一些严肃的数字运算。

感谢您的帮助。

0 个答案:

没有答案