我有一系列项目(~5000项,每个项目是英文单词)和项目对之间的距离函数。我想在阵列中找到一组项目,其中组内的所有项目都满足距离标准(例如,每对项目的距离小于2)。这些小组通常应尽可能大,但对此没有正式的定义或硬性要求。
我的实现语言是PHP,但我正在寻找有关能够有效处理此问题的算法的一般建议。
更新:我想我可以通过构建顶点为项目的图形来解决这个问题,并且在满足距离约束的项目之间存在边缘。一旦我构建了图形,我就可以运行像Bron-Kerbosch这样的算法来列出所有最大的团队。如果有效,我会更新,但在此期间随时添加您的想法。
答案 0 :(得分:1)
这个功能是如何定义的?它是预先计算的吗?如果是这样,您可以迭代计算的函数表示并根据您的标准检索单词对。如果没有,除了计算所有单词对之间的函数之外别无选择(这在图表方法中是必需的)。我会选择随机化+逼近策略,而不是Bron-Kerbosch算法,
http://dimacs.rutgers.edu/Workshops/Challenge10/abstracts.html#ovelgonne
http://dl.acm.org/citation.cfm?id=1933306.1934471
它基于模块化最大化方法。模块化是群集中的出局边缘数与群集中边缘数之间的比率。在您的情况下,您将寻找比率为0的集群,并选择其中最大的集群。这个算法非常快,适用于我使用过的大多数数据集。虽然基于模块化的方法对于这个问题可能有点过分,但我觉得这是一个很好的思考问题的方法+这个算法的实现可以在线获得(本文作者的C实现)。
答案 1 :(得分:0)
我理解的问题是:
“ A-G ”代表的话。 “#”代表两个单词之间的距离。你需要找出距离<= 2的对。
A B C D E F G
A * # # # # # #
B * # # # # #
C * # # # #
D * # # #
E * # #
F * #
G *
基本上它需要2级循环,我们可以做的是减少比较时间,只比较上面矩阵中的“#”部分。这是PHP中的代码:
$result = array();
while ( ($word = array_shift($arrWordList)) !== NULL ) {
foreach ($arrWordList as $otherWord ) {
if ( calc_dist($word, $otherWord) <= 2 ) {
$result[] = array($word, $otherWord);
}
}
}
你可以使用$ result继续做某事。
答案 2 :(得分:0)
鉴于您希望将条件应用于组的所有成员,您需要一种允许重叠组的聚类算法。这是一个相当复杂的主题,所以我能做的最好的工作就是引导你进入有关聚类算法的文献,特别是为重叠组设计的C-Means Clustering。