我将在下面以我想要的精确形式表达这个问题:
给定:两个浮点列表N
且D
长度相同k
(k
是 2 的倍数)。众所周知,对于所有人i=0,...,k-1
来说,都存在j != i
这样的情况D[j]*D[i] == N[i]*N[j]
。(我使用从零开始的索引)
返回: 一个(长度k/2
)对的列表,(i,j)
例如D[j]*D[i] == N[i]*N[j]
。返回的对可能不是唯一的(任何有效的对列表都可以)
该算法的应用是找到广义回文特征值问题的特征值的倒数对。等式条件等价于N[i]/D[i] == D[j]/N[j]
,但也适用于分母为零的情况(这是一种确定的可能性)。特征值问题中的简并性导致配对不唯一。
更一般地说,该算法等价于:
给定X
:长度列表k
(k
是 2 的倍数)。众所周知,对于 all i=0,...,k-1
,存在j != i
这样的IsMatch(X[i],X[j])
返回 true ,其中IsMatch
是一个布尔匹配函数,它保证至少j != i
为 all之一返回 true i
。
返回:一个(长度k/2
)对列表,对于列表中(i,j)
的IsMatch(i,j) == true
所有对。返回的对可能不是唯一的(任何有效的对列表都可以)
显然,我的第一个问题可以用第二个问题来表述IsMatch(u,v) := { (u - 1/v) == 0 }
。现在,由于浮点精度的限制,永远不会有完全相等,所以我想要最小化匹配错误的解决方案。换句话说,假设IsMatch(u,v)
返回值u - 1/v
并且我希望算法返回一个列表,IsMatch 为其返回最小的错误集。这是一个组合优化问题。我在想我可以先天真地计算所有可能的索引对i
和之间的匹配错误j
,但是我需要选择一组最小错误,我不知道该怎么做。
澄清
该IsMatch
函数是自反的(IsMatch(a,b)
暗示IsMatch(b,a)
),但不是传递的。然而,它是 3-传递的:IsMatch(a,b) && IsMatch(b,c) && IsMatch(c,d)
意味着IsMatch(a,d)
.
附录
这个问题显然是图论中的最小权重完美匹配问题。但是,就我而言,我知道应该有一个“好的”完美匹配,因此边缘权重的分布并不是完全随机的。我觉得应该以某种方式使用这些信息。现在的问题是,对于最小权重完美匹配问题是否有一个很好的实现,它使用我的先验知识在搜索的早期获得解决方案。我也对任何此类算法的简单实现持开放态度。