数字分解优化

时间:2019-03-30 19:55:55

标签: algorithm time numbers refactoring

在给定N<=1000的情况下,如何优化此代码?我尝试对每个数字进行因式分解,但这很耗时:

cnt = 0 ;
 for int i=1 to N
    for int j=1 to N
        for int k=1 to N
        if(i*j)%k==0 
         cnt = cnt + 1

1 个答案:

答案 0 :(得分:0)

因此,您需要进行一些计算:

对于每对值x = i * j的i,j,您运行了k次循环,但仍然有很多对i * j给出相同的值

使用模数N ^ 3次,请记住模数是昂贵的。

优化:

  1. 不要将所有i * j对都计算在内,而是将它们存储在哈希表/数组中并计算其频率

  2. 当某些数字x除以k得出模数为0时,不使用模数来进行优化。仅当x是k的某个倍数时,才以0为增量在k递增的频率上循环

示例代码(c ++):

vector<int>freq(n*n+1); //that's just array of n*n+1 zeroes

for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
    freq[i*j]++;

int cnt = 0;
for(int k=1; k<=n; k++)
    for(int j=0; j<=n*n; j+=k) //note these loops look like n^3 at first glance yet it's something like n log (n*n) (check harmonic number if you're curious why)
    cnt+=freq[j];

更多优化:

1000并不是很多,即使数字每个占用64位,就像〜8KB内存一样。因此,您可以选择生成某些数组中的所有答案,例如answer [n]将答案存储为n,然后将答案数组硬编码到代码中。