Python 将向量压缩成笛卡尔积
我有n10维向量,其中每个元素的值可以是0,1或2。 例如,Python 将向量压缩成笛卡尔积,python,algorithm,cartesian-product,Python,Algorithm,Cartesian Product,我有n10维向量,其中每个元素的值可以是0,1或2。 例如,向量v=(0,1,1,2,0,1,2,0,1,1)是其中一个向量。 是否有一种算法(最好是python)可以将这些向量压缩成最少数量的笛卡尔乘积。如果不是完美的解决方案,是否有一个算法,至少可以提供良好的压缩 示例:两个“笛卡尔向量” ([1,2],0,1,0,0,0,1,1[0,1],0])(给出4个向量)和(0,1,0,2,0,0,0,0,1)(给出2个向量)给出了N=6个向量的最优解: 1,0,1,0,0,0,1,1,0,0 2,
向量v=(0,1,1,2,0,1,2,0,1,1)
是其中一个向量。
是否有一种算法(最好是python)可以将这些向量压缩成最少数量的笛卡尔乘积。如果不是完美的解决方案,是否有一个算法,至少可以提供良好的压缩
示例:两个“笛卡尔向量”
([1,2],0,1,0,0,0,1,1[0,1],0])
(给出4个向量)和(0,1,0,2,0,0,0,0,1)
(给出2个向量)给出了N=6个向量的最优解:
1,0,1,0,0,0,1,1,0,0
2,0,1,0,0,0,1,1,0,0
1,0,1,0,0,0,1,1,1,0
2,0,1,0,0,0,1,1,1,0
0,1,0,2,0,0,0,2,0,1
0,1,0,2,0,0,2,2,0,1
如果你的向量是(0,1)值的,你将面临最小DNF问题,(如果我错了请纠正我)NP难问题。拥有(0,1,2)值向量不会使问题变得更简单。贪婪算法可能有用:
Let S = <V1, V2, ... Vn>
has_merge_ops = True
while has_merge_ops:
has_merge_ops = False
S' = []
for v in S:
if there exits v' which differs from v by just only ONE element:
V = merge v and v' by merging the different values at index k
S'.append(V)
S.remove(v)
S.remove(v')
has_merge_ops = True
S = S'
return S
你看过和库了吗?也许可以帮助你。itertools.product似乎从声明的笛卡尔积创建向量,我想反过来说。不过,在算法中使用可能会有所帮助。你们有多少个向量?有时会有所不同,但通常在3000个左右!我会试试看。不用担心,如果我从跨越([0,1]、[0,1]、0)和([0,2]、[0,2]、1)的行开始,我将以([0,0,[0,1]]、(0,1,0)、(0,2,1)、(1,[0,1]、[0,1]、[0,2]、1)作为解决方案。但在起跑阵容较大的情况下可能会很好地发挥作用。
after sorting, S =
0,1,0,2,0,0,0,2,0,1
0,1,0,2,0,0,2,2,0,1
1,0,1,0,0,0,1,1,0,0
1,0,1,0,0,0,1,1,1,0
2,0,1,0,0,0,1,1,0,0
2,0,1,0,0,0,1,1,1,0
After first pass:
0,1,0,2,0,0,[0,2],2,0,1
1,0,1,0,0,0,1,1,[0,1],0
2,0,1,0,0,0,1,1,[0,1],0
After 2nd pass:
0,1,0,2,0,0,[0,2],2,0,1
[1,2],0,1,0,0,0,1,1,[0,1],0
Algorithm stops since no more merging is possible.