我的算法看起来像这样:
if condition
O(1) algorithm
else
O(n)
当条件始终为false时,最坏情况运行时为O(n)。然而,在实践中,条件通常是正确的。如何分析此算法的平均运行时复杂度?或者甚至不适用?摊销分析更合适吗?
答案 0 :(得分:3)
该算法渐近 O(n)
,因为随着n
的增长,复杂性也在线性增长。但是,根据O(n)
案例的概率,系数会非常低。
它不能是O(1)
,因为这意味着更改n
不会影响预期的算法时间 - 而且它不是真的。
更新:如果O(n)的情况只发生在一小部分时间内怎么办?
如果false
值预期,即使很少,那么我仍然会说O(n)
。
如果它是某种意外情况,例外情况,那么它可能被称为O(1)
。
例如,如果0.0001%的值为false
,则为O(n)
,因为增加n
仍会增加算法时间。
如果它总是true
,除非存在问题/特殊"错误"输入案例/例外/错误,在好的情况下,你永远不会得到false
,然后是O(1)
。
这就是我的看法,我可能错了:)
答案 1 :(得分:1)
Big-O分析用于描述最坏情况的复杂性,因此该算法的总体大O为O(n)。
您的if条件只是一种优化 - 您可以简单地在分析中说明您希望优化在当时 x%时有效...
答案 2 :(得分:1)
首先,我认为"平凡的复杂性是O(n)"这是一个正确的陈述,因为平均复杂度不应该比最坏情况的复杂性差。
如果您想找到更好的数字,您需要根据平均案例复杂度的定义来定义平均值。它通常与输入的分配有关。一旦你发现条件错误的概率"平均而言#34;你可以找出复杂性。 我建议你看看这个例子。 https://en.wikipedia.org/wiki/Amortized_analysis#Dynamic_Array
如果您告诉我们有关条件/算法的更多信息,也会有所帮助。
事实上,我想也许你想要的不是理论上的复杂性。我想你想要用现实生活数据进行基准/时间分析。
答案 3 :(得分:0)
设x =条件为假的次数。
如果x可以用常数绑定,则算法为O(1)。否则它是O(n)。