## 《通過預處理數據的方法降低程序時間複雜度》

## 《通過預處理數據的方法降低程序時間複雜度》
簡單點說,就是如何儘量避免**超時**問題。
爲了通俗點,下面舉兩個例子:

  首先呢,*素數判定*是一道經典例題
  簡化版的素數判定大概就是判斷在x,y範圍內(-39<=x<y<=50)的任意一個整數,如果都是素數的話就輸出Yes,否則輸出No。
 .這道題常規的解題思路就是
1.輸入x,y,取其中任意一個數m
2.利用循環i從2到m或者是從2到根號m判別m%i是否存在等於0的
3.若存在,就跳出循環,輸出No,反之輸出Yes。
我們可以想象x,y內的每一個數都要循環一次,並且隨着x,y取值的不同,又要進行多次這樣的步驟顯然有點麻煩,而且耗時也長。
但是如果我們提前對-39到50裏面的數進行一下預處理的話,就減少了很多時間,具體步驟如下:
我們將-39到50內的所有數都判斷一下是否爲素數。判定條件同上,然後當你每輸入一次x,y時,直接在已經判定好的裏面調就好,而不用再每輸入一次就全部判定一次,這樣會省時很多。
第二個題就是一個**算數**題
題大概就是定義A數組,A[0]=0,對於餘下數字,如果A[m]>0並且A[m]尚未出現在A數組當中,就執行A[m]=A[m-1]-m,否則執行A[m]=A[m-1]+m,輸入
T組數據,每組輸入一個m(0<=m<=10000),輸出第m個位置上的數。
按照正常步驟我們是這樣寫的

#include<stdio.h>
int A[10005]={0};
int main()
{
int T;
scanf("%d",&T);

while(T--)
{
int m;
scanf("%d",&m);
int i,j;

for(i=1;i<=m;i++)
{
A[i]=A[i-1]-i;
for(j=0;j<i;j++)
{
   if(A[i]!=A[j]&&A[i]>0)
     continue;
     else
     {
     A[i]=A[i-1]+i;
     break;
     }
        }
 } 
 printf("%d\n",A[m]);
}
return 0;
}


這樣寫的話就是每輸入一組數,就要for循環一次,那時間的複雜度就會很高,那麼如果m更大的話,就很有可能會超時。
而用預處理敲的代碼是這樣的

#include<stdio.h>
int A[10000]={0};
int main()
{
int i,j;

for(i=1;i<=10000;i++)
{
A[i]=A[i-1]-i;
for(j=0;j<i;j++)
{
   if(A[i]!=A[j]&&A[i]>0)
     continue;
     else
     {
     A[i]=A[i-1]+i;
     break;
     }
        }
 }


int T;
scanf("%d",&T);

while(T--)
{
int m;
scanf("%d",&m);
printf("%d\n",A[m]);
}
return 0;
}

這樣的話就相當於將從0到m所能取到的所有值都預先處理了一下,每輸入一組數直接從上面已算出的數組裏取即可,就不必每次都再進行一次for循環了,是不是很省時呢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章