【问题标题】:Algorithm for 'Syncing' 2 Arrays“同步”2个数组的算法
【发布时间】:2010-09-28 12:06:28
【问题描述】:
Array 1 | Array 2
=================
   1    |   2
   2    |   3
   3    |   4
   5    |   5
        |   6

什么是“同步”或将数组 2 合并到数组 1 中的好算法?需要发生以下情况:

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

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

编辑:

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

【问题讨论】:

  • 如果您根据示例输入写出预期的答案,您会看到@Yuliy 为您提供了答案。否则,考虑集合论——集合并集,集合差;之类的东西。这将适用于您的问题的其他变体。
  • 后期编辑:那么有一些信息你还没有给我们;也许你还没有意识到这很重要? 3-check 算法不是您想要的,或者还有其他重要的东西,比如数组中的位置。但正如所写,您要求 Array1 中的 Array2 的副本。
  • (续):也许如果您向我们展示结果应该与 Array2 的副本有何不同,那么我们会更好地理解您的问题。

标签: objective-c arrays


【解决方案1】:

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

【讨论】:

  • 这不是很明显,但是当你通过这三种情况时,Array2 中的每个项目都需要在 Array1 中,并且不需要任何已经在 Array1 中但不在 Array2 中的项目,所以结果是 Array2 的副本。 +1
  • 是的,就是这样。除非问题中有错误。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      “包含”、“删除”的算法复杂度,以及“设置”的“添加”操作在一些好的实现上,例如HashSet,会给你你想要的效率。

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

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

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

      【讨论】:

      • Cocoa 有一个 Set 类(NSSet 和 NSMutableSet)。
      【解决方案5】:

      你说:

      什么是“同步”或将数组 2 合并到数组 1 中的好算法?需要发生以下情况:

      1. 应将数组 2 中但数组 1 中未包含的整数添加到数组 1。
      2. 两个数组中的整数可以单独保留。
      3. 应从 Array 1 中删除 Array 1 但不在 Array 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
      

      【讨论】:

        【解决方案6】:

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

        如果是这样,那为什么不用这个伪代码的等价物(除非你的环境有clonecopy 方法)?

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

            【解决方案8】:

            你的问题没有提到顺序,如果你检查你的三个要求,你会看到后置条件说 Array2 没有改变 并且 Array1 现在包含完全相同的整数集即在 Array2 中。除非您没有告诉我们订单上的某些要求,否则您也可以制作 Array2 的副本。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-06-04
              • 1970-01-01
              • 2014-01-21
              • 1970-01-01
              • 1970-01-01
              • 2011-10-30
              • 2015-04-22
              • 1970-01-01
              相关资源
              最近更新 更多