您好,登錄后才能下訂單哦!
素數的算法有很多種,現在主要講兩種算法及其改進版本的復雜度分析,解釋性能提升的幅度。同時應用一個素數定理:素數的平方一定是合數,那么在范圍內最大數的開方范圍內找不到能整除的數,那么這個數是素數。應用這個定理可以將取模范圍的空間復雜度從O(n)降為O(n**0.5).現以求100000內素數為例,兩種算法分別是:
1.基礎思路是去掉偶數,包括取模的范圍,代碼如下:
print(2)
for i in range(3,100000,2):
for a in range(3,int(i**0.5)+1,2):
if i%a == 0:
break
else:
print(i,end = ' ')
'''
*此兩層循環的算法的計算復雜度為(0.5*n*((n**0.5)+1)/2),空間復雜度為O(n**1.5)
2.應用一個素數定理:大于6的素數一定與6的倍數相鄰,代碼如下:
'''
print(2,3,end = ' ')
n = 100000
i = 5
step = 2
while i<= n:
for j in range(5,int(i**0.5)+1,2):
if j%j == 0:
break
else:
count += 1
i += step
step = 4 if step ==2 else 2
'''
此算法的計算復雜度為(n/3052)(n0.5+1)/2(將總范圍分成30為一塊,則6的倍數有5個,相鄰的數就是10個),空間復雜度同樣為O(n1.5)
優化思路:
對于1號算法,我們知道末尾是5的數一定能被5整除,所以末位是5的數一定不是素數,j計算復雜度可以降為0.4*n*((n**0.5+1)*0.4)。不是偶數且末為不是5,就剩(1,3,7,9),所以4/10=0.4,第二層循環也是如此。優化效率提升56%(0.5**2/0.4**2-1=0.56)。
對于2號算法,思路也是刨去末位為5的數。例如,30~60這一塊內,6的倍數有(36,42,48,54,60),相鄰的數是(35,37,41,43,47,49,53,55,59,61),有兩個末位是5的數(35,55),所以將總范圍分成30為一塊,只需計算8個數,優化后空間復雜度為(n/30*(5*2-2))*(n**0.5+1)*0.4=4/15*n*(n**0.5+1)*0.4。相比優化后的1號算法,優化后的2號算法效率提升50%(其余項約分,只剩0.4/(4/15),所以0.4/(4/15)-1=0.5)。
綜上可見,降低算法復雜度是提高解決問題效率的不二法門。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。