如果列表按O(n)运行排序,函数sorted
将返回True,您将如何描述此类运行时间:
def sort(l):
while not sorted(l): random.shuffle(l)
假设洗牌是完全随机的。
这是用big-O表示法写的吗?或者是否有其他方法使用随机组件对算法进行分类?
答案 0 :(得分:6)
信不信由你,这里有一个wiki条目: http://en.wikipedia.org/wiki/Bogosort
平均情况:O(N * N!)
答案 1 :(得分:6)
此算法称为Bogosort。它是一类名为Las Vegas Algorithms的算法实例。拉斯维加斯算法Randomized Algorithms始终保证正确的结果,但不保证计算资源。
Bogosort的时间复杂性不能直接用Bachmann-Landau Notation来表达,因为它具有概率性质。但是,我们可以对其expected时间复杂度做出声明。 Bogosort的预期时间复杂度为O(n·n!)
。
答案 2 :(得分:2)
平均情况确实是O(N N!):
观察到确切的N! N元素的排列。选择正确的概率恰好是1 / N!因此,通过强大的大数定律,预期的洗牌次数为N!。
其他因素N来自哪里?您必须在每个步骤检查您选择的排列。这可以线性地完成,比较相邻元素。因此,额外的因素N。
上述评论表明O(g(n))表示法是“最坏情况”:
1)那不是真的。 O(g(n))的定义是: 如果存在一些c,d,则f(n)是O(g(n)),使得f(n)<对于足够大的n,c * g(n)+ d。 “最糟糕的情况”并没有什么。碰巧g(n)是一个比f(n)更大的函数,但纯粹的数学定义没有说明“case”。
2)对于随机算法,无论如何都要进行“最坏情况”分析是没有意义的。你可以提出一些非常糟糕的执行。
3)真正糟糕的执行发生在一组测量0上(概率论者会说他们“几乎肯定”不会发生)。他们实际上是不可能观察到的。
答案 3 :(得分:0)
Big-O表示法假定最坏的情况。在最坏的情况下,该算法永远不会终止。