Q&A

ML

算法题

flags = [True] * (n + 1)
primes = []
pnum = 0
for i in range(2, n):
    if flags[i]:
        pnum += 1
        primes.append(i)
    for j in range(pnum):
        ind = primes[j] * i 
        if ind > n:
            break
        flags[ind] = False
        if i % primes[j] == 0:
            break

任意一个合数均可以表示为素数的乘积n=p_1*p_2*...* p_k, p_1\le p_2\le p_k,线性筛法确保一个合数由其最小的因子来消除,这样可以确保其只被标记一遍。上述代码中,一个数k表示为k=primes[j] * i, 由于primes数组是有序的,故可以确保k是被其最小因子消除的;当i有一个因子为primes[j]时,就不能继续标记了,因为primes中接下来的质数肯定比i的因子大,就不符合标记准则了。比如k=90, primes[j]=3, i = 2 * 3 * 5 = 30时就不标记,直到在primes[j]=2, i = 3 * 3 * 5 = 45,这样就解决了重复标记的问题;
时间复杂度分析:因为避免了重复标记问题,所以标记操作总共为O(n),单次循环平均为O(1);外层循环复杂度为O(n)。所以总体复杂度为O(n);
Eratosthenes筛法(埃式筛法)时间复杂度分析

调和级数
调和级数部分和

数学

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。