如果我有一个算法,由三个子算法组成,每个子算法的O()特征都不同,例如:
- 算法A:O(n) - 算法B:O(log(n)) - 算法C:O(n log(n))
如何理论上估计整个算法的O()?即不进行任何实际测量或操作。
是否有一个公式或流程是众所周知的?
- 算法A:O(n) - 算法B:O(log(n)) - 算法C:O(n log(n))
如何理论上估计整个算法的O()?即不进行任何实际测量或操作。
是否有一个公式或流程是众所周知的?
O(n*log(n))
。
O(f(n))的定义是从某个数字(某个n0)开始,存在一个常数“Const”,其中输入大小为n的操作总数小于Const*f(n)
。(n*logn)
(logn)
的项(5+3)*n*logn
操作,因此它是O(n*logn)
。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) 算法可能会在 O(n/2) 的时间内完成,但它仍然是一个 O(n) 算法。
如果你有一个需要在数据集上完成三个子进程才能退出的函数,则最慢的子进程在该数据集上的运行时间将成为帐篷中最长的杆子。在给定的具体示例中,函数(“算法”)的运行时间为 O(n),我们不必担心它是否是 O(n + n*log(n) + log(n));这个总和与 O(n) 之间的差异最多只有两倍。我们关心的是相对大小,即运行时间是否为 log(n)、(n) 或 (n^2) 或 (n^3) 等。我们关心的是 10、100 或 1000 倍数。