有效地找到满足多个条件的二进制向量

计算科学 线性代数 矩阵 表现
2021-12-11 11:55:47

我正在尝试解决以下问题:

给定一个二进制矩阵和一个向量,是否存在一个二进制向量满足以下要求?A{0,1}m×nbNnc{0,1}n

  1. cb<x,其中是给定的阈值。x

  2. c是矩阵中行的线性组合。A

到目前为止,我的尝试集中在构建所有可能的二元向量,维度为,检查所有这些向量的要求编号 1,然后检查满足要求编号 1 的所有向量的要求编号 2。这种蛮力方法由于 n 和 m 可以变得相当大,因此已经非常无效。1×n

我怎样才能以比我的蛮力方法更有效的方式解决这个问题?

用一个虚构的例子说明了这个问题:

假设公司内的员工可以自由地请求该公司内各部门组的汇总收入数据。的组的总收入时,才会批准请求。检查每个请求的组本身是否满足此要求是微不足道的。但是,可以请求多个组,因此还必须进行检查以确定组合的组是否可以识别少于人的组的收入。xx

在这个例子中,矩阵和向量可以解释如下:

矩阵A:每一行代表一个请求的组,每一列代表一个部门。值“1”表示部门包含在组中,“0”表示不包含。

向量 b:包括有关每个部门有多少员工的信息。

因此,满足这两个要求的二进制向量的存在意味着应该拒绝对数据的请求。

我决定包括这个例子,以防我对问题的解释有缺陷或只是不必要的限制。非常感谢所有帮助。

编辑:

作为一个例子,我选择设置并定义如下:x=4Ab

A=(111 010 001)         b=(2 5 7)

如上所述,矩阵表示请求的部门(列)组(行)。向量包含有关每个部门有多少员工的信息。在此示例中,很明显,所有请求的组本身都将满足条件,即它们没有识别少于四个人的组的总收入。我们可以通过计算来检查:Ab

Ab=(14 5 7)

我们看到所有组中有五名或更多员工。但是,如果我们在矩阵中从第一行中减去第二行和第三行,我们可以看到我们可以在矩阵的第一列中确定部门的总收入。该部门只有两名员工,因此请求组的线性组合允许识别只有两个人的组的总收入!这意味着应拒绝对这些部门组的请求。此示例产生作为以下二进制向量,它满足两个条件:AAcT

cT=(100)

中删除第三行,那么满足这两个条件的二进制向量将不存在。AcT

1个回答

首先,计算矩阵 A 的行和。这应该是 n 次 m 操作。将行和存储到带有行索引的类向量结构中。使用 quisort 或类似方法按大小对该向量进行排序:(操作:n*m + O(n LOG(N)))。然后从最低的行总和开始,检查条件是否仅适用于这一行。沿着排序的数组向上工作。

这个想法是,由于b只有正数,那些包含更多的行将更接近违反标准。您从该行开始,最有可能通过第二个标准。这至少回答了一个这样的向量是否存在的问题。尽管排序低的那些行的线性组合更有可能通过,但它可能不会加快查找所有这些行的速度。

除了所述的信息之外,您还有关于 A 和 b 的更多信息吗?取决于此,问题可能具有非常不同的特征。(如果您有一百万个为零的矩阵行,那么对它们进行排序将是一种浪费,等等)

编辑:

为此设计一个算法,我的方法是以某种方式对工作进行排序,以便首先检查最有可能的候选者(行/行组合)。我描述的方式仅有助于找到满足自身条件的行。也许你可以把问题反过来。如果我们查看向量,找到线性组合的最简单(最可能)的方法是找到 b 中具有低值的行的组合。如果您的向量是:,那么我将通过寻找可以隔离第一个条目的组合来开始暴力破解。b=(1,1,3,8,999)