algorithm - 摊销和平均运行时复杂度

标签 algorithm time-complexity average amortized-analysis

<分区>

这不是作业,我正在研究摊销分析。有些事情让我感到困惑。我无法完全理解摊销和平均复杂性之间的含义。不确定这是对还是错。这是一个问题:

--

我们知道程序的运行时复杂度取决于程序的输入组合——假设程序运行时复杂度为 O(n) 的概率为 p,其中 p << 1,而在其他情况下(即对于(1-p)可能的情况),运行时复杂度为 O(logn)。如果我们用 K 种不同的输入组合运行程序,其中 K 是一个非常大的数字,我们可以说这个程序的平均运行时间复杂度是:

--

第一个问题是:我在这里阅读了问题:Difference between average case and amortized analysis

因此,我认为平均运行时复杂度没有答案。因为我们不知道平均输入是多少。但是好像是p*O(n)+(1-p)*O(logn)。哪个是正确的,为什么?

其次,摊销部分。我读过Constant Amortized Time并且我们已经知道,摊销分析与平均情况分析的不同之处在于不涉及概率;摊销分析保证了最坏情况下每个操作的平均性能。

我能说分摊运行时间是 O(n) 吗?但答案是 O(pn)。我对为什么涉及概率有点困惑。虽然O(n)=O(pn),但是我实在想不通为什么p会出现在那里?我改变思维方式。假设我们确实丢失了一些时间,然后 K 变得非常大,所以摊销运行时间为 (KpO(n)+K*(1-p)O(logn))/k = O (pn)。这似乎与平均情况相同。

抱歉造成混淆,请帮助我,先谢谢了!

最佳答案

对于“平均”或“预期”的复杂性,您是在对问题的概率分布做出假设。如果您不走运(或者如果您的问题生成器恶意地无法匹配您的假设 8^),所有您的操作将非常昂贵,并且您的程序可能花费比您预期更长的时间。

摊销复杂性是保证任何操作序列的总成本。这意味着,无论您的问题生成器多么恶意,您都不必担心一系列操作所花费的时间比您预期的要长得多。

(根据算法的不同,不小心遇到最坏的情况并不难。典型的例子是朴素的快速排序,它在大部分排序的输入上表现非常糟糕,尽管“平均”情况很快)

关于algorithm - 摊销和平均运行时复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21420341/

相关文章:

java - 计算复杂度时是: does a[0] + a[1] result in two array accesses,还是只有一个?

mysql - 如何每天获取平均行数?

c++ - 如何在 C++ 中仅读取文本文件中的数字

c++ - 无法弄清楚为什么我的 if 语句不起作用 : ( if array[i] << average)

string - 如何减少内存使用,搜索序列中的第 k 个字符?

python - 将值插入排序数组

c - 需要帮助验证这种复杂性

c# - 在 C# 中以编程方式生成决策表?

string - 如何在 XML/HTML 中查找重复元素的结构

algorithm - 如何找到算法的时间复杂度?