嵌套时间更快的替代方法

时间:2019-12-07 18:18:51

标签: python algorithm time-complexity

我需要计算/从中形成的可能整数列表

i + 2j + k ,其中1 <= i,j,k <= N。

我知道这将是从4到4N的所有整数,但是我也需要它们的频率,因此必须制定一个列表。我也找不到频率的模式。我的暴力手段是:

对于n = 2,列表将类似于:[4,5,6,5,7,6,7,8]

for i in range(N+1):
  for j in range(N+1):
     for k in range(N+1):
         #creating a list

还有其他模式吗?就像如果i + 2j + k = P, P的频率= P形式的某些方程。据我尝试,没有发现任何线性或二次方程。

它的复杂度是O ^ 3,所以我需要一个更好的版本/替代版本。我愿意接受想法。然后请问您是否不懂。

1 个答案:

答案 0 :(得分:0)

由于noboding正在发布线性解决方案(我确定有一个线性解决方案),因此我将发布一个二次解:

def ways(n,N):
    s=0
    s1 = 0
    s2 = 0


    for j in range(1,N+1):
        if n - 2*j < 2:
            break
        if n - 2*j > 2*N:
            continue
        s1+= min(n-2*j - 1,N) +1
        s2+= max(n-2*j-N, 1)

    return s1 - s2


N=2
print({ i: ways(i,N) for i in range(4, 4*N+1) })

输出:

{4: 1, 5: 2, 6: 2, 7: 2, 8: 1}

至少从O(N ^ 3)改进为O(N ^ 2)。