線性篩選素數法(O(n)複雜度)
阿新 • • 發佈:2019-02-04
昨天有個SB給我講了一個線性篩選素數法O(n)的複雜度,感覺很神奇,自己看了看,
確實牛b的樣子。其實它不像一般的篩選素數法會重複操作標記非素數,此方法不會重複
之行操作,遍歷只需一次就行。
void get_prime() { int num = 0 ; memset(vis,false,sizeof(vis)); for(int i = 2 ; i < n ; i ++) { if(!vis[i]) prime[num++] = i ; for(int j = 0; j<num && i*prime[j]<n ; j ++) { vis[i*prime[j]] = true ; if(i % prime[j] == 0) break ; } } } /*可以用均攤分析的方法來分析演算法的複雜度,由於每 個合數都唯一的被它的最小素因子篩一次,而每個合 數的最小素因子都是唯一的,總複雜度是O(n)*/
一般篩選素數法:
void get_prime() { int num = 0 ; memset(vis,false,sizeof(vis)); for(int i = 2 ; i < n ; i ++) { if(!vis[i]) { prime[num++] = i ; for(int j = 2*i ; j < n ; j += i) { vis[j] = true ; } } } }