找到两个网页之间的最短路径

时间:2009-12-14 17:02:35

标签: c# loops recursive-datastructures

我需要找到两个维基百科页面之间的最短距离(“跳”)

我有一个方法来提取页面上的所有内部wiki链接

我知道起始目的地和结束目的地,但我对如何从数据中提取跳数感到茫然

到目前为止,我一直在使用链接提取方法来填充字典,其中键是页面上的链接,值是从中删除的页面。

如果有人有任何想法,一个好的数据结构将保存信息,然后如何浏览它我会非常感激

5 个答案:

答案 0 :(得分:6)

你对graph theory有什么了解吗?您拥有构建图表所需的数据,但您需要使用Dijkstra's algorithm遍历它以找到两点之间的最短路径。

答案 1 :(得分:2)

也许它有点愚蠢,因为我不是一个真正的C#程序员,而是一个包含里面所有链接的多维数组,根据维度的深度,让你知道哪种方式包含更少的箍。

这只是一个想法,虽然这在理论上肯定是可行的,因为阵列可以拥有的维度数量没有语言限制,我很确定它真的会耗尽内存!

这样的事情:

[source] -> [source link] -> ['source link' link] -> etc
         -> [source link] -> ['source link' link] -> etc
         -> [source link] -> ['source link' link] -> etc
         -> [source link] -> ['source link' link] -> [target]
         -> [source link] -> ['source link' link] -> etc

答案 2 :(得分:1)

假设您有IEnumerable<Link> PageLinks(Link link)

跳数将通过以下方式解决:

Link curentPage = "somepage";
Link destinationPage = "otherpage";
if (currentPage == destinationPage) return 0;
int hops = 1;
IEnumerable<Link> currentLinks = PageLinks(currentPage);
IEnumerable<Link> visited = new [] {currentPage};
while(!currentLinks.Contains(destinationPage)) 
{
    currentLinks = currentLinks
        .SelectMany(l => PageLinks(l).Where(f => !visited.Contains(f)));
    visited = visited.Union(currentLinks);
    hops++;
}
return hops;

编辑为了更快地骑自行车,虽然算法没有它可以工作。如果页面没有链接,它可能会一直运行到StackOverflow。

答案 3 :(得分:1)

以下是python中Dijkstra算法的实现:http://code.activestate.com/recipes/119466/

答案 4 :(得分:0)

我认为在这种情况下图表很稀疏。因此,对每个维基百科页面使用HashSet之类的东西可能是一个好主意,其中的页面链接到集合内部。

在这种情况下,你真的不需要实现Dijikstra的最短路径算法。因为这等于最短路径问题,其中每条边的权重等于1.您可以只做一个Breadth-first search并获得目标页面所在的深度。