Задача, как реализовать алгоритм для шести степеней разделения? - PullRequest
21 голосов
/ 16 января 2010

UserA-UserB-UserC-UserD-UserF

Пользователи, подключенные через '-', знают друг друга.

И мне нужен алгоритм для этих 2 задач:

  1. Рассчитать путь от UserX до UserY
  2. Для UserX рассчитать всех пользователей, которые находятся на расстоянии не более 3 шагов.

Есть ли эффективное решение?

EDIT

Моя цель не в том, чтобы доказать, правильно это или нет, а в случае необходимости вычислить результат в реальном времени.

Плюс, я думаю, что самый выразительный способ - это код, даже псевдо-.

ИЗМЕНИТЬ СНОВА

Я решил, что такая работа должна выполняться внутри базы данных, поэтому это должно быть решение sql!

Ответы [ 12 ]

1 голос
/ 26 января 2010

Я отвечаю только на решение SQL. Это дает всем путям 3 шага, хотя это может быть неэффективно для больших наборов данных. Таблицы «ЗНАТЬ», «ЗНАТЬ_1» и т. Д. Все идентичны и имеют два поля P1 и P2. Он имеет запись, только если 1) P1 знает P2 или 2) P2 знает P1. Данные в P1 и P2 могут быть произвольными строками, соответствующими каждому человеку.

Этот SQL-запрос Acccess должен дать все пути, где a знает, что b знает, c знает d без циклов (например, a знает, что b знает, что c знает, знает a). Вам все еще нужно устранить дубликаты (abcd = dcba), но вы сможете легко это сделать на втором этапе. Циклы устраняются путем предотвращения повторений предыдущих людей в выражениях Where.

ВЫБРАТЬ Ноу.P1, Ноу.P2, Ноу_1.P2, Ноу_2.P2

ОТ (ЗНАЙТЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗНАЙТЕ КАК ЗНАЙТЕ_1 ВКЛЮЧИТЕ ЗНАЮ.P2 = ЗНАЮ_1.P1)

ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗНАЕТ КАК ЗНАЕТ_2 ВКЛ. ЗНАЕТ_1.P2 = ЗНАЕТ_2.P1

ГДЕ (((Know_1.P2) <> [Know]. [P1]) И ((Know_2.P2) <> [Know]. [P1] И (Know_2.P2) <> [Know]. [ P2]))

ЗАКАЗАТЬ ПО ЗНАЮ.P1, Знать.P2, Знать_1.P2, Знать_2.P2;

Не так элегантно, как предыдущие решения, но, похоже, работает нормально. У нас был некоторый опыт выполнения аналогичной работы с программированием ограничений, и мы обнаружили, что процесс SQL быстрее для определенных проблем.

1 голос
/ 16 января 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...