我有两个视图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)空间,我们可以进一步优化它吗?
答案 0 :(得分:1)
您可以从子视图中构建哈希表,并将每个子视图的类名作为键。
该O(n)表现,但也是O(n)。
答案 1 :(得分:0)
我们可以用O(1)空间和O(max(m,n)log m)时间(m <= n)来做到这一点。
如果我们有两个带有n和m个元素的数组int[]a and b
:
所以最后,如果你使用就地排序算法(例如:merge - sort),我们总的时间复杂度是O(max(m,n)log m),空格是O(1)。
我们可以将int[] a and b
替换为任何Object数组,只要这些Object 可比较即可。 (使用哈希码也是一种选择)。