我正在尝试编写一个在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
答案 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