[英]Comparison Algorithm
我有2个数组( A
和B
)包含类似的数据,但有一些差异。 我想返回一个仅在A
的对象数组和另一个仅在B
的对象数组。 到目前为止,我一直在想:
我还有什么其他选择? 任何语言/解决方案都是公平游戏。
您可以对两个阵列进行排序,然后同时对两个阵列进行线性扫描。 这将是用于排序的O(nlogn)算法和用于扫描/构建新阵列的O(n)。
我将数组A的元素填充到哈希表中,然后迭代数组B在哈希表中进行查找以有效地确定B中的哪些元素也在A中。然后在迭代数组时对哈希表中的B元素执行相同的操作答:那将是整个O(N)。
这很大程度上取决于您拥有的数据类型。 你提到排序,所以我认为它的元素是可比的。 对于大小为m
和n
集合,这将需要O(m lg m + n lg n)
进行排序,这将占主导地位。 (渐近地,如果你进行二元搜索或遍历两个列表都没关系。走两个列表应该是O( m + n)
。)当然,如果你使用的数据有更好的排序算法,比如整数radix-sort,你应该能够达到O( m + n)
。
使用集合(正如其他人所建议的)隐含地建议使用散列,这肯定会使您的问题更容易。 如果散列A( O(m)
)中的所有元素并将所有散列存储在内存中的散列集中,则散列B( O(n)
)并检测散列集中可能发生冲突的位置。 这成为优化的问题:您必须评估经典的速度 - 内存权衡。 哈希集越大,冲突检查就越快。 这将在O( m + n )
。
值得注意的是,您可以证明任何执行您所要求的算法将至少运行m + n
次,因为需要查看所有输入。
尝试使用套装。 它们通常有一个difference()方法(或类似的东西),它可以准确地返回你想要的东西。 就那么简单。 一旦它与语言无关,就可以使用常规方法完成如何创建集合或将差异转换为数组。
Set A = createSetA();
Set B = createSetB();
Array onlyAElements = transformToArray(A.difference(B));
Array onlyBElements = transformToArray(B.difference(A));
或者,您可以对两个数组进行排序,并同时获取两个差异数组。 就像是
int aIndex = 0;
int bIndex = 0;
Array aOnly = new Array();
Array bOnly = new Array();
while (aIndex != a.length || bIndex != b.length)
{
if (A[aIndex] == B[bIndex]
{
aIndex++;
bIndex++;
}
else if (A[aIndex] > B[bIndex])
{
aOnly.add(A[aIndex]);
aIndex++;
}
else
{
bOnly.add(B[bIndex]);
bIndex++;
}
}
你应该记住,在越界方面存在一些错误。 但代码只是为了获得主要想法。
我没有超出已经说过的实现或算法,但是我想我会在c#/ linq中留下这个解决方案给任何可能发现这个问题但想要这样做的人:
var a = new int[] { 1, 2, 3, 6, 7, 8, 9, 10 };
var b = new int[] { 1, 2, 3, 4, 5, 6, 7 };
int[] addedToA = a.Except(b);
int[] missingFromA = b.Except(a);
foreach (var i in addedToA)
{
Console.Write("{0} ", i);
}
Console.WriteLine();
foreach (var i in missingFromA)
{
Console.Write("{0} ", i);
}
这打印:
8 9 10
4 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.