演算法學習 線篩

2021-09-25 02:36:02 字數 604 閱讀 5394

那些年普通的篩法:

for(i=2;i<=sqrt(n);i++) 

if(bz[i]) for(j=2;j*i其實可以優化:

for(i=2;i<=sqrt(n);i++) 

if(bz[i]) for(j=i;j*i) bz[i*j]=0; 

(因為像3*2 和 2 *3這樣的重複了)  

其實優化過後就成了erotosthenes演算法o(n log log n)

但是面對數以億計的資料還是不理想,原因是沒有確定乙個數被分解的唯一形式。

例:對於12這個數,erotosthenes演算法還是會將其計算兩遍(2*6 , 3*4) ,有沒有什麼方法使每乙個數有唯一的分解呢 ? 

像12分解為2*2*3(唯一)

現在進入線篩:

設minp[i]表示i最小的質因子是minp[i],例:minp[12]=2 , minp[5]=5

然後:(見**)

void init()

for(int j=1;j<=pri[0];j++) //掃瞄當前有的質數

}return ;

}

這樣,每個數隻會被最小質因子篩到一次,o(n)。

懸線法 學習總結

主要用於求滿足某條件的最大矩陣 一條豎線,豎線的上端點位於矩陣的上邊界或是乙個障礙點,然後對這條懸線進行左右移動,直到移至障礙點或者是矩陣邊界,進行確定這條懸線所在的極大矩陣。底線為 i,j 的懸線 left存每個點能達到的最右位置 right存放每個點能到達的最左邊的位置 height為高度 遞推...

懸線法 學習筆記

之前的考試包括做題都有用過這個方法,算是個套路了。寫一篇部落格總結一下。懸線法的用途 針對求給定矩陣中滿足某條件的極大矩陣,比如 面積最大的長方形 正方形 周長最長的矩形等等 可以滿足在時間複雜度為o m n 的要求,比一般的列舉高效的多,也易於理解。懸線法的思路 懸線法,懸線的定義,就是一條豎線,...

洲閣篩法學習小計

乙個對單個n有效的方法 f n 表示n以內的素數個數 c i 表示第i個素數 g n m 表示n以內不被c 1.m 整除的數的個數 1 f n f sqrt n g n f sqrt n 1 大於sqrt n 的合數必然會被小於等於sqrt n 的素數去掉,而1要去掉 2 g n m g n m 1...