“同步”2 个阵列的算法

Algorithm for 'Syncing' 2 Arrays

提问人:joshwbrick 提问时间:12/27/2008 最后编辑:joshwbrick 更新时间:12/27/2008 访问量:2218

问:

Array 1 | Array 2
=================
   1    |   2
   2    |   3
   3    |   4
   5    |   5
        |   6

将数组 2 “同步”或组合到数组 1 中的好算法是什么?需要执行以下操作:

  1. 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
  2. 两个数组中的整数可以单独保留。
  3. 应从数组 1 中删除数组 1 中的整数,但不在数组 2 中的整数。

我最终会用 Obj-C 对此进行编码,但我真的只是在寻找一种有效算法的伪代码表示来解决这个问题,所以请随时以您想要的任何形式提出答案。

编辑:

如果不给出背景故事,我需要的最终结果很难解释。我有一个 Cocoa 应用程序,它有一个 Core Data 实体,其数据需要使用 Web 服务中的数据进行更新。我不能简单地用数组 2(从 Web 解析为数组的数据)的内容覆盖数组 1(核心数据实体)的内容,因为数组 1 与我的应用程序中的其他核心数据实体有关系。因此,基本上重要的是,两个数组中包含的整数不会在数组 1 中被覆盖。

Objective-C 数组

评论

0赞 Jonathan Leffler 12/27/2008
如果你在给定示例输入的情况下写出预期的答案,你会看到@Yuliy给你答案。否则,考虑集合论 - 集合并集,集合差;诸如此类的事情。这将适用于您问题的其他变体。
0赞 Jonathan Leffler 12/27/2008
编辑后:然后是你还没有给我们的信息;也许你还没有意识到它很重要?要么 3-check 算法不是您想要的,要么还有其他重要的东西,例如数组中的位置。但正如所写,您要求在 Array1 中获取 Array2 的副本。
0赞 Jonathan Leffler 12/27/2008
(续):也许如果你向我们展示结果与 Array2 的副本有何不同,那么我们会更好地理解你的问题。

答:

8赞 Yuliy 12/27/2008 #1

Array1 = Array2.Clone()或者一些等价物可能是最简单的解决方案,除非元素的顺序很重要。

评论

0赞 Jonathan Leffler 12/27/2008
这并不是很明显,但是当您了解这三种情况时,Array2 中的每个项目在 Array1 中都是必需的,而 Array1 中已经存在但不在 Array2 中的任何内容都不是必需的,因此结果是 Array2 的副本。+1
0赞 Loki 12/27/2008
是的,就是这样。除非问题中有错误。
0赞 Lasse V. Karlsen 12/27/2008 #2

好吧,如果顺序无关紧要,那么你已经有了自己的算法:

  1. 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
  2. 两个数组中的整数可以单独保留。
  3. 应从数组 1 中删除数组 1 中的整数,但不在数组 2 中的整数。

如果整数的顺序很重要,那么您想要的是确定两个字符串之间“差异”的算法的变体。Levenshtein 算法应该适合您。

但是,我怀疑您实际上想要第一部分。在这种情况下,问题到底是什么?如何找到数组中的整数?或。。。什么?

2赞 Gant 12/27/2008 #3

在我的方法中,您将需要设置数据结构。我希望你能在 Obj-C 中找到一些实现。

  1. 将 Array1 的所有元素添加到 Set1 并对 Array2 到 Set2 执行相同的操作。
  2. 循环遍历 Array1 的元素。 检查它是否包含在 Set2 中 (使用提供的方法。如果是 not,则从 Set1 中删除了该元素。
  3. 遍历 Array2 的元素。如果它 Set1 中尚不存在,请添加它 到 Set1。

Set1 的所有元素现在都是您的“同步”数据。

在一些好的实现(如 HashSet)上,“contains”、“delete”和“set”的“add”操作的算法复杂性将为您提供所需的效率。

编辑:这是一个简单的实现,假设整数在 0 - 100 的有限范围内,每个元素都初始化为 0,只是为了更清楚地了解 Set。Set

首先需要定义大小为 101 的数组存储桶。然后对于..

  • contains(n) - 检查 bucket[n] 是否为 1。
  • add(n) - 将 bucket[n] 设置为 1。
  • delete(n) - 将 bucket[n] 设置为 0。

评论

0赞 Chris Hanson 12/29/2008
Cocoa 有一个 Set 类(NSSet 和 NSMutableSet)。
2赞 aib 12/27/2008 #4

(假设这不是一个简单的问题,)如果数组被排序,你会看到一个 O(n+m) 传递两个数组。指向两个数组的开头,然后前进包含较小元素的指针。继续比较元素并相应地添加/删除元素。这样做的效率可能值得对数组进行排序的成本,如果它们还没有的话。Array1 = Array2

1赞 kylebrooks 12/27/2008 #5

你说:

将数组 2 “同步”或组合到数组 1 中的好算法是什么?需要执行以下操作:

  1. 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
  2. 两个数组中的整数可以单独保留。
  3. 应从数组 1 中删除数组 1 中的整数,但不在数组 2 中的整数。

这里有一些文字算法可以帮助你(python):

def sync(a, b):
 # a is array 1
 # b is array 2
 c = a + b
 for el in c:
  if el in b and el not in a:
   a.append(el) # add to array 1
  elif el in a and el not in b:
   a.remove(el) # remove from array 1
  # el is in both arrays, skip
 return a # done
1赞 joel.neely 12/27/2008 #6

与其说“这是需要发生的事情”,不如尝试用以下方面来描述需求 “这是必需的最终条件”。从这个角度来看,所需的最终状态似乎是包含与 完全相同的值。array1array2

如果是这样的话,那么为什么不等效于这个伪代码(除非你的环境有一个 or 方法)?clonecopy

array1 = new int[array2.length]
for (int i in 0 .. array2.length - 1) {
    array1[i] = array2[i]
}

如果订单、重复项保留等问题是问题,请更新问题,我们可以重试。

3赞 Marc Charbonneau 12/27/2008 #7

我有点猜测,因为你的例子让一些东西悬而未决,但通常在这种情况下,我会使用一个集合。下面是 Obj-C 中的一些示例代码。

NSMutableSet *set = [NSMutableSet set];
[set addObjectsFromArray:array1];
[set addObjectsFromArray:array2];
NSArray *finalArray = [[set allObjects] sortedArrayUsingSelector:@selector(compare:)];
0赞 Norman Ramsey 12/27/2008 #8

你的问题没有提到顺序,如果你检查你的三个要求,你会看到后置条件说 Array2 没有改变而 Array1 现在包含的整数集与 Array2 中的整数集完全相同。除非您没有告诉我们的订单上有一些要求,否则您不妨直接复制 Array2。