提问人:joshwbrick 提问时间:12/27/2008 最后编辑:joshwbrick 更新时间:12/27/2008 访问量:2218
“同步”2 个阵列的算法
Algorithm for 'Syncing' 2 Arrays
问:
Array 1 | Array 2
=================
1 | 2
2 | 3
3 | 4
5 | 5
| 6
将数组 2 “同步”或组合到数组 1 中的好算法是什么?需要执行以下操作:
- 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
- 两个数组中的整数可以单独保留。
- 应从数组 1 中删除数组 1 中的整数,但不在数组 2 中的整数。
我最终会用 Obj-C 对此进行编码,但我真的只是在寻找一种有效算法的伪代码表示来解决这个问题,所以请随时以您想要的任何形式提出答案。
编辑:
如果不给出背景故事,我需要的最终结果很难解释。我有一个 Cocoa 应用程序,它有一个 Core Data 实体,其数据需要使用 Web 服务中的数据进行更新。我不能简单地用数组 2(从 Web 解析为数组的数据)的内容覆盖数组 1(核心数据实体)的内容,因为数组 1 与我的应用程序中的其他核心数据实体有关系。因此,基本上重要的是,两个数组中包含的整数不会在数组 1 中被覆盖。
答:
Array1 = Array2.Clone()
或者一些等价物可能是最简单的解决方案,除非元素的顺序很重要。
评论
好吧,如果顺序无关紧要,那么你已经有了自己的算法:
- 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
- 两个数组中的整数可以单独保留。
- 应从数组 1 中删除数组 1 中的整数,但不在数组 2 中的整数。
如果整数的顺序很重要,那么您想要的是确定两个字符串之间“差异”的算法的变体。Levenshtein 算法应该适合您。
但是,我怀疑您实际上想要第一部分。在这种情况下,问题到底是什么?如何找到数组中的整数?或。。。什么?
在我的方法中,您将需要设置数据结构。我希望你能在 Obj-C 中找到一些实现。
- 将 Array1 的所有元素添加到 Set1 并对 Array2 到 Set2 执行相同的操作。
- 循环遍历 Array1 的元素。 检查它是否包含在 Set2 中 (使用提供的方法。如果是 not,则从 Set1 中删除了该元素。
- 遍历 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。
评论
(假设这不是一个简单的问题,)如果数组被排序,你会看到一个 O(n+m) 传递两个数组。指向两个数组的开头,然后前进包含较小元素的指针。继续比较元素并相应地添加/删除元素。这样做的效率可能值得对数组进行排序的成本,如果它们还没有的话。Array1 = Array2
你说:
将数组 2 “同步”或组合到数组 1 中的好算法是什么?需要执行以下操作:
- 应将数组 2 中而不是数组 1 中的整数添加到数组 1 中。
- 两个数组中的整数可以单独保留。
- 应从数组 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
与其说“这是需要发生的事情”,不如尝试用以下方面来描述需求
“这是必需的最终条件”。从这个角度来看,所需的最终状态似乎是包含与 完全相同的值。array1
array2
如果是这样的话,那么为什么不等效于这个伪代码(除非你的环境有一个 or 方法)?clone
copy
array1 = new int[array2.length]
for (int i in 0 .. array2.length - 1) {
array1[i] = array2[i]
}
如果订单、重复项保留等问题是问题,请更新问题,我们可以重试。
我有点猜测,因为你的例子让一些东西悬而未决,但通常在这种情况下,我会使用一个集合。下面是 Obj-C 中的一些示例代码。
NSMutableSet *set = [NSMutableSet set];
[set addObjectsFromArray:array1];
[set addObjectsFromArray:array2];
NSArray *finalArray = [[set allObjects] sortedArrayUsingSelector:@selector(compare:)];
你的问题没有提到顺序,如果你检查你的三个要求,你会看到后置条件说 Array2 没有改变,而 Array1 现在包含的整数集与 Array2 中的整数集完全相同。除非您没有告诉我们的订单上有一些要求,否则您不妨直接复制 Array2。
评论