Это очень простой алгоритм, фактически (по крайней мере, для разумного количества пользователей и групп).
Рассмотрите каждого пользователя как набор, элементами которого являются группы, членом которых они являются. Чтобы найти группы, у которых есть два пользователя, просто возьмите пересечение наборов пользователей этих двух пользователей.
Таким образом, если лицо А в группе К, М и 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
Просьба уточнить. вы ищете для всех пар? пары с двумя или более заданными людьми? Как представлены данные в памяти (т. Е. Структура данных.) Знают ли люди объекты о группах? Сообщают ли объекты группы о людях? – CodePartizan