algorithm - 有谁知道这是否是多项式可解的?

标签 algorithm matrix time-complexity np-hard

您好,我正在处理以下问题。

给定一个大小为 M x N 且系数为正的矩阵。目标是选择 P 列,使得所得 M x P 矩阵的每一行中所有元素的最大总和最小。例如,如果 M = 3、N = 5、P = 2 并且矩阵由

a11 a12 a13 a14 a15
a21 a22 a23 a24 a25
a31 a32 a33`a34 a35

最佳解决方案是选择`第 2 列和第 4 列,结果矩阵由下式给出

a12 a14
一个22一个24
a32 a34

和最大值{a12 + a14, a22 + a24, a< sub>32 + a34} 在所有 P 列选择中最小。

由于存在(N 超过 P)个解,可以实现一个简单的指数算法来解决这个问题,但是有没有更快的多项式时间解呢?

或者,如果没有,谁能肯定地证明这是一个 NP-hard 问题?您是否知道任何类似的 NP 难问题可以简化为这个问题?

最佳答案

我相信这是 NP-hard 因为如果你能解决你的问题,那么你就可以解决 minimum vertex cover .

证明草图

方法是定义一个矩阵,每个顶点有一列,每条边有一行。

在第 j 行中,对应于顶点 x 和 y 之间的一条边,将每个元素置为 0,除了在列 x 和 y 处放置一个 1。

如果我们可以选择 P 列使得行总和的最大值 <= 1,那么我们知道剩余的列对应于原始图的顶点覆盖。

(行总和 <= 1 意味着所选的 P 列最多只能包含 x 和 y 中的 1 个,因此我们的顶点覆盖中必须至少包含 x 和 y 中的 1 个。)

通过使用二分法,我们可以计算出满足此条件的最大 P,从而推断出最小顶点覆盖的大小。

关于algorithm - 有谁知道这是否是多项式可解的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19348213/

相关文章:

c++ - 如何使用 CUDA 实现 2-for 粒子交互循环,由此产生的复杂性是什么?

c++ - Opengl 为什么在全局空间中旋转时预乘矩阵?

python - 需要帮忙!使用 python 计数素数

time-complexity - 1+2+3+...+n 的大 O 表示法

data-structures - 如果Redis Sorted Set是用Skip List实现的,为什么ZPOPMIN的时间复杂度是O(log n)?

algorithm - 用户放置轮换算法

algorithm - 用于排除埃拉托斯特尼筛法数字的 Haskell 代码未按预期工作

string - Lua中的字符串

java - 如何使用 java.util.Scanner 处理多个输入?

algorithm - 找到最大的相交对角线