Python 变长队列BFS算法复杂性分析

Python 变长队列BFS算法复杂性分析,python,algorithm,time-complexity,analysis,Python,Algorithm,Time Complexity,Analysis,我开发了一种算法,它是树上BFS的一种变体,但它包含了一个概率因子。为了检查某个节点是否是我要查找的节点,将执行一个统计测试(我不会详细介绍这个)。如果测试结果为肯定,则将节点添加到另一个队列(称为tested)。但是,当某个节点测试失败时,需要再次测试已测试的中的节点,因此此队列将附加到具有待测试节点的队列中 在Python中,考虑到队列q从根节点开始: ... tested = [] while q: curr = q.pop(0) p = statistical_test(

我开发了一种算法,它是树上BFS的一种变体,但它包含了一个概率因子。为了检查某个节点是否是我要查找的节点,将执行一个统计测试(我不会详细介绍这个)。如果测试结果为肯定,则将节点添加到另一个队列(称为
tested
)。但是,当某个节点测试失败时,需要再次测试
已测试的
中的节点,因此此队列将附加到具有待测试节点的队列中

在Python中,考虑到队列
q
从根节点开始:

...
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
由于算法是概率性的,搜索后可能有多个节点处于
测试状态
,但这是意料之中的。我面临的问题是试图估计该算法的复杂性,因为我不能简单地使用BFS的复杂性,因为
q
tested
将具有可变长度


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

最坏的情况是以下过程:

  • 所有元素1:n-1都通过了测试,并被附加到
    测试的队列中
  • 元素n未通过测试,从
    q
    中删除,而
    测试的
    中的n-1个元素被推回
    q
  • 返回步骤1,n=n-1

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

    最坏的情况是以下过程:

  • 所有元素1:n-1都通过了测试,并被附加到
    测试的队列中
  • 元素n未通过测试,从
    q
    中删除,而
    测试的
    中的n-1个元素被推回
    q
  • 返回步骤1,n=n-1


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

    在最坏的情况下,程序永远不会终止。队列的大小无关;问题是统计部分的错误率是多少?它如何不终止?除非测试可以对相同的输入给出不同的结果,否则我不知道它如何不会终止。
    statistical_test
    与这里的时间复杂度计算非常相关,因此在不知道的情况下不可能做任何事情。阅读随机算法及其时间复杂度的计算方法。这会给你一些指导。如果测试不能给出不同的结果,那么将成功的测试放回队列重新测试似乎没有任何意义。在最坏的情况下,程序永远不会终止。队列的大小无关;问题是统计部分的错误率是多少?它如何不终止?除非测试可以对相同的输入给出不同的结果,否则我不知道它如何不会终止。
    statistical_test
    与这里的时间复杂度计算非常相关,因此在不知道的情况下不可能做任何事情。阅读随机算法及其时间复杂度的计算方法。这将为您提供一些指导。如果测试不能给出不同的结果,那么将成功的测试放回队列以重新测试似乎没有任何意义。您假设队列已使用所有元素初始化。如果队列仅使用根节点初始化(如经典BFS中的根节点),则算法会在第一个节点通过测试后立即返回。@Munir-这是最坏情况分析的要点。“最佳情况”是不相关的。我质疑你的假设,即队列是用所有元素初始化的,而不是你的分析。OP没有提到队列在循环开始时是如何设置的,我们不应该假设它。@Munir-再一次,这不重要。方法是分析最坏的情况。我声称这是当所有元素都在队列中并且我描述的过程正在进行时。然后我证明了复杂性。这就是它的工作原理。在本例中,算法将树作为输入,并从根开始设置队列。队列不是输入,而是过程中的一个步骤最坏的情况应该基于树而不是队列。OP没有明确说明队列是如何从树中创建的,因此我觉得做出这样的假设是不公平的。我知道最坏情况是基于输入的最坏情况,但这里的输入是一棵树,而不是一个队列,就像经典BFS的输入是一个图,而不是一个队列。队列是实现的一部分,而不是输入。您假设队列是用所有元素初始化的。如果队列仅使用根节点初始化(如经典BFS中的根节点),则算法会在第一个节点通过测试后立即返回。@Munir-这是最坏情况分析的要点。“最佳情况”是不相关的。我质疑你的假设,即队列是用所有元素初始化的,而不是你的分析。OP没有提到队列在循环开始时是如何设置的,我们不应该假设它。@Munir-再一次,这不重要。方法是分析最坏的情况。我声称这是当所有元素都在队列中并且我描述的过程正在进行时。然后我证明了复杂性。这就是它的工作原理。在本例中,算法将树作为输入,并从根开始设置队列。队列不是输入,而是过程中的一个步骤最坏的情况应该基于树而不是队列。OP没有明确说明队列是如何从树中创建的,因此我觉得做出这样的假设是不公平的。我知道最坏情况是基于输入的最坏情况,但这里的输入是一棵树,而不是一个队列,就像经典BFS的输入是一个图,而不是一个队列。队列是实现的一部分,而不是输入。