在给定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
答案 0 :(得分:0)
因此,您需要进行一些计算:
对于每对值x = i * j的i,j,您运行了k次循环,但仍然有很多对i * j给出相同的值
使用模数N ^ 3次,请记住模数是昂贵的。
优化:
不要将所有i * j对都计算在内,而是将它们存储在哈希表/数组中并计算其频率
当某些数字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,然后将答案数组硬编码到代码中。