繁体   English   中英

在Graph上搜索顶点的最佳和最简单的算法?

[英]Best and easiest algorithm to search for a vertex on a Graph?

在为我的Graph实现实现了大多数常见和所需的函数之后,我意识到一些函数(删除顶点,搜索顶点和获取顶点)没有“最佳”实现。

我正在使用带有链接列表的邻接列表来实现我的Graph实现,我正在搜索一个顶点,直到找到我想要的那个顶点。 就像我说的,我意识到我没有使用“最佳”实现。 我可以有10000个顶点并且需要搜索最后一个顶点,但是该顶点可以链接到第一个顶点,这会大大加快速度。 但这只是一个假设的案例,可能会也可能不会发生。

那么,您推荐哪种算法用于搜索查找? 我们的老师主要讨论广度优先和深度优先(和Dikjstra'算法,但这是一个完全不同的主题)。 在这两者之间,你推荐哪一个?

如果我能够实现这两者,那将是完美的,但我没有时间,我需要拿起一个并实施它,第一阶段的截止日期临近......

我的猜测是,采用深度优先,似乎更容易实现,并看他们的工作方式,这似乎是一个最好的选择。 但这实际上取决于输入。

但你们有什么建议?

如果你有一个邻接列表,搜索顶点只是意味着遍历该列表。 您甚至可以命令列表减少所需的查找操作。

从性能的角度来看,图遍历(例如DFS或BFS)不会改善这种情况。

在图中查找和删除节点是一个“搜索”问题,而不是图形问题,因此为了使其优于O(n)=线性搜索,BFS,DFS,您需要将节点存储在针对搜索优化的不同数据结构中或者排序他们。 这为查找和删除操作提供了O(log n)。 Candidatas是树状结构,如b树或哈希表。 如果你想自己编写代码,我会去一个哈希表,它通常会提供非常好的性能并且相当容易实现。

我认为BFS通常会比平均水平更快。 阅读DFSBFS的Wiki页面。

我说BFS更快的原因是因为它具有以距离起始节点的距离顺序到达节点的属性。 因此,如果您的图表有N节点,并且您想要搜索节点N和节点1 (即您启动搜索表单的节点),则链接到N ,那么您将立即找到它。 但是,在此之前,DFS可能会扩展整个图形。 如果幸运的话,DFS只会更快,而如果你搜索的节点接近你的起始节点,BFS会更快。 简而言之,他们都依赖于输入,但我会选择BFS。

DFS在没有递归的情况下也更难编码,这使得BFS在实践中更快一些,因为它是一种迭代算法。

如果您可以规范化节点(将它们从1到10 000并按数字访问它们),那么Exists[i] = true if node i is in the graph and false otherwise ,则可以轻松保持Exists[i] = true if node i is in the graph and false otherwiseExists[i] = true if node i is in the graph and false otherwise ,给出O(1)查找时间。 否则,如果无法进行规范化或者您不想这样做,请考虑使用哈希表

深度优先搜索是最好的,因为

  1. 它使用的内存要少得多
  2. 更容易实施

深度优先和广度优先算法几乎相同,除了在一个(DFS)中使用堆栈,在另一个(BFS)中使用一个队列,以及一些必需的成员变量。 实施它们不应该花费你太多的时间。

此外,如果你有一个顶点的邻接列表,那么无论如何你的查找都是O(V)。 通过使用其他两个搜索中的一个,将获得很少甚至没有。

我会对Konrad的帖子发表评论,但我还不能发表评论......我想说的是,如果你通过列表​​中的简单线性搜索实现DFS或BFS,它对性能没有任何影响。 您在图中搜索特定节点并不依赖于图的结构,因此没有必要将自己局限于图算法。 在编码时间方面,线性搜索是最佳选择; 如果你想提高你的图算法技能,可以实现DFS或BFS,无论你想要什么。

如果您正在搜索特定的顶点并在找到它时终止,我建议使用A * ,这是最好的搜索。

这个想法是你计算从源顶点到你正在处理的当前顶点的距离,然后“猜测”从当前顶点到目标的距离。

从源头开始,计算距离(0)加上猜测(无论可能是什么),并将其添加到优先级队列,其中优先级为距离+猜测。 在每一步中,删除距离最小+猜测的元素,对其邻接列表中的每个顶点进行计算,并将其粘贴在优先级队列中。 找到目标顶点时停止。

如果您的启发式(您的“猜测”)是可接受的,也就是说,如果它总是低估,那么您可以保证在您第一次访问目标顶点时找到到目标顶点的最短路径。 如果您的启发式不可接受,那么您必须运行算法才能找到最短路径(尽管听起来您并不关心最短路径,只是任何路径)。

它实现起来并不比广度优先搜索更难(你只需要添加启发式算法),但它可能会产生更快的结果。 唯一困难的部分是弄清楚你的启发式。 对于表示地理位置的顶点,常见的启发式方法是使用“as-the-crow-flies”(直接距离)启发式算法。

线性搜索比BFS和DFS更快。 但比线性搜索更快的是A *,步长成本设置为零。 当步长为零时,A *将仅扩展最接近目标节点的节点。 如果步长为零,则每个节点的路径开销为零,并且A *不会优先考虑具有较短路径的节点。 这就是你想要的,因为你不需要最短的路径。

A *比线性搜索更快,因为线性搜索很可能在O(n / 2)次迭代后完成(每个节点具有成为目标节点的相等机会)但A *优先考虑具有更高机会成为目标节点的节点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM