昨天提问过的一问题,
http://www.iteye.com/problems/13431
好友分为三种:
一度好友:用户的好友
二度好友:用户好友的好友
三度好友:用户好友的好友的好友
要将这三类好友的数量统计出来,如:
一度好友:10
二度好友:300
三度好友:3500
并在地图上标识每一个好友的地理分布,
然后还有将所有好友进行地区排行 ,
又有了新的问题:
做一用户搜索功能,搜索得出列表如下:
用户照片 用户名称 用户的一度好友数量 用户与你的人际距离
A照片 A 90 A->B->C->您
这里的"人际距离关系"是个很头疼的问题!
数据库设计涉及两张表:
用户表:
users
userid username .....
1 A
2 B
3 C
好友表
friends
userid friendid
1 2
1 3
2 1
2 3
3 1
3 2
这里搜索的话,该如何将"人际关系"表现出来呢?
我的想法是把相关的用户分布关系当成一个 "图",
进行广度优先查找:先遍历所有一度好友,二度好友,三度好友;为什么不是深度优先查找呢?打个比方说,我加了好友A\B,A也加了好友B,如果是深度优先的话,有可能搜索到B的关系是:我->A->B,就不是最优路径了..
但是单纯地靠搜索来实现好友关系的展现,搜索一度好友\二度好友还可以满足,三度好友的搜索就不是一个数量级的了...
各位大虾,可有好的解决方案?
如何能更好地实现人际关系距离的搜索?
[b]问题补充:[/b]
是三度以内的,只要查找到3度就可以了..
[b]问题补充:[/b]
A->B->C->您
就是查找到这个长度..
自己的id 1,朋友的id 2
A-B
select aid=1&fid=2
A-B-C A-D-C A-X-C 2表链接
select a1.aid=1&a1.fid=a2.aid&a2.fid=2
A-B-C-D A-C-B-D 3表链接
select a1.aid=1&a1.fid=a2.aid&a2.fid=a3.aid&a3.fid=2
自己实现广度或者深度优先搜索都要取出非常多的结果来计算,直接把这个计算的任务交给数据库去处理,数据库肯定会给出更好的处理方法.
如果你只要取出1条结果的话,可以加个limit语句,这样数据库在处理的时候它就只要找到1条就会返回,速度会快,所以不要取出所有结果,然后程序里面去取一条出来.
不知道你要求的人际关系距离有长度限制吗?无论多远都显示还是说只显示3度以内的?