Python演算法——2.完全平方
阿新 • • 發佈:2020-12-11
目錄
寫在前面
此為博主在學習Python演算法中遇到的案例做的學習筆記,案例來自《Python演算法指南——程式設計師經典演算法分析與實現》,原始碼參考該書。
問題描述
給定一個正整數,判斷其是否為完全平方數。
問題示例
該數滿足開方後的數再平方等於本身即為完全平方數,如25 = 5²為完全平方數。
問題解決
給定一個正整數n,最簡單的方法即遍歷1到(n-1)的每個數判斷其平方是否等於n,這樣的時間複雜度為O(n)。
可稍微改進下,由均值不等式可知,算數平均(1+n)/ 2 ≥ √n,於是可以將遍歷範圍縮小,從1到(1+n) / 2,但這樣子算的時間複雜度仍為O(n)。 在《資料結構》中學過折半查詢的方法,該方法使查詢範圍不斷縮小一半,直至找到或找完時間複雜度為O(n)= log2(N)將這種思想應用在這道題上。
令初始的探索範圍下邊界low為1,上邊界high為n,中間值min = (1+n)/ 2,比較min²與n的大小,若前者小說明要找的值比mid大,在mid的右邊,即修改探索範圍下邊界low為mid;否則修改上邊界的值為high,重複上述操作直至兩邊界為相鄰整數。
取最後的下邊界為結果ans,若ans²比n小則取上邊界的結果為ans,比較ans²與n是否相等即可。
匯入math庫呼叫sqrt()也可以實現相應功能。
根據上述分析編寫程式碼如下:
import math
class Solution:
'''不呼叫外部函式'''
def isSquare1(self,n):
low = 1
high = n
while(high - low > 1):
mid = int((high + low) / 2)
print("low = ",low,"mid = ",mid,"high = ",high,'\n')
if(mid * mid <= n):
low = mid
else:
high = mid
print("low = ",low,"mid = ",mid,"high = ",high,'\n')
ans = low
if(low * low < n):
ans = high
return ans * ans == n
def isSquare2(self,n):
return (int(math.sqrt(n))) ** 2 == n
if __name__ == "__main__":
print("輸入值:")
n = int(input())
print("值:",n)
solution = Solution()
print("1.是否為完全平方數:",solution.isSquare1(n))
print("2.是否為完全平方數:",solution.isSquare2(n))
測試結果列印如下:
總結
這道題比較簡單,但也回顧了折半查詢。對於一些查詢值且範圍巨大的演算法,可以用折半查詢減小演算法的時間複雜度。