Python 选择表中的列,以便新表的行至少包含R中出现的一个初始行元素

Python 选择表中的列,以便新表的行至少包含R中出现的一个初始行元素,python,r,select,unique,dynamic-programming,Python,R,Select,Unique,Dynamic Programming,事实上,问题更复杂:以下数据集有n列和p行 C1 C2 C3 C4 C5... Cn R1 2 8 5 2 7 R2 2 5 8 7 7 R3 2 5 8 7 7 ... Rp 我的问题是:如何选择列的组合来创建一个新表,其中每行至少包含一次初始行的每个不同值,且非唯一值的数量最少 示例1:如果我的表只有C1到C3列和R1到R3行,那么选择C1、C2、C3就是解决方案:新表的每一行将只包含2、5和8行 示例2:现在,如果表的

事实上,问题更复杂:以下数据集有n列和p行

    C1  C2  C3  C4  C5... Cn
R1  2   8   5   2   7
R2  2   5   8   7   7
R3  2   5   8   7   7
...
Rp
我的问题是:如何选择列的组合来创建一个新表,其中每行至少包含一次初始行的每个不同值,且非唯一值的数量最少

示例1:如果我的表只有C1到C3列和R1到R3行,那么选择C1、C2、C3就是解决方案:新表的每一行将只包含2、5和8行

示例2:现在,如果表的范围是C1到C5,R1到R3,我将选择C1、C2、C3和C5(不是C4)

我的第一次(天真的)尝试是Python中的递归算法:

  • 选择列(Ci)
  • 查找在结果表的行中添加新值而不创建重复值的另一列(Cj)
  • 否则,请选择另一个Cj
  • 如果没有Cj能够满足标准,则返回1
  • 第一个反对意见:这种方法显然是次优的,整个表有11行,大约2500列

    第二个反对意见:如果不存在重复值为零的解,则该算法不会给出次优解


    我怀疑这个问题背后隐藏着某种动态规划,但我更愿意使用现有的包:)

    这听起来像顶点覆盖问题。任何元素的最大值是多少?如果它很低,您可以为每一行尝试bitmask+DP,并将单独获得的列并集为O(2^位数*行*列)。这听起来像是顶点覆盖问题。任何元素的最大值是多少?如果低,您可以为每行尝试bitmask+DP,并将单独获得的列合并为O(2^位*行*列)