【问题标题】:Algorithm Complexity Analysis for Variable Length Queue BFS变长队列BFS的算法复杂度分析
【发布时间】:2016-09-22 04:10:35
【问题描述】:

我开发了一种算法,它是树上 BFS 的一种变体,但它包含一个概率因素。为了检查一个节点是否是我正在寻找的节点,执行了一个统计测试(我不会对此进行太多详细说明)。如果测试结果是肯定的,则将该节点添加到另一个队列(称为tested)。但是当一个节点测试失败时,tested 中的节点需要重新测试,所以这个队列被附加到有待测试节点的队列中。

在 Python 中,考虑到队列 @9​​87654323@ 从根节点开始:

...
tested = []
while q:
    curr = q.pop(0)
    p = statistical_test(curr)
    if p:
        tested.append(curr)
    else:
        q.extend(curr.children())
        q.extend(tested)
        tested = []
return tested

由于算法是概率性的,搜索后可能会有多个节点位于tested,但这是意料之中的。我面临的问题是试图估计这个算法的复杂性,因为我不能简单地使用 BFS 的复杂性,因为 qtested 的长度是可变的。

我不需要一个封闭的和明确的答案。我需要一些关于如何处理这种情况的见解。

【问题讨论】:

  • 在最坏的情况下程序永远不会终止。
  • 队列的大小无关紧要;问题是统计部分的错误率是多少
  • 如何不终止?除非测试可以为相同的输入给出不同的结果,否则我看不出它是如何终止的。
  • statistical_test 与这里的时间复杂度计算非常相关,因此在不知道这一点的情况下实际上不可能做任何事情。阅读随机算法以及如何计算它们的时间复杂度。这会给你一些方向。
  • 如果测试不能给出不同的结果,那么将成功的测试放回队列重新测试似乎没有任何意义。

标签: python algorithm time-complexity analysis


【解决方案1】:

最坏的情况是以下过程:

  1. 所有元素 1 : n-1 通过测试并附加到 tested 队列中。
  2. 元素 n 未通过测试,从 q 中删除,tested 中的 n-1 个元素被推回 q
  3. 返回第 1 步 n = n-1

这是一个经典的 O(n2) 过程。

【讨论】:

  • 您假设队列已使用所有元素进行初始化。如果队列仅使用根节点进行初始化(如在经典 BFS 中),则算法会在第一个节点通过测试后立即返回。
  • @Munir - 这是最坏情况分析的重点。 “最好的情况”是无关紧要的。
  • 我质疑你的假设,即队列是用所有元素初始化的,而不是你的分析。 OP 没有提到在循环开始时队列是如何设置的,我们不应该假设。
  • @Munir - 再一次,没关系。该方法是分析最坏的情况。我声称这是当所有元素都在队列中并且我描述的过程正在发生时。然后我证明了复杂性。这就是它的工作原理。
  • 在这种情况下,算法将一棵树作为输入,并从它的根开始设置一个队列。队列不是输入,而是过程中的一个步骤 最坏的情况应该基于树而不是队列。 OP 没有明确说明队列是如何从树中创建的,因此我觉得做出这种假设是不公平的。我知道最坏的情况是基于输入的最坏情况,但这里的输入是一棵树,而不是一个队列,就像经典 BFS 的输入是一个图,而不是一个队列。队列是实现的一部分,而不是输入。
猜你喜欢
  • 2021-04-22
  • 2020-12-30
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多