人们可以属于一个或多个群体。输出普通会员资格的好算法是什么?
即,人员A和B属于C,D和E组等......
我的首选语言是Ruby(或也许 Python),但任何代码或伪代码都会非常感激。
答案 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
}
如果您正在寻找集合的交集,那么还有许多其他算法......但这个特殊问题并不特别。