比较五种不同的来源

时间:2013-01-11 08:27:52

标签: algorithm time-complexity n-way-merge

我需要编写一个比较2-5个“文件”的函数(实际上是2-5组数据库行,但类似的概念),我不知道如何做到这一点。生成的差异应该并排显示2-5个文件。输出应显示添加,删除,更改和未更改的行,每个文件都有一列。

我应该使用什么算法来遍历行以保持低复杂度?每个文件的行数小于10,000。我可能不需要External Merge,因为总数据大小在兆字节范围内。简单易读的代码当然也很不错,但它不是必须的。

编辑:文件可能来自某个未知来源,没有“原始”可以与其他1-4个文件进行比较;所有文件都必须以某种方式与其他文件进行比较。

编辑2:我,或者说我的同事,意识到内容可能会被排序,因为输出顺序无关紧要。这个解决方案意味着对应用程序的这一部分使用额外的领域知识,但差异复杂性是O(N)和不太复杂的代码。这个解决方案很简单,当我关闭赏金时,我会忽略这个编辑的任何答案。但是我会回答我自己的问题以供将来参考。

4 个答案:

答案 0 :(得分:2)

如果必须将所有 n 文件(其中2< = n < = 5)与其他文件进行比较,那么它似乎我要比较的组合数量是C( n ,2),由(在Python中)定义为:

def C(n,k): 
    return math.factorial(n)/(math.factorial(k)*math.factorial(n-k))

因此,对于 n = 2,3,4,5,您将分别进行1,3,6或10次成对比较。

时间复杂度将是C( n ,2)乘以您选择使用的成对 diff 算法的复杂性,这将是预期的O( ND),在Myers'算法的情况下,其中N是要比较的两个序列的长度之和,A和B,D是A和B的最小编辑脚本的大小。 / p>

我不确定您需要此代码的环境,但Python中的difflib作为示例,可用于查找各种序列之间的差异 - 而不仅仅是文本行 - 所以它可能对你有用。 difflib文档并没有准确说明它使用的是什么算法,但是它对时间复杂性的讨论让我觉得它与迈尔斯的相似。

答案 1 :(得分:1)

伪代码(编辑2):

10: stored cells = <empty list>
for each column:
  if cell < stored cells:
    stored cells = cell
  elif cell == lastCell:
    stored cells += cell

if stored cells == <empty>:
  return result
result += stored cells
goto 10

答案 2 :(得分:0)

看看这篇文章。详细列出了2个数据源与陷阱的比较

[http://www.codeproject.com/Articles/30102/Comparing-DataSets-using-LINQ] [1]

答案 3 :(得分:0)

可以使用标准差异算法解决2个文件的情况。 从3个文件开始,您可以使用“多数投票”算法:

如果超过一半的记录是相同的:3个中的2个,4个中的3个,5个中的5个是考虑更改其他记录的参考。

如果变化的数量相对较少,这对算法来说意味着相当快的速度。

Pseudocode:
  initialize as many line indexes as there are files
  while there are still at least 3 indexes incrementable
    if all indexed records are the same 
      increment all line indexes
    else 
      if at least one is different - check majority vote
      if there is a majority
        mark minority changes, increment all line indexes
      else
        mark minority additions (maybe randomly deciding e.g. in a 2:2 vote)
        check addition or removing and set line indexes accordingly
        increment all indexes
      endif
    endif
  endwhile