Python 变长队列BFS算法复杂性分析
我开发了一种算法,它是树上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(
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的输入是一个图,而不是一个队列。队列是实现的一部分,而不是输入。