Как найти связи между пользователями, чтобы я мог создать закрытый круг друзей?

Всем привет,

Во-первых, я не пытаюсь создать социальную сеть, facebookдостаточно большой! (комикс) Я выбрал этот вопрос в качестве примера, потому что он точно соответствует тому, что я пытаюсь сделать.

Представьте, что у меня в MySQL есть таблица usersи таблица user_connectionsс «запросами на добавление в друзья». Если да, то это будет примерно так:

Users Table:

userid  username
1       John
2       Amalia
3       Stewie
4       Stuart
5       Ron
6       Harry
7       Joseph
8       Tiago
9       Anselmo
10      Maria


User Connections Table:

userid_request  userid_accepted
2               3
7               2
3               4
7               8
5               6
4               5
8               9
4               7
9               10
6               1
10              7
1               2

Теперь я хочу найти кругимежду друзьями и создать массив структури поместить этот круг в базу данных ( none из массивов могут включать тех же друзей, которые уже есть у другого).

Return Example:

    // First Circle of Friends
    Circleid => 1
    CircleStructure => Array(
        1 => 2,
        2 => 3,
        3 => 4,
        4 => 5,
        5 => 6,
        6 => 1,
    )
    // Second Circle of Friends
    Circleid => 2
    CircleStructure => Array(
        7 => 8,
        8 => 9,
        9 => 10,
        10 => 7,
    )

Я пытаюсь придумать алгоритм для этого, но я думаю, что это займет много времени, потому что он будет случайным образом искать в базе данных, пока не «замкнется» круг.

PS:Минимальная длина структуры круга составляет 3 соединения, а ограничение равно 100 (поэтому демон не выполняет поиск по всей базе данных)

РЕДАКТИРОВАТЬ:

Я думаю о чем-то вроде this:

function browse_user($userget='random',$users_history=array()){

    $user = user::get($userget);

    $users_history[] = $user['userid'];

    $connections = user::connection::getByUser($user['userid']);
    foreach($connections as $connection){
        $userid = ($connection['userid_request']!=$user['userid']) ? $connection['userid_request'] : $connection['userid_accepted'];

        // Start the circle array
        if(in_array($userid,$users_history)) return array($user['userid'] => $userid);

        $res = browse_user($userid, $users_history);

        if($res!==false){
            // Continue the circle array
            return $res + array($user['userid'] => $userid);
        }
    }

  return false;
}

while(true){

    $res = browse_user();

    // Yuppy, friend circle found!
    if($res!==false){
            user::circle::create($res);
    }

    // Start from scratch again!
}

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

12
задан animuson 23 September 2012 в 16:03
поделиться