小世界理论的实施 - 就像XING一样

时间:2009-07-25 06:29:06

标签: algorithm web-applications

有些人可能不知道XING是什么:它是一个在线网络社区,如linkedIn等。您可以添加新联系人,管理这些联系人,搜索新的等。

整个应用程序是在Ruby中完成的,并且受到小世界理论的启发,至少可以这么说。

有一个特定的功能,我真的无法想象它是如何完成的。如果您搜索某个人Z(不在您的联系人列表中),并且您单击Z的个人资料,则会显示从您到人Z的所有可能连接。例如:

  • - >人B - >人C - >人E - > 人Z
  • - >人M - >人N - >我I - > 人Z
  • - >人M - >人K - >人J - > 人Z

特别是如果你有很多联系人,也有很多可能的联系。应用程序很快!

所以,我的问题是:如何实现这样的功能?它背后是什么样的系统/数据库?我只是在标准的RDMBS(如mySQL和MSSQL服务器)方面经验丰富,我真的无法想象如何在标准数据库系统中执行上述操作。

是否有任何算法可以帮助计算可能的关系?目前我正在阅读一本关于算法的有趣书籍,比如计算两件事的相似性等等。所以“小世界理论的实现”对我来说非常有趣。

提前感谢任何提示。

3 个答案:

答案 0 :(得分:1)

这可能是预先缓存您可能点击的人的一些组合,并结合任何各种最小生成树算法。例如,您可以查看Kruskal的算法(http://en.wikipedia.org/wiki/Kruskal%27s_algorithm)。它没有你所描述的那种行为,但对于你对两个人之间的连接强度有所了解的加权树有用。

有关更多常规信息,请查看生成树的信息: http://en.wikipedia.org/wiki/Minimum_spanning_tree

更一般地说,请阅读Goodrich和Tomassia的“Java中的数据结构和算法”第13章(关于图表)。

答案 1 :(得分:1)

我不得不说它主要是预先缓存的数据和关系。正如Paul所提到的,最小生成树算法也起着重要作用。但就大规模应用程序速度而言,缓存是很好的。

答案 2 :(得分:1)

除了缓存特定结果之外,缓存本身并不真正起作用 - 找到两个节点A和B之间的最短路径相当于找到A和其他每个节点之间的最短路径的成本N这样| AB | < = | AN |。

他们这样做的最可能方式是将整个社交图加载到内存中,并根据需要执行Dijkstra算法,以找到从您到目标的所有最短路径。虽然这在原则上不是缩放的,但实际上社交图的大小和存储器访问的速度使得在非常短的时间内计算它是可行的。当然,将它存储在磁盘上会使这完全不切实际。