【问题标题】:Objective-C algorithm to find largest common subsets of arrays?Objective-C算法找到数组的最大公共子集?
【发布时间】:2013-08-29 01:48:01
【问题描述】:

我目前需要一种有效的解决方案来查找多个数组的最大公共子集。

例如: 假设用户 Chris 想要找到其他具有共同兴趣的用户(从最常见到最不常见);我们必须将他的兴趣数组与其他用户的数组进行比较,并找到最大的公共子集到最小的公共子集。

克里斯{保龄球、游戏、滑冰、跑步}

以及数据库中的其他用户。

布拉德{保龄球、跳跃、步行、坐姿}
约翰 {保龄球、游戏、滑冰、吃饭}
莎拉 {保龄球、游戏、绘画、编码}

因此,克里斯与约翰、莎拉、布拉德分别有着最共同的兴趣。

在 Objective-C 中,我如何能够做到这一点?任何指针都会很棒。

【问题讨论】:

标签: objective-c arrays algorithm


【解决方案1】:

您正在寻找一种算法来查找集合交集的基数。

根据您的设置表示,您可以选择不同的方式进行操作。最有效的表示是使用整数中的位,但如果可能的兴趣数超过 64,这可能不容易实现。

一个直接的实现方法是使用NSMutableSet,如下所示:

// Prepare the individual lists
NSArray *chris = @[@"bowling", @"gaming", @"skating", @"running"];
NSArray *brad =  @[@"bowling", @"jumping", @"walking", @"sitting"];
// Obtain the intersection
NSMutableSet *common = [NSMutableSet setWitArray:chris];
[common intersectSet:[NSSet setWithArray:brad]];
NSLog(@"Common interest count: %i", common.count);

【讨论】:

  • 一个问题:如果我将用户的兴趣存储在字符串值而不是数组中,找到一个公共子字符串会比处理数组更容易/更有效吗?
  • @JacobBrubaker 不,它会有所不同,因为你会寻找最长的公共子序列 - 一个相当复杂的算法 (link)。兴趣字符串有多少种不同的可能性?
  • 无限可能;用户创建自己的兴趣,因此没有真正的固定兴趣选项可供选择。您认为将用户限制为仅从一组兴趣中进行选择在集合交集方面会更有效吗?
  • @JacobBrubaker 是的,限制选择可以让您加快搜索速度。如果您可以将列表限制为从 64 个标准项目中进行选择,那么获得两个集合的交集就像AND将两个位集合在一起一样容易。但是,在用户数量达到数千甚至数百万之前,效果不会显着。
  • 嘿,伙计,有一个问题:您能解释一下为什么“如果可能的兴趣数超过 64,这可能不容易实现”吗?对不起,迟到的问题。我知道它如何减慢搜索速度,但它如何阻碍上述实现?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 2018-03-08
  • 1970-01-01
相关资源
最近更新 更多