1. 程式人生 > >線性篩選素數法(O(n)複雜度)

線性篩選素數法(O(n)複雜度)

               昨天有個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 ;
            }
        }
    }
}