我将以我想要的准确形式将问题表述如下:
鉴于:
两个长度相同的浮点列表N和D(k是2的倍数)。
众所周知,对于所有k,存在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]是2的倍数)。
众所周知,对于所有X,存在k使得k返回true,其中i=0,...,k-1是布尔匹配函数,保证对于所有j != i至少有一个返回true。
返回:
一个(长度IsMatch(X[i],X[j]))对列表IsMatch,这样列表中的所有对都j != i。
返回的对可能不唯一(任何有效的对列表都可以)
显然,我的第一个问题可以用i来表示。现在,由于浮点精度的限制,永远不会有完全相等的结果,所以我想要一个最小化匹配误差的解决方案换言之,假设k/2返回值(i,j),我希望算法返回一个列表,ismatch返回最小的错误集。这是一个组合优化问题。我想我可以先天真地计算所有可能的索引对IsMatch(i,j) == true和IsMatch(u,v) := { (u - 1/v) == 0 }之间的匹配错误,但随后我需要选择最小错误集,我不知道该怎么做。
澄清
IsMatch(u,v)函数是自反(u - 1/v暗示i),但不是传递的。然而,它是3传递的:j表示IsMatch。
附录
这个问题显然是图论中的最小权完全匹配问题但是,在我的例子中,我知道应该有一个“好”的完美匹配,所以边缘权重的分布不是完全随机的。我觉得这些信息应该以某种方式使用。现在的问题是,是否有一个很好的实现,以最小权重完美匹配问题,利用我的先验知识,以达成一个解决方案,在搜索早期我也对任何此类算法的简单实现的指针持开放态度。

最佳答案

我希望我能解决你的问题。
好吧,如果IsMatch(i, j) and IsMatch(j, l)那么IsMatch(i, l)。更一般地,IsMatch关系是传递性、交换性和自反性,即它的等价关系。算法将转换为列表中出现次数最多的元素(使用ismatch而不是=)。

关于algorithm - 在列表中查找匹配对的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1806189/

10-12 19:41