“同步”2个数组的算法

时间:2008-12-26 22:08:22

标签: objective-c arrays

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

将阵列2“同步”或组合成阵列1的好算法是什么?以下需要发生:

  1. 阵列2中的整数但阵列1中的整数不应添加到阵列1中。
  2. 两个阵列中的整数都可以单独使用。
  3. 应从阵列1中删除阵列1中但不在阵列2中的整数。
  4. 我最终会在Obj-C中对此进行编码,但我真的只是在寻找一种有效算法的伪代码表示来解决这个问题,所以请随意以你喜欢的任何形式提出答案

    编辑:

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

8 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

我有点猜测,因为你的例子在空中留下了一些东西,但通常在这样的情况下我会使用一套。这是Obj-C中的一些示例代码。

NSMutableSet *set = [NSMutableSet set];
[set addObjectsFromArray:array1];
[set addObjectsFromArray:array2];
NSArray *finalArray = [[set allObjects] sortedArrayUsingSelector:@selector(compare:)];

答案 2 :(得分:2)

在我的方法中,您需要Set data structure。我希望你能在Obj-C中找到一些实现。

  1. 将Array1的所有元素添加到Set1 并对Array2和Set2执行相同的操作。
  2. 循环遍历Array1的元素。 检查它是否包含在Set2中 (使用提供的方法。)如果是 不,从Set1中删除了元素。
  3. 循环遍历Array2的元素。如果它 在Set1中不存在,添加它 到Set1。
  4. Set1的所有元素现在都是您的“同步”数据。

    “包含”,“删除”和“添加”操作“Set”在一些好的实现(例如HashSet)上的算法复杂性将为您提供所需的效率。

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

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

    • 包含(n) - 检查bucket [n]是否为1。
    • add(n) - 将bucket [n]设置为1。
    • 删除(n) - 将bucket [n]设置为0。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

你说:

将阵列2“同步”或组合成阵列1的好算法是什么?以下需要发生:

  1. 阵列2中的整数但阵列1中的整数不应添加到阵列1中。
  2. 两个阵列中的整数都可以单独使用。
  3. 应从阵列1中删除阵列1中但不在阵列2中的整数。
  4. 这里有一些文字算法可以帮助你(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
    

答案 5 :(得分:1)

而不是“这就是需要发生的事情”,尝试用来描述需求 “这是必要的最终条件”。从这个角度看,期望的最终状态是array1包含与array2完全相同的值。

如果是这种情况,那么为什么不等同于这个伪代码(除非你的环境有clonecopy方法)?

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

如果订单,重复保留等问题,请更新问题,我们可以再试一次。

答案 6 :(得分:0)

好吧,如果订单无关紧要,那么你已经有了算法:

  1. 阵列2中的整数但阵列1中的整数不应添加到阵列1中。
  2. 两个阵列中的整数都可以单独使用。
  3. 应从阵列1中删除阵列1中但不在阵列2中的整数。
  4. 如果整数的顺序很重要,那么你想要的是决定两个字符串之间“差异”的算法的变体。 Levenshtein算法应该适合你的。

    但是,我怀疑你真的想要第一部分。在那种情况下,完全是什么问题?如何在数组中找到整数?或者......什么?

答案 7 :(得分:0)

你的问题没有说明订单,如果你检查了你的三个要求,你会发现后置条件说 Array2没有改变 Array1现在包含完全相同的整数集在Array2中。除非你没有告诉我们关于订单的要求,否则你也可以复制一下Array2。