Algorithm 如何添加/合并多个大O';它合为一

Algorithm 如何添加/合并多个大O';它合为一,algorithm,big-o,estimation,Algorithm,Big O,Estimation,如果我有一个由(比方说)三个子算法组成的算法,它们都具有不同的O()特征,例如: 算法A:O(n) 算法B:O(log(n)) 算法C:O(n log(n)) 如何从理论上估计整个算法的O()?即,不计时或进行任何其他实际测量 是否有一个众所周知的公式或程序?在所有子算法中,“总”复杂度是最糟糕的情况。在您的示例中:O(n*log(n)) 从某个数字(某些n0)开始,有一个常数“Const”,其中大小为n的输入上的操作总数小于Const*f(n) 因此,如果您有一组子算法,那么复杂度将始终小

如果我有一个由(比方说)三个子算法组成的算法,它们都具有不同的O()特征,例如:

  • 算法A:O(n)
  • 算法B:O(log(n))
  • 算法C:O(n log(n))
如何从理论上估计整个算法的O()?即,不计时或进行任何其他实际测量

是否有一个众所周知的公式或程序?

在所有子算法中,“总”复杂度是最糟糕的情况。在您的示例中:
O(n*log(n))

从某个数字(某些n0)开始,有一个常数“Const”,其中大小为n的输入上的操作总数小于
Const*f(n)

因此,如果您有一组子算法,那么复杂度将始终小于所有常量(常量1+常量2+…)乘以最差复杂度函数的Sigma(例如,从“n”、“n*logn”到“n^2”,它将是n^2)。根据复杂性的定义,它是这个群体中最糟糕的复杂性

例如:

  • 假设我们正在对数组进行排序
    (n*logn)
  • 查找键高于x的项目
    (logn)
  • 假设排序的常量1为5(意味着我们可以在少于5*n*logn的操作中对n个项目的列表进行排序),常量2为3(意味着我们可以在少于3*logn的操作中找到元素)

    在这种情况下,很明显,两种算法的动作总数都小于
    (5+3)*n*logn
    动作,因此它
    O(n*logn)

    是否有一个众所周知的公式或程序

    因为那是基础数学,是的。但在你的例子中更简单:因为所有这些都给出了一个上界,你只需取所有上界的最大值就可以得到总上界

    –前提是所有这些算法都是链接的(而不是嵌套的)。如果算法是嵌套的,则需要乘以它们的上界(在最简单的情况下)

    为了举例说明,假设您有一个容器数据结构,查找单个元素的成本为O(logn)。您还有一个算法需要这样的查找,但其运行时间为O(n),假设查找的成本不变,并且在输入上使用单个循环,每个循环的查找次数不变


    现在,如果您想在该算法中使用前面提到的容器数据结构,那么它的查找运行时显然会替换(假定的)常量时间查找。所以我们得到了相同的循环,但是它的每一次迭代现在都需要O(logn)而不是常数时间O(1),所以整个运行时间变成O(nlogn)。

    关于O(n)算法效率估计的一个假设是,我们的实际运行时间接近理论值。因此,我们不应该太过纠结于车轴,试图找出微小的差异。例如,如果我们通过未排序的数据集进行简单的迭代搜索(平均来说,我们会在中间点找到值),那么O(n)算法可能会在O(n/2)时间内完成,但它仍然是一个O(n)算法


    如果有一个函数必须在数据集上完成三个子进程才能退出,那么该数据集上最慢的子进程的运行时间将是帐篷中最长的极点。在给出的具体示例中,函数('algorithm')在O(n)时间内运行,我们不担心它是否为O(n+n*log(n)+log(n));该和与O(n)之间的差值最多为2倍。我们关心的是相对大小,即运行时间是log(n),还是(n)或(n^2)或(n^3)无限大。我们关心的是10、100或1000的系数

    问题的复杂性取决于“n”趋于无穷大的条件。这一联系从根本上解释了为什么所有复杂性较低的O(n)数都被丢弃;甚至O(n)格式也会删除其他多项式项,这些多项式项会在不同的硬件上发生变化。合理地说,如果您有函数的时间,您可以添加各种总时间。在依赖于时间的环境中,这可能是有意义的数据,例如处理大型数据集,其中调用的函数被多次调用。这还可以提供解决方案的可伸缩性和服务器升级的性能峰值。这将是一个单机解决方案,系数也不会下降

    所有机器在执行基于体系结构和编译器如何生成二进制代码的任何功能时都会有不同的运行系数。这意味着,如果您为多个用户设计程序,并且他们在不同的计算机上,那么具体的计算不仅无关,而且也不准确

    如果计算结果并非无关或不准确:

    分离结构的诀窍是一个结构的时间函数不是所有其他结构的时间函数

    O(n) = x + y + z, 
    x(n) = (t1) * (n^2)
    y(n) = (t2) * (log n) 
    z(n) = (t3) * (n log n) 
    


    时间(t1)、(t2)和(t3)作为特定机器上函数的时间给出。

    如何将例如O(n)与O(n log(n))相乘?@R.a.:通过将指定边界的函数相乘,即结果将是O(n^2 log n)。这将取决于算法相对于彼此运行的次数是否相同,或者,如果存在乘法效应,在这种情况下,你必须将它们相乘。@Joe,你是对的,这种分析与顺序运行相关,而不是嵌套运行,我希望这是一个问题:)如果某些算法运行不止一次,只要次数不变且不依赖于n,结果就会保持不变。将性能最差的部分作为整体性能是否有意义?只是一个警告,以确保“n”在每个算法中指代相同的内容,否则你就要完蛋了。