C# 查找两个网页之间的最短路径

C# 查找两个网页之间的最短路径,c#,loops,recursive-datastructures,C#,Loops,Recursive Datastructures,我需要找到两个维基百科页面之间的最短距离(在“hops”中) 我有一种方法可以提取页面上的所有内部wiki链接 我知道起始目的地和结束目的地,但我对如何从数据中提取跳数一无所知 到目前为止,我一直在使用链接提取方法来填充字典,其中键是页面上的链接,值是从中删除的页面 如果有人有什么想法,一个好的数据结构将是保存信息,然后如何查看它,我将非常感谢它你知道什么吗?您拥有构建图形所需的数据,但您需要使用来遍历它以找到两点之间的最短路径。也许这有点愚蠢,因为我不是真正的C#程序员,而是一个包含所有内部链

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

我有一种方法可以提取页面上的所有内部wiki链接

我知道起始目的地和结束目的地,但我对如何从数据中提取跳数一无所知

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


如果有人有什么想法,一个好的数据结构将是保存信息,然后如何查看它,我将非常感谢它

你知道什么吗?您拥有构建图形所需的数据,但您需要使用来遍历它以找到两点之间的最短路径。

也许这有点愚蠢,因为我不是真正的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

假设您有一个
IEnumerable页面链接(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;
Link currentpage=“somepage”;
链接destinationPage=“其他页面”;
如果(currentPage==destinationPage)返回0;
int-hops=1;
IEnumerable currentLinks=页面链接(currentPage);
IEnumerable visted=new[]{currentPage};
而(!currentLinks.Contains(destinationPage))
{
currentLinks=currentLinks
.SelectMany(l=>PageLinks(l).Where(f=>!visted.Contains(f));
已访问=已访问的.Union(currentLinks);
啤酒花++;
}
返回啤酒花;

经过编辑以加快循环速度,但如果没有它,算法可能会工作。如果页面没有链接,它可能会一直运行到StackOverflow左右。

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


在这种情况下,您实际上不需要实现Dijikstra的最短路径算法。因为这等于最短路径问题,其中每条边的权重等于1。您只需做一个测试,就可以得到目标页面所在的深度。

这里是Dijkstra算法在python中的一个实现:

是的。或者在这种情况下进行简单的广度优先搜索,因为所有边的权重都是1次单击。@CaptnCraig-是的,我想你是对的。我试图记住我所有的图形算法,我找到了Dijkstra的,所以我停止了寻找;)是的,CaptnCraig已经发表了这个评论-广度优先也可以。非常好。我喜欢使用IEnumerables来包含内存,同时在指数级增长的数据集上循环。但是对于问题中的循环图,难道不需要循环检测吗?此外,如果找不到目的地,您还需要一个终止条件。