返回

算法解析:巧妙运用二分查找,轻松获取算术平方根

后端

对于X的算术平方根,有这样一道面试题:如何计算它的值?

可能您会立即想到使用内置函数,例如 pow(x, 0.5) 或 x ** 0.5。但等等,如果在面试中使用这些函数,恐怕会显得您对算法一窍不通。那么,有什么办法可以不借助内置函数来计算平方根呢?

在这里,我们为您介绍二分查找法。这一方法就像是在玩数字游戏,通过不断缩小范围,最终找到最接近X算术平方根的值。

def square_root(x):
    """
    计算X的算术平方根。

    参数:
        x: 一个非负整数。

    返回值:
        X的算术平方根。
    """

    # 初始化二分查找的范围。
    low = 0
    high = x

    # 循环,直到找到满足条件的平方根。
    while low <= high:
        # 计算中间值。
        mid = (low + high) // 2

        # 检查中间值是否满足条件。
        if mid * mid == x:
            return mid
        elif mid * mid < x:
            low = mid + 1
        else:
            high = mid - 1

    # 如果没有找到满足条件的平方根,则返回-1。
    return -1

# 测试代码。
print(square_root(16))  # 输出:4
print(square_root(25))  # 输出:5
print(square_root(100))  # 输出:10

二分查找法是一种高效的算法,可以大大减少计算平方根所需的步骤。因此,它是面试中一道常见的算法题。

除了二分查找法之外,计算平方根的另一种方法是牛顿法。牛顿法是一种迭代法,通过不断改进估计值来逐步逼近精确的平方根值。

def square_root_newton(x):
    """
    计算X的算术平方根。

    参数:
        x: 一个非负整数。

    返回值:
        X的算术平方根。
    """

    # 初始化估计值。
    r = x / 2

    # 循环,直到估计值收敛。
    while abs(r * r - x) > 0.0001:
        r = (r + x / r) / 2

    return r

# 测试代码。
print(square_root_newton(16))  # 输出:4.0
print(square_root_newton(25))  # 输出:5.0
print(square_root_newton(100))  # 输出:10.0

牛顿法是一种相对复杂的算法,但它可以比二分查找法更快地计算平方根值。

总之,计算算术平方根的方法有多种,每种方法都有其优缺点。二分查找法是一种高效的算法,但它可能需要更多的时间来找到精确的平方根值。牛顿法是一种更快的算法,但它可能需要更多的步骤来收敛到精确的平方根值。