我想知道匈牙利算法覆盖所有零元素所需的最小行数。我尝试了这个链接,但那里的代码是贪心算法。
例如,
{0,0,1,1},
{1,0,0,1},
{1,0,1,0},
{1,1,1,1},
这个案例失败了。我应该得到输出3。但是这个解决方案给出的输出是4。
如果有其他解决方法,将是非常有帮助的。
谢谢
我想知道匈牙利算法覆盖所有零元素所需的最小行数。我尝试了这个链接,但那里的代码是贪心算法。
例如,
{0,0,1,1},
{1,0,0,1},
{1,0,1,0},
{1,1,1,1},
这个案例失败了。我应该得到输出3。但是这个解决方案给出的输出是4。
如果有其他解决方法,将是非常有帮助的。
谢谢
我没有CPP编译器或Java运行时环境。使用 ES2017 在浏览器中编写此代码。至少它可以在你的浏览器上运行!如果需要,我可以用其他语言编写它(cpp、java、php、python)。
我必须补充说,我不知道“匈牙利算法”,我只是创建了一种找到最佳最小优化行的算法!
我正在Github仓库中推送这个代码和测试。因此,您可以在这里获取更多信息、代码和文档。
在矩阵数据表示中,我使用了:
索引0
表示行,索引1
表示列。
遍历input
数组并计算零的数量,将其存储在一个二维数组中。
#matrixPower
表示每列或每行中零的数量。
#matrixPower[0]
中具有大于0
的值的行都包含零,我们从现在开始称它们为powered
。powered
行并检查每个跨越当前powered
行的列上的0
!如果有任何幂为1
的列,则在该行上画线!并将每个交叉列的功率减少1
。因为它被当前行覆盖!zero
上穿过一行时,由于交叉处的zero
,功率至少为1
。powered
列,则应在其上画线!inputMatrix
是包含您的矩阵的变量!let colLength = inputMatrix[0].length;
let rowLength = inputMatrix.length;
let matrixPower = [Array(rowLength).fill(0), Array(colLength).fill(0)];
let matrixLine = [Array(rowLength).fill(0), Array(colLength).fill(0)];
for (let row = 0; row < rowLength; row++) {
for (let col = 0; col < colLength; col++) {
if (inputMatrix[row][col] == 0) {
matrixPower[0][row]++;
matrixPower[1][col]++;
}
}
}
let minimum = 0;
let len = [matrixPower[0].length, matrixPower[1].length], cross;
for (let row = 0; row < len[0]; row++) {
cross = [];
for (let col = 0; col < len[0]; col++) {
if (inputMatrix[row][col] == 0) {
cross.push(col);
if (matrixPower[1][col] < 2) {
matrixLine[0][row] = 1;
}
}
}
if (matrixLine[0][row] == 1) {
minimum++;
for (let i = 0; i < cross.length; i++)
matrixPower[1][cross[i]]--;
}
}
for (let col = 0; col < len[1]; col++) {
if (matrixPower[1][col] > 0) {
matrixLine[1][col] = 1;
minimum++;
}
}
console.log(minimum);
我用随机的12*10
矩阵对优化后的暴力函数进行了100次测试。结果是100%正常!
暴力算法平均时间:0.036653秒
优化算法平均时间:0.000019秒
暴力算法总时间:3.9180秒
优化算法总时间:0.0025秒
我进行了一百次测试,暴力算法用了约4秒,而算法只用了2.5毫秒
我相信通过更多的工作,这可以进一步优化。