Time complexity 迭代算法的时间复杂度

Time complexity 迭代算法的时间复杂度,time-complexity,big-o,Time Complexity,Big O,我有一个迭代算法,在每次迭代中,计算量逐渐减少。以下是我的算法的示例: 输入大小:n和总迭代次数=k iter 1: time taken -> f1 * n iter 2: time taken -> f2 * n iter 3: time taken -> f3 * n ... iter k: time taken -> fk * n 其中f1>f2>f3>…>fk和0编辑 更具体地说: 如果示例的分母: iter 1: input size = n (always

我有一个迭代算法,在每次迭代中,计算量逐渐减少。以下是我的算法的示例:

输入大小:n
总迭代次数=k

iter 1: time taken -> f1 * n
iter 2: time taken -> f2 * n
iter 3: time taken -> f3 * n
...
iter k: time taken -> fk * n
其中
f1>f2>f3>…>fk
0编辑

更具体地说:

如果示例的分母:

iter 1: input size = n (always n)
iter 2: input size = n/2 (can change)
iter 3: input size = n/5 (can change)
iter 4: input size = n/8 (can change)
...
iter k: input size = n/10 (can change)
都是严格整数,那么它就是O(n*logk)

原因如下。对于序列XnO(Yn),必须存在一些M(实数)和M(整数),这样XnM

现在考虑序列k= { 1, 1/2, 1/3,…1/k}。还考虑序列n={ 1, 2, 3,4…}。

现在让我们假设Yn=N^t*K(这是N和K的左外积)。无论fi的值如何,此序列Yn始终大于您的序列


所以Xn<1*| Yn |,其中Yn是谐波级数乘以n。正如阿米特指出的,Yn属于O(n*logk),Xn也是如此。由于我们不能将Xn的边界再靠近上面,我们对Xn的最佳极限近似也是O(n*logk)给定的信息是不够的,我们所能确定的是复杂性是
O((f1+…+fk)*n)
1

为什么?我将用一个例子说明
fi
的两种情况-每种情况的复杂性不同:

案例1:
fi=1/2^i

在这种情况下,我们得到
n*1/2+n*1/4+…+n*1/2^k
,算法为
O(n)

案例2:
fi=1/i

在这种情况下,我们得到一个:
n*1/2+n*1/3+…+n*1/k=n(1/2+1/3+…+1/k)=O(nlogk)

编辑: 根据您的评论和编辑,算法按所述运行的最坏情况(如果我正确理解您的话)似乎是:

如果确实是这种情况,它与所描述的案例2匹配,则总运行时间为:
n+n/2+n/3+..+n/k=n(1+1/2+1/3+…+1/k)
,即
O(nlogk)



(1) 严格地说,从数学上讲,大O是一个渐近上界,而且由于
fi否,我试图改进“最远点选择”算法(Teofilo F.GONZALEZ(1985)),该算法的时间复杂度为
big-O(kn)
问题:fi依赖于n还是k?fi依赖于
n
。我为这个问题补充了更多的信息。谢谢。分母总是整数,还是可以是实数?让我们看看fk不是常数,这很重要,如果
f1,…,fk
具有zeno属性?(考虑
fk=1/2^k
)只要它们不依赖于k或n,就不重要了。Lol不管在O(kn)中是什么。可能有更好的限制行为(没有),但显然是O(kn)。在你的证明中:对于整数分母的最坏情况,我们不能约束得更紧,因为谐波序列到
k
的部分和大于
log k
。但正如阿米特在开始时所说,如果f_k
下降得足够快,那么我们可能会得到一个更好的界限。在序列为
1、1/2、1/4、1/8、
的情况下,整体操作为
O(n)
。发问者说,每一步的改进都是“未知的”,但这可能意味着他不知道而不是不知道,因此它实际上可能比
O(n log k)
更好。正如你所说,根据所提供的信息,我们再也不能证明得更好了:——)@SteveJessop我在结尾时挥了挥手,因为打字比在纸上写校样更难。然而,“未知”和“不可知”之间的区别在这里并不重要。为什么会这样?OP询问了序列1/1、1/f2、1/f3。。。。1/fk,这是非随机的。它们不是随机变量,也不是不确定的。未具体说明。未指定的参数与未知参数不同。我的证明是任何f1,f2。。。fk,其中f1>f2>f3>fk和0
iter 1: input size = n (always n)
iter 2: input size = n/2 (can change)
iter 3: input size = n/5 (can change)
iter 4: input size = n/8 (can change)
...
iter k: input size = n/10 (can change)
iter1 -> n ops
iter2 -> n/2 ops
iter3 -> n/3 ops
...
iterk -> n/k ops