algorithm - 优化 O(n^2) 算法所需的建议

标签 algorithm optimization hadoop

我正在寻求优化目前相当简单的算法 O(n2)。我有一个记录文件,其中每个人都需要 在同一个文件中相互比较。如果两者是 'same'(比较器函数相当复杂),匹配的 记录输出。请注意,可能有多个记录匹配 彼此,并且没有顺序感 - 仅当匹配为 True 或 False 时。

伪代码:


For (outRec in sourceFile) {
  Get new filePointer for targetFile //starting from the top of the file for inner loop
  For (inRec in targetFile) {
    if (compare(outRec, inRec) == TRUE ) {
      write outRec
      write inRec
    }
    increment some counters
  }
  increment some other counters
}

数据没有以任何方式排序,也没有预处理 可以订购数据。

任何关于这如何变得不那么重要的想法 O(n2)?我正在考虑应用 MapReduce 范式 在代码上,打破外部和内部循环,可能使用 链式映射函数。我很确定我已经弄清楚了代码 Hadoop,但想在花时间编码之前检查替代方案

感谢建议!

添加:记录类型。基本上,我需要匹配名称/字符串。这 匹配类型如下例所示。


1,Joe Smith,Daniel Foster<br/>
2,Nate Johnson,Drew Logan<br/>
3,Nate Johnson, Jack Crank<br/>
4,Joey Smyth,Daniel Jack Foster<br/>
5,Joe Morgan Smith,Daniel Foster<br/>
<br/>
Expected output:
Records 1,4,5 form a match set
End of output

补充:这些文件会很大。最大的文件是 预计将有大约 2 亿条记录。

最佳答案

我不确定你的比较器和数据集的属性,但假设你的比较器在你的行上定义了一个等价关系,这里什么也没有:

  1. 为输入文件创建一个映射,并使用比较器函数作为映射的关键比较器。 map 值是行的序列/列表,即所有“相同”的行被连续添加到同一 map 条目)。花费 O(n*log n) 时间。
  2. 遍历其他文件的行并检查每一行是否与映射中的键匹配。在这种情况下,由于比较器隐含的等价关系,您知道该行与该映射条目值中的所有行“相同”。需要 O(n* log n + C),具体取决于您必须输出多少匹配项。

请注意,在最坏的情况下,根据您的问题描述,您无法获得比 O(n^2) 更好的结果,这仅仅是因为您必须输出匹配记录的 O(n^2) 结果!

关于algorithm - 优化 O(n^2) 算法所需的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6665151/

相关文章:

scala - Spark中是否有类似twitter.scalding.addTrap的API处理异常

hadoop - 在 hadoop 服务器上运行 jar 作为服务

最大化矩阵的最小对角线元素的算法

python - 如何在pytorch中打印Adadelta中的 "actual"学习率

algorithm - 复杂度 - 输入长度

c++ - increment 会执行多少次?

c - 循环索引的C语言:在新CPU中正向索引是否更快?

java - Hadoop MapReduce作业可实现最高频率

c# - 在 C# 中获取一个范围内的随机持续时间

python - 分析堆栈排序算法的时间复杂度