大家好,
首先,我不是想创建一个社交网络,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
现在我想找到朋友之间的圈子并创建一个结构数组并将该圈子放在数据库中(没有一个数组可以包含另一个已经拥有的相同朋友)。
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个(所以守护进程不会搜索整个数据库)
编辑:
我想过这样的事情:
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!
}
这个函数的问题是它可以搜索整个数据库而不找到最大的圆,或者最好的匹配。