Я не уверен, спрашиваете ли вы, как делать предложения или определять расстояние между друзьями. Делать предложения легко, но, как правило, их размер увеличивается.
Первые два случая могут быть охвачены одним и тем же алгоритмом, а третий - небольшим расширением.
Первые два в основном ищут всех людей, которых знают ваши знакомые друзья:
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)
Как прокомментировал Нил Найт, вы можете отфильтровать каждый список друзей и начать с просмотра самых активных друзей в первую очередь. Или вычислите показатель сходства, который помогает тем друзьям, у которых с вами больше общих друзей.
Если вы на самом деле смотрите на определение расстояния между другом и предложением, это, вероятно, не имеет значения.