1. 程式人生 > 其它 >Python演算法——2.完全平方

Python演算法——2.完全平方

技術標籤:Python演算法python演算法

目錄


寫在前面

此為博主在學習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))

測試結果列印如下:
1
2


總結

這道題比較簡單,但也回顧了折半查詢。對於一些查詢值且範圍巨大的演算法,可以用折半查詢減小演算法的時間複雜度。