Jak*_*ake 8 language-agnostic algorithm diff list
这出现在一个真实世界的情况,我想我会分享它,因为它可能会导致一些有趣的解决方案.本质上,算法需要区分两个列表,但是让我给出一个更严格的问题定义.
假设你有两个列表,L
并且R
每一个都含有一些潜在字母元素S
.而且,这些列表具有它们按顺序出现的共同元素的属性:也就是说,if L[i] = R[i*]
和L[j] = R[j*]
,然后i
< j
then i
*< j
*.列表根本不需要任何共同元素,并且一个或两个可以是空的.[ 澄清:你可以假设没有重复的元素.]
问题是产生一种列表,这可以被看作是有序对新列表的"差异"的(x,y)
地方x
,距离L
和y
距离R
,具有以下特性:
x
出现在两个列表中,则会(x,x)
显示在结果中.x
出现在L
但未出现R
,则会(x,NULL)
出现在结果中.y
出现在R
但未出现L
,则会(NULL,y)
出现在结果中.最后
L = (d)
R = (a,b,c)
Result = ((NULL,d), (a,NULL), (b,NULL), (c,NULL))
L = (a,b,c,d,e)
R = (b,q,c,d,g,e)
Result = ((a,NULL), (b,b), (NULL,q), (c,c), (d,d), (NULL,g), (e,e))
Run Code Online (Sandbox Code Playgroud)
有没有人有任何好的算法来解决这个问题?复杂性是什么?
通过遍历两个列表并随时匹配,可以在线性时间内完成区分有序列表。我将尝试在更新中发布一些伪 Java 代码。
由于我们不知道排序算法,并且无法根据小于或大于运算符确定任何排序,因此我们必须将列表视为无序。此外,考虑到结果的格式,您将面临扫描两个列表的情况(至少直到您找到匹配项,然后您可以添加书签并从那里重新开始)。它仍然是 O(n^2) 性能,或者更具体地说是 O(nm)。