Готово=) см. Апдейт в посте=) До Дурова не довёл, но доведу обязательно, а вот нас с Вами разделяет 4 рукопожатия. Кстати, до Дурова — уже есть цепочка, но длинноватая, через 10 рукопожатий. Сраните с графом.
Если я не ошибаюсь, то до Дурова у мну 3 или 4 рукопожатия.
Прикольно, так как мы с Женей Глазыриным (474078) работали вместе, а Леонид Калентьев также работал когда то в той компании :)
Забанить? У них вроде правило — не чаще раза в секунду заходить на новую страницу. Если скрипт будет это правило выполнять — разве забанят?
Можно в техподдержку написать — спросить :)
«Шесть рукопожатий» действуют не всегда. Но мир и правда тесен: не раз убеждался и сам, что среди знакомых моих знакомых находится люди множества умений и профессий.
Только «контакт» не лучший выбор для опытов, нередко «в друзья» добавляют людей, вообще их не зная. Вот для теста очередного скрипта, повышения программерского скилла или составления списка пользователей (а вот с последним будьте аккуратнее, можно попасть) — это можно ;)
Александр Наймушин(2856612) — Михаил ]netmisch[ Черных(1479019) — Дмитрий Гозман(1718621) — Андрей Лопатин(11191) — Павел Дуров(1)
Александр Наймушин(2856612) — Алексей Склёмин(4265315) — Наташа Minority Дрыганец(1230612) — Мария Павленко(7543286) — Андрей Лопатин(11191) — Павел Дуров(1)
Эльвира *Рыжая_Вельха* Хабибулина (можно найти на графе) — Павел Тутубалин — Игорь Hellsing666 Рыбаков — Елизавета Likogra Кондакова — Аня — Леди Лиса — Хурхулу — Даша *without_me* Шевлякова — Сергей t1nkk… Пономаренко
Извините за отсутствие id номеров, времени в обрез, да и бета сырая=)
Смоделировано алгоритмом номер 2, спасибо хабрачеловеку eigrad. Думало 300 секунд.
ОДнако сам факт нахождения цепочки длиной в 9 рукопожатий предполагает возможность создания универсально публичного (вернее, персонального для каждого) скрипта поиска.
Ничего себе! Спасибо за исследование, интересно. Жалко, что это всё-таки «не по правилам» и нельзя нарисовать ОченьБольшойГраф всех пользователей(читай, нельзя сливать всю базу)
НЛО прилетело и опубликовало эту надпись здесьНЛО прилетело и опубликовало эту надпись здесь
А как насчёт такого же, но только уже на Хабре и его друзьях ?:) я думаю было б интересно.А так експеремент меня очень удивил, класно вышло :) спасибо за то, что изменили некоторые мои взгляды.
Ооо, пасиба! А баг с ником да, реально есть, у меня в настройках ВКонтакте, там где можно поменять ник, он не выводится полностью, а только первая кавычка и первое слово — видимо связано с этим же.
Хм, странно.
У нас пусть около 7*109
если мы извлечем корень третьей степени, то получим число знакомых, которых минимально необходимо иметь для покрытия всего земного шара.
У меня получилось 1913 людей. Имхо это несколько больше, чем в среднем количество людей, с которыми нормально общается человек.
Можно не считать — два рукопожатия до ПВД.
Но, господи, смотрю на хабратопик, вижу знакомые имена/фамилии и втупляю не могу понять чего они на хабре делают. :))
На самом деле такую штуку бы — да вконтакт встроить. Жалкое подобие есть на одноклассниках — там максимум 3(?) «рукопожатия». С другой стороны, это приватность как-то нарушает…
Жаль, вас уже так завалили заявками, вручную такой объём вряд ли возьмётесь обрабатывать, а палить вконтакт впустую не хочется. Всё же (надеяться не вредно): id23959.
На сколько я разбираюсь в БД то вам крайне желательно удалить ключевое поле(зачем оно?) и создать индекс по myid. так же name можно вынести в отдельную таблицу чтоб не было дублирующихся данных и таблица связей работала быстрей.
мой скриптик:
протестировал на 4000000 базе с рандомными значениями. цепочку глубиной в 10 и общим количеством участников ~350 прошло за 0.07 секунды на моем сервере.
Количество запросов к БД = количеству просматриваемых уровней.
Если не заработает буду рад разобраться и помочь. критика, вопросы, советы — велком!
myid и frid повторяются, нельзя их делать ключевыми.
А насчёт name — это правильно, спасибо. Небольшой минус в том, что просто при просмотре страницы контакта проводится запись в базу, и на страницах размером в 500 контактов чувствуются ощутимые тормоза. При таком подходе они удвоятся.
А скриптик сейчас посмотрим, спасибо.
Честно говоря, удивлён скоростью работы, спасибо!
Чудеса просто.
2-3 секунды на моей 200 000 базе.
Есть 2 пожелания, если сумеете реализовать (я тоже попробую, надеюсь, сумею сделать, не испортив скорости).
1. Список друзей человека это не только все frid одного myid, но и все myid одного frid. Это важно, например, чтобы друзей Дурова находить (а список его друзей закрыт, например, 888570->1 работает на «ура», а наоборот, 1->888570 вылетает с предупреждением о пустом результате (mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:\home\priem\www\graf3.0.php on line 83).
2. Надо уметь закрывать пути через определённых людей, запрещая их.
второй пункт не понял что вы имеете в виду. привидите пример.
2-3 секунды это очень много на такой базе(или цепочка была очень длинная?). сделайте индекс на frid и myid и вынесете имя в отдельную таблицу — уверен скорость увеличиться в разы. добавление новых записей будет немного медленне, но если у вас не граббер который делает это в режиме постоянного сканирования, то вы этого не ощутите.
2-й тоже. Вероятно, кривовато, но на скорости сказывается слабо:
После загрузки списка друзей,
for($i=0;$i<=count($zapret)-1;$i++)
{
unset ($friends[$zapret[$i]]);
}
Альтернатива
Тимур Timurka Тазетдинов(222737) — Мария Чернышева(14335577) — Татьяна Яикина(1072856) — Наталья Ульянкова(119648) — Андрей Gottfried Белоус(696) — Анастасия Желудкова(59) — Павел Дуров(1)
Поиск пути на невзвешанном графе в 20млн вершин эт простой поиск волной:
N вершин (N < 20 млн. — допустим у нас стока народу вконтакте)
Есть очередь вершин в которые мы собираемся идти и массив из N элементов где отмечаем в каких вершинах были. Изначально массив забит нулями, единицей отмечена только начальная вершина, а в очереди только начальная вершина.
На каждом шаге берем одну вершину из очереди, добавляем ее детей в которых еще небыли и пишем единички в элементах массива им соответствующих. Заодно сравниваем с номером конечной вершины. Можем в массив вместо единичек писать расстояние до начальной (что обычно и делается). Можно в дополнительный массив писать данные для трассировки — номер вершины из которой мы пришли.
Массив из 20млн. байт — 20 МБ. Очередь (каждая вершина побывает в очереди <= 1 раза) <= 20Мб…
Кстати предположив что у каждого примерно по 100-200 друзей и с каждым из них от 10 до 50 общих друзей можно оценить диаметр нашего графа… Только, извините, мне лень)))
Идея, безусловно, красивая, да вот на практик уж очень туго работает. Долго.
Каждое t (которых N) делает запрос к базе данных. К приличной базе данных.
5 секунд это максимум, при заторможенной системе. В среднем около 0.4 — 0.1 секунды идёт, иногда быстрее.
SELECT * from where id in (select ...) очень долго работает, такчто отпадает сразу.
Параллелить php не умею. Скрипт очень долгоо работал, выход нашёлся в модифицировании проверки искомого человека.
Проверяется не с искомыы человеком, а последовательно со списком его друзей.
Связи через 9-х человек ищет на ура, в этом Вам огромное спасибо. Более длинные цепочки не укладываются в 400 секунд.
Такое время выполнения и не позволяет селать скрипт публичным.
Так что скоро просто выложу сам скрипт поиска, у каждого своя персональная маленькая база будет.
Ну и соответственно, их объединять можно будет между пользователями в единую базу.
Учтите, список его друзей закрыт. Но (!) он открыт у его друзей. Так что первоначальные 5 человек его первого круга пришлось искать «на шару». Их можно по пальцам пересчитать. Перечислите 20 друзей Павла Дурова — сниму шляпу)
Виктор Новосельцев(39525) — Владимир Марченко(39643) — Андрей Дельфин Лысиков(3028766) — Эээ www.ED-WIN.com Altergott(99295) — Иван Говнов(4289) — Александр Викторович Беспалов(17) — Павел Дуров(1)
Они были закрыты не всегда, а потом Павел, это по сути техподдержка, а друзей у техподдержки всегда много.
Я говорю о фиктивности социальной связи типа «Друг», это сбивает теорию о рукопожатиях, при желании будет вам и два и одно рукопожатие.
Александр Entropius Комков(791406) — Денис Бирюков(3900553) — Полина Кузовкова(910092)—
Дмитрий Гребенщиков(13834) — Roman POMEO~xfl~ Zhirnov(28339) — Maria Ignatina(64184) — Митенька Миронов(70) — Александр Викторович Беспалов(17) — Павел Дуров(1)
Прошу прощения, если кого-то пропустил! Просьб было много, некоторые закрыли списки друзей, некоторых найти не удалось. Итак, смотрим граф.
Всем спасибо. Подготавливается публичный (вернее, персональный) скрипт.
Наверное, можно.
Трудность его в том, что к скрипту прилагается серверная часть, а это значит, что желающим его установить также понадобится денвер и минимальные знания MySQL по настройке этого скрипта.
Дамир, вы бы не могли выложить куда-то алгоритм, а то топик уже старый и ссылки не работают, а мне очень интересно посмотреть реализацию.
Буду очень признателен, спасибо!
уже нет, скрипт нерабочий, т.к. вконтакте смнили (и не раз) структуру внетренюю.
Логику работы могу сказать и так:
при просмотре страницы со списком друзей любого человека браузер с помощью UserJS (GreaseMonkey для ФФ) сохранял текущий список (отправляя через iframe на локальную страницу, обрабатываемую локлальным apache+php). Таким образом собиралась база.
Затем банальными sql запросами строились списки людей. Алгоритмы поиска в ширину по таким базам лучше искать самостоятельно, информация есть.
Меня больше интересовал алгоритм, который был написан вами на php. Если он еще остался, был бы очень признателен за него. Со своей стороны обещаю указать ваше авторство даного алгоритма.
Очередная попытка доказать что мир тесен