【问题标题】:Compressing vectors into cartesian products将向量压缩成笛卡尔积
【发布时间】:2015-04-16 10:43:55
【问题描述】:

我有 N 个 10 维向量,其中每个元素的值可以是 0,1 或 2。 例如,vector 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,2], 2, 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

【问题讨论】:

  • 您看过numpyscipy 库吗?
  • 或许itertools.product可以帮到你。
  • itertools.product 似乎从规定的笛卡尔积创建向量,我想反过来。不过可能有助于在算法中使用。
  • 你有多少个向量?
  • 不时变化,但通常在 3000 左右

标签: python algorithm cartesian-product


【解决方案1】:

如果您的向量是 (0,1) 值的,那么您将面临最小的 DNF 问题,which is(如果我错了,请纠正我)NP-hard。拥有 (0,1,2) 值的向量不会让问题变得更简单。

【讨论】:

    【解决方案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
    

    所以它是这样工作的:

    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.
    

    【讨论】:

    • 谢谢zsong!我会试试看。有点担心如果我从 ([0,1], [0,1], 0) 和 ([0,2], [0,2], 1) 跨越的行开始,我会以 ([ 0,0,[0,1]]), (0,1,0),(0,2,1), (1, [0,1], 0), (2,[0,2],1 ) 作为解决方案。但可能适用于较大的起始集。
    猜你喜欢
    • 2017-06-02
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 2015-05-07
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多