将二次算法简化为线性时间

时间:2015-10-15 03:19:58

标签: algorithm runtime pseudocode

我正在尝试编写一个在O(n)时间内运行的算法。本质上,它采用整数n并将和乘以系数。但是,我写这个算法的第一次尝试是在O(n ^ 2)时间内运行。 (见下文。)有什么方法可以减少运行时间吗?

for i = 1 to n
    num1 = i/n
    num2 = 0
    for j = i to n-1
        num2 = num2 + 1/j
    result[i] = num1 * num2

1 个答案:

答案 0 :(得分:2)

您当前的方法是在二次时间内运行,因为对于序列1..n中的每个元素,您再次迭代序列。您可以通过意识到只需要计算num2求和一次来删除额外的工作。在此之后,它可以重复使用。

num2 = 0
for j = 1 to n-1
    num2 = num2 + 1/j

for i = 1 to n
    num1 = i/n
    if (i > 1)
        num2 = num2 - 1/(i-1)   // reuse the summation by subtracting
    result[i] = num1 * num2     // off the portion you don't want for this value of i