我试图找到二进制计数器的平均时间复杂度,而不是摊销分析。由于我对时间复杂度分析技能不完全有信心,我想确认下面提供的伪代码的平均案例分析是正确的。
让 k 为数组的长度。
Increment(Array)
i = 0
while i < k and Array[i] == 1
Array[i] = o
i = i + 1
if i < k
Array[i] = 1
为了找到平均花费的时间,我发现每次运行时平均翻转的位数。结果,我发现这是 O(2 + k /(2 ^ k)),对于大 k <等于 O(1) / em>的。
这是正确的平均案例运行时间吗?如果没有,我将如何开始解决这个问题?
答案 0 :(得分:1)
我假设每个输入都有相同的概率发生
这意味着每个位的开启或关闭概率为1/2。
geometric distribution是复杂性的相关分布:你翻转硬币,并在第一个尾部结果上结束实验(没有什么可以进一步携带)。
这里的几何分布的平均值恰好是2(参见上面的链接,或者从基本原理推导出来),因此平均复杂度确实是 O(1)。