通用成员算法

时间:2009-09-18 16:33:43

标签: algorithm membership

人们可以属于一个或多个群体。输出普通会员资格的好算法是什么?

即,人员A和B属于C,D和E组等......

我的首选语言是Ruby(或也许 Python),但任何代码或伪代码都会非常感激。

3 个答案:

答案 0 :(得分:1)

您的意思是下面的内容吗? (蟒):

>>> a_groups = set(["A", "B", "C"])
>>> b_groups = set(["B", "C", "D"])
>>> print a_groups & b_groups
set(['C', 'B'])
>>>

答案 1 :(得分:1)

实际上,这是一个非常简单的算法(至少对于合理数量的用户和群组而言)。

将每个用户视为一个集合,其元素是他们所属的组。要查找两个用户共有的组,只需将这两个用户的成员集合交叉即可。

因此,如果A组在K组,M组和N组中,而B组在K,N和P中,您将拥有以下组:

A := {K, M, N}
B := {K, N, P}
intersect(A, B) = {K, N}

在Ruby中,您可以使用标准库类Set来执行这些计算:

require 'set'
memberships_a = Set[:K, :M, :N]
memberships_b = Set[:K, :N, :P]
shared = memberships_a.intersection(memberships_b)
# you can also use the '&' operator as shorthand for 'intersection'
shared_2 = memberships_a & memberships_b

答案 2 :(得分:0)

您是否试图找到有关会员资格的特别信息?或者你只是想找到所有会员资格......即:

A - No group
B - Groups 1, 2, 3
C - Groups 2, 5
D - Groups 2, 3, 4

如果是后者,我认为没有一种特殊的算法可以做到这一点;只要验证一个人在一个团队中,O(1)就是O(M * N)暴力算法。

For each person O(N) {
   Create a set for this person
   For each group O(M) {
       if the person is in the group, add this group to the set O(1) when using maps/hashed structures
   }
   output the set
}

如果您正在寻找集合的交集,那么还有许多其他算法......但这个特殊问题并不特别。