Algorithm 有多少件普通的

Algorithm 有多少件普通的,algorithm,data-structures,Algorithm,Data Structures,假设我们有这些信息: 更新 我想知道哪些组包含最常见的项目: 输出: 您将使用什么算法?首先,您必须表示数据集: data[A] = {1,2,3} data[B] = {1,3} data[C] = {3,4} 最好使用数字,以便可以用于循环、计数器等。。因此: data[0] = {1,2,3} data[1] = {1,3} data[2] = {3,4} 然后我会有另一个数据结构,其中有一个计数器,指示组之间有多少个匹配项,例如matches[a][B]=2,matches[a][C

假设我们有这些信息:

更新

我想知道哪些组包含最常见的项目:

输出:


您将使用什么算法?

首先,您必须表示数据集:

data[A] = {1,2,3}
data[B] = {1,3}
data[C] = {3,4}
最好使用数字,以便可以用于循环、计数器等。。因此:

data[0] = {1,2,3}
data[1] = {1,3}
data[2] = {3,4}
然后我会有另一个数据结构,其中有一个计数器,指示组之间有多少个匹配项,例如matches[a][B]=2,matches[a][C]=1等等。这是您需要计算的数据结构。如果您这样做,那么您的问题将减少到在该数据结构中查找最大值

for i = 0; i < 3; i++
   for item in data[i] 
      for j = 0; j < 3; j++
         //optimize a little bit (match[A][A] doesn't make sense)
         if j == i
            next
         if item in data[j]
            matches[i][j]++
表示i=0;i<3;我++
对于数据中的项目[i]
对于j=0;j<3;j++
//稍微优化一下(匹配[a][a]没有意义)
如果j==i
下一个
数据中的if项[j]
比赛[i][j]++

当然,您可以对此进行进一步优化。例如,我们知道匹配项[A][B]将等于匹配项[B][A],所以您可以跳过这些迭代。

所以,给定一个组及其包含的项的列表,您希望输出所有组的标识,这些组与另一个组具有相同的最大公共项数

让我们获取组和项目的列表:

group_items = (
    ('Group A', ('Item 1', 'Item 2', 'Item 3')),
    ('Group B', ('Item 1', 'Item 3')),
    ('Group C', ('Item 3', 'Item 4')),
    )
然后,让我们存储每个组的max#items共享值,这样我们就可以在最后收集所有匹配的组。我们还将跟踪最大值中的最大值,因为我们可以(而不是返回并重新计算它)

现在我们要将每个组与其他组进行比较,但我们可以忽略某些比较。正如@Perroloco提到的,比较A组和A组是没有用的,计算相交(A,B)与计算相交(B,A)是对称的,所以我们可以从0到N,然后从i+1到N,而不是0..N交叉0..N

我使用的是
数据类型,它的构造成本很高。所以我缓存了这些集合,因为我们没有修改成员资格,只是计算交叉点的成员资格

值得指出的是,当交点(A,B)=交点(B,A)时,A的最大值与B的最大值并不相同。因此,内部最大值和外部最大值有单独的比较

for i in range(num_groups):
    outer_name, outer_mem = group_items[i]

    if outer_name not in group_sets:
        group_sets[outer_name] = set(outer_mem)

    outer_set = group_sets[outer_name]
    outer_max = max_shared[outer_name]

    for j in range(i+1, num_groups):
        inner_name, inner_mem = group_items[j]

        if inner_name not in group_sets:
            group_sets[inner_name] = set(inner_mem)

        inner_set = group_sets[inner_name]

        ni = len(outer_set.intersection(inner_set))

        if ni > outer_max:
            outer_max = max_shared[outer_name] = ni

        if ni > max_max:
            max_max = ni

        if ni > max_shared[inner_name]:
            max_shared[inner_name] = ni

print("Overall max # of shared items:", max_max)

results = [grp for grp,mx in max_shared.items() if mx == max_max]

print("Groups with that many shared items:", results)

你的问题不清楚。常见项目是因为它们整体上看起来很常见,还是因为它们与另一组共享而常见?@AustinHastings不完全相同:a和B共占a和B项目总数的67%(无重复-这应由作者澄清)-它们是项目1和项目3。A和C为25%,为第3项。B和C各占50%,这是第3项。
group_items = (
    ('Group A', ('Item 1', 'Item 2', 'Item 3')),
    ('Group B', ('Item 1', 'Item 3')),
    ('Group C', ('Item 3', 'Item 4')),
    )
max_shared = {item[0]:0 for item in group_items}
num_groups = len(group_items)
group_sets = {}
max_max = 0
for i in range(num_groups):
    outer_name, outer_mem = group_items[i]

    if outer_name not in group_sets:
        group_sets[outer_name] = set(outer_mem)

    outer_set = group_sets[outer_name]
    outer_max = max_shared[outer_name]

    for j in range(i+1, num_groups):
        inner_name, inner_mem = group_items[j]

        if inner_name not in group_sets:
            group_sets[inner_name] = set(inner_mem)

        inner_set = group_sets[inner_name]

        ni = len(outer_set.intersection(inner_set))

        if ni > outer_max:
            outer_max = max_shared[outer_name] = ni

        if ni > max_max:
            max_max = ni

        if ni > max_shared[inner_name]:
            max_shared[inner_name] = ni

print("Overall max # of shared items:", max_max)

results = [grp for grp,mx in max_shared.items() if mx == max_max]

print("Groups with that many shared items:", results)