gpt4 book ai didi

algorithm - 是否存在一种算法可以找到二维数组中非相交值的最小总和?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:55:55 25 4
gpt4 key购买 nike

我正在寻找一种快速算法来确定给定二维数组的特定最小属性 - 没有共同行或列的最小值的总和。我确定这一定有一个名字,但我不知道它叫什么。

我有一个字符串匹配系统,它将按空格拆分输入字符串并将其与搜索值语料库(也按空格拆分)进行比较,并返回每个字符串中标记之间的距离矩阵,然后我希望通过采用不重复使用任何输入/输出 token 组合的最小距离组合将其减少到单个聚合距离。

例子:

{ 1, 2 }   => 5 (either 1+4, or 3+2)
{ 3, 4 }

{ 0, 2 } => 6 (because 2+4 < 0+8)
{ 4, 8 }

{ 1, 0, 0 }
{ 0, 1, 0 } => 0
{ 0, 0, 1 }

{ 2, 3, 4 }
{ 3, 2, 4 } => 6 (2+2+2)
{ 4, 3, 2 }

到目前为止,我一直在使用的朴素算法如下所示 (C#):

public static int Minimux(this int[,] array) {
var xUsed = new bool[array.GetLength(0)];
var yUsed = new bool[array.GetLength(1)];
var xMax = array.GetLength(0);
var yMax = array.GetLength(1);
var minima = new List<int>();
var limit = Math.Min(xMax, yMax);
int xMin = 0, yMin = 0;
while (minima.Count < limit) {
var vMin = Int32.MaxValue;
for (var x = 0; x < xMax; x++) {
for (var y = 0; y < yMax; y++) {
if (xUsed[x] || yUsed[y] || array[x, y] >= vMin) continue;
vMin = array[x, y];
xMin = x;
yMin = y;
}
}
xUsed[xMin] = true;
yUsed[yMin] = true;
minima.Add(vMin);
}
return (minima.Sum());
}

它基本上执行数组扫描,当它找到每个最小值时,它将行/列组合标记为“已使用”,因此不会再次考虑 - 一旦列表中的最小值与元素的数量一样多在最短的数组维度中,它返回这些最小值的总和。

问题是它会在这样的情况下崩溃:

{ 0, 0, 0 }
{ 0, 0, 0 } => 3 (when it should be returning 1)
{ 1, 2, 3 }

当扫描到达最后一行时,它已经将第 0 列和第 1 列标记为“已使用”,因此第 2 行中的最小未使用值为 3,而它实际上应该使用 1

执行此操作是否存在标准算法?

最佳答案

是的,有一个标准算法可以准确地解决这个问题。它的名字是Hungarian algorithm .

关于algorithm - 是否存在一种算法可以找到二维数组中非相交值的最小总和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com