【问题标题】:What is the fastest way to decide whether a number is a square number in Python 3在Python 3中确定数字是否为平方数的最快方法是什么
【发布时间】:2018-06-09 19:04:11
【问题描述】:

我正在尝试根据列表中的数字是否为平方数来返回 True/False 输出。

列表需要检查多次,列表可以是任何正整数,这意味着整数可以非常大,事实上,对于使用涉及 math.sqrt() 函数的其他解决方案会产生此处显示的溢出错误:

userList = [1*10**1000]
print ([x for x in userList if math.sqrt(x).is_integer()])

>>>Traceback (most recent call last):
print ([x for x in userList if math.sqrt(x).is_integer()])
OverflowError: int too large to convert to float

这是我的*方法:

def squares():
    for i in userList:
        if i in squares: #the list in which all the square numbers are stored
            return True
        else:
            return False

*我目前的想法是将平方数预先准备到一个单独的列表中以便比较它们,但我正在寻找一种替代的更快方法,因为 userList 可能会变得非常大。

我想将返回的输出存储在一个单独的列表中:

out = []
for i in userList:
    out.append(squares())

print(out)
>>>[False,True...]

正如您所见,在处理许多数字时这将花费很长时间,这就是我需要更快方法的原因。

【问题讨论】:

  • "将平方数预先准备到单独的列表中" 不要那样做。如果您想要一个用于高效成员资格测试的容器,请使用 set,它具有恒定时间成员资格检查,而 list 具有线性时间成员资格测试。
  • 既然 OP 已经做出了一些澄清,这个问题 不是另一个问题的重复。它的三个答案使用浮点运算,这不足以解决这个问题,因为整数可能太大而无法放入浮点变量中。避免这种情况的一个答案是使用一种非常慢的算法来找到平方根的整数部分。我们应该重新打开这个问题,或者出于其他原因关闭它。
  • @TrojanHorse,还需要一个例子……
  • @jpp 举了一个例子
  • 编写一个函数来计算整数平方根。可以使用牛顿法(小心)。一个简单的二分搜索甚至更容易实现,并且性能不错,即使对于大数字也是如此。

标签: python list function math numbers


【解决方案1】:

一个简单的方法是编写一个integer square root 函数。这是一种基于二分搜索的次优(但仍然相当快)的方法:

def is_sqrt(m,n):
    return m**2 <= n < (m+1)**2

def isqrt(n):
    low = 0
    high = n
    m = (low + high)//2

    while not is_sqrt(m,n):
        if m**2 < n: #too small! must be in [m+1,high]
            low = m+1
        else: #too big! must be in [low, m-1]
            high = m - 1
        m = (low + high) // 2
    return m

def is_square(n):
    return n == (isqrt(n))**2

那么以下几乎是瞬间完成的:

>>> is_square(77**200)
True
>>> is_square(77**200 + 1)
False

【讨论】:

  • 这工作得非常快,即使对于 math.sqrt() 无法做到的双精度浮点数的最大指数 (2**1024) 也是如此! @johncoleman
猜你喜欢
  • 2010-09-22
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多