Ответ 1
Я не уверен, что вы спрашиваете, как делать предложения или определять расстояние между друзьями. Сделать предложения легко, но они будут стремительно взорваться по размеру.
Первые два случая могут быть покрыты одним и тем же алгоритмом, а третий - небольшим расширением.
Первые два в основном ищут всех людей, которых знают ваши знакомые друзья:
FriendHash = {}
foreach Friend in me.getFriends()
foreach FriendOfFriend in Friend.getFriends()
FriendHash{FriendOfFriend} += 1
foreach PotentialFriend in keys FriendHash
if FriendHash{PotentialFriend} > 1
me.suggestFriend(PotentialFriend)
В случае 1 связь между друзьями 1 и 2 может быть дополнительным ограничением, которое фактически сделало бы это дело более сложным для реализации. Требуя, чтобы друзья 1 и 2 имели ссылку, вам нужно будет обнаружить потенциальных друзей, итерации пар друзей, а не один раз в конце.
foreach Friend in me.getFriends()
foreach SecondFriend in me.getFriends()
# skip already processed friends and Friend == SecondFriend
if Friend.getFriends() contains SecondFriend
foreach FriendOfFriend in Friend.getFriends()
# skip already suggested friends
if SecondFriend.getFriends() contains FriendOfFriend
me.suggestFriend(PotentialFriend)
Конечно, есть определенная оптимизация, которая может быть добавлена там, которая пропускает повторные сравнения. На практике это, вероятно, не является полезным поиском для запуска в любом случае. Все, что вы собираетесь сделать, это исключить потенциальных друзей, которые являются общими для двух разных групп друзей.
Последний случай изменяет первый сегмент псевдокода, распространяя предложение друга всем друзьям знакомых друзей друзей:
foreach PotentialFriend in keys FriendHash
if FriendHash{PotentialFriend} > 1
foreach ExtendedFriend in PotentialFriend.getFriends()
me.suggestFriend(ExtendedFriend)
Как прокомментировал Нейл Найт, вы можете отфильтровать список друзей и начать сначала, глядя на самых активных друзей. Или вычислите оценку подобия, которая способствует тем друзьям, у которых больше друзей с вами.
Если вы действительно смотрите на обнаружение расстояния между другом и предложением, это, вероятно, не имеет значения.