两个视图层次结构之间的公共子视图

时间:2014-05-05 04:49:12

标签: ios objective-c algorithm sorting uiview

我有两个视图V1和V2,分别有n和m个子视图。在m和n子视图中,有一个常见的“p”视图。

我试图在m和n子视图中找出这个常见视图'p'。显然,O(m * n)的强力逼近可以很好地得到共同的视图p。但我想知道是否有更好的算法可以用来获得V1和V2中存在的唯一公共视图。

V1 = {B,K,L,P,O,B,C,A,Q,R} V2 = {A,X,W,S,T,K,O};

在O(m * n)中,运行蛮力给我O作为答案。这里的视图O和O具有相同的类。 正如评论中指出的那样,我不是在寻找具有相同框架的观点。

有效的方法吗?

经过一番思考后,还有@CrimsonChris的答案,我有以下解决方案

- (void)commonView:(UIView *)a1 with:(UIView *)a2 {

    NSMutableSet *s = [[NSMutableSet alloc] initWithCapacity:[[a1 subviews] count]];
    for (UIView *a1SubViews in [a1 subviews]) {
        [s addObject:[a1SubViews class]];
    }

    for (UIView *a2SubView in [a2 subviews]) {
        if ([s containsObject:[a2SubView class]]) {
            NSLog(@"#Boom, I found the common view %@", a2SubView);
            return;
        }
    }
    NSLog(@"NO common subview");
    return;
}

但是这使用O(n)空间,我们可以进一步优化它吗?

2 个答案:

答案 0 :(得分:1)

您可以从子视图中构建哈希表,并将每个子视图的类名作为键。

该O(n)表现,但也是O(n)。

答案 1 :(得分:0)

我们可以用O(1)空间和O(max(m,n)log m)时间(m <= n)来做到这一点。

如果我们有两个带有n和m个元素的数组int[]a and b

  • 首先,我们可以排序数组b - &gt;时间复杂度为O(mlogm)
  • 对于数组的每个元素a - &gt;使用二进制搜索在数组b中搜索此元素 - &gt;时间复杂度为O(nlogm)

所以最后,如果你使用就地排序算法(例如:merge - sort),我们总的时间复杂度是O(max(m,n)log m),空格是O(1)。

我们可以将int[] a and b替换为任何Object数组,只要这些Object 可比较即可。 (使用哈希码也是一种选择)。