我需要找到两个维基百科页面之间的最短距离(“跳”)
我有一个方法来提取页面上的所有内部wiki链接
我知道起始目的地和结束目的地,但我对如何从数据中提取跳数感到茫然
到目前为止,我一直在使用链接提取方法来填充字典,其中键是页面上的链接,值是从中删除的页面。
如果有人有任何想法,一个好的数据结构将保存信息,然后如何浏览它我会非常感激
答案 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并获得目标页面所在的深度。