算法:平方根优化

时间:2018-04-06 16:15:27

标签: python algorithm

问题:
    实施int sqrt(int x)
    计算并返回x的平方根     例如:
    sqrt(3) = 1
    sqrt(4) = 2
    sqrt(5) = 2
    sqrt(10) = 3

我的代码:

def sqrt(self, x):
        # write your code here
        if x == 0:
            return x
        start = 1
        end = x
        while start + 1 < end:
            mid = (end - start)/2
            if mid*mid == x:
                return mid
            if mid*mid < x:
                start = mid
            else:
                end = mid
        if end*end <= x:
            return end
        return start

错误提示:

您的代码运行时间超出了我们的预期。检查你的时间复杂性。如果您的时间复杂度最佳,则超出时限通常是由无限循环引起的。

我的问题:如何改善它?

2 个答案:

答案 0 :(得分:1)

代码中的主要错误是使用mid = (end-start)//2而不是mid = (end+start)//2来计算中间值。这创造了无限循环。所以你离解决方案不远:

def sqrt(x):
    if x == 0:
        return x
    start = 1
    end = x
    while start+1 < end:
        mid = (end + start) // 2
        delta = mid*mid - x
        if delta < 0:
            start = mid
        elif delta > 0:
            end = mid
        else:
            return mid
    return start

for x in (2, 5, 9, 13, 18, 24, 27):
    print("sqrt(%s) ~= %s" % (x, sqrt(x)))

产生以下输出:

sqrt(2) ~= 1
sqrt(5) ~= 2
sqrt(9) ~= 3
sqrt(13) ~= 3
sqrt(18) ~= 4
sqrt(24) ~= 4
sqrt(27) ~= 5

答案 1 :(得分:0)

@Abhishake gupta,谢谢,它有效。有一个小错误:

  def sqrt(self, x):
        # write your code here
        if x == 0 or x == 1:
            return x
        i = 1
        result = 1
        while result <= x:
            if result == x:
                return i
            i += 1
            result = i*i
        return i-1