У меня есть база данных из 20 миллионов пользователей и связей между этими людьми. Как я могу доказать концепцию «Шесть степеней разделения» наиболее эффективным способом в программировании?
Как я могу программно доказать концепцию шести степеней разделения?
Ответы (4)
Вы просто хотите измерить диаметр графика. между наиболее удаленными узлами графа.
Множество алгоритмов в Google, а также Boost graph .
Вероятно, вы можете уместить граф в памяти (в представлении, что каждая вершина знает список своих соседей).
Затем из каждой вершины n можно запустить поиск в ширину (используя очередь) до глубины 6 и подсчитать количество посещенных вершин. Если не все вершины посещены, вы опровергли теорему. В противном случае продолжите со следующей вершины n.
Это O(N*(N + #edges)) = N*(N + N*100) = 100N^2, если у пользователя в среднем 100 подключений, что не идеально для N=20 миллионов. Интересно, могут ли упомянутые библиотеки вычислить диаметр с большей временной сложностью (общий алгоритм - O (N ^ 3)).
Вычисления для отдельных вершин независимы, поэтому их можно выполнять параллельно.
Немного эвристики: начните с вершин с наименьшей степенью (больше шансов опровергнуть теорему).
Я думаю, что самый эффективный способ (худший случай) - это почти N ^ 3. Постройте матрицу смежности, а затем возьмите эту матрицу ^2, ^3, ^4, ^5 и ^6. Ищите любые записи в графе, которые равны 0 для матрицы через матрицу ^ 6.
Эвристически вы можете попытаться выделить подграфы (большие группы людей, которые соединены с другими группами только относительно небольшим количеством «мостовых» узлов), но нет абсолютно никакой гарантии, что они у вас будут.
Что ж, лучший ответ уже был дан, но мне не пришло в голову, что я бы выбрал Алгоритм Флойда-Уоршалла для всех пар кратчайшего пути, который равен O(n^3). Я не уверен в сложности алгоритма диаметра графа, но это «звучит» так, как будто это также будет O (n ^ 3). Хотелось бы разъяснений по этому поводу, если кто знает.
Кстати, у вас действительно есть такая база данных? Страшный.