回覆列表
-
1 # 廣州啃書君
-
2 # 新零售企業探索
一、大層面來看,拿ACM等演算法競賽來看,總體編碼體系有預處理模板,方便載入包、標頭檔案等。
二、從程式視角來看,預處理是一種透過提前處理一些在計算中頻繁用到的資料以提高程式效率的方法:
例如, 有一題讓你求一個序列的區間的和, 無修改, 按次詢問。
如果小的話大可使用暴力, 即從一直列舉到 , 並求和, 時間複雜度
程式碼:
for(int i=l;i<=r;i++) ans+=a[i];
但是如果 較大的話, 我們就可以預處理區間 的和, 然後用區間 的和 減去 區間 的和 來得到區間 的和, 時間複雜度 , 其中的 為預處理複雜度
程式碼:
// 預處理 (sum[i] 代表區間 [1,i] 的和) :
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i];
// ...
// 求值:
ans=sum[r]-sum[l-1];
以上的做法被稱作字首和, 屬於預處理的一種, 可以看出經過預處理之後程式效率大大提高, 所以它是一種透過提前處理一些在計算中頻繁用到的資料以提高程式效率的方法。
預處理一般指的是進行多個詢問之前的處理。
一般這種問題的複雜度寫成:預處理的複雜度-單個詢問的複雜度。
如RMQ複雜度是 ,而用線段樹求區間最值複雜度是 。
除了資料結構外,例如詢問是 中的數質因數分解,可以預處理出小於等於 的質數,那麼複雜度就是 。
在某些離線問題中,預處理也會包含詢問的資訊,如離散化。
由於這些方法常見於很多不同型別的題目中,因此有時候只要出現線性篩、離散化等做法也叫做預處理