【问题标题】:Speed up nested loops加快嵌套循环
【发布时间】:2016-04-12 01:35:06
【问题描述】:

我正在做一个关于三角数的挑战。关键是要找出任意两个三角数之和是否等于输入 n。我让它工作,但显然它需要太长时间,他们想要更快的东西。

我写它的方式是将所有三角数放入一个列表中,然后循环遍历该列表以检查是否有任何一对数字满足条件。我不知道如何使循环更快,并且在这里阅读类似的帖子我不知道如何将其应用于这种情况。

代码如下:

def Triangular(n):
    lst = []
    for i in range(1, n + 1):
        lst.append((i** 2 + i)//2)
    yn = False
    for i in lst:
        for j in lst:
            if i*i + j*j == n:
                yn =  True
                break
            else:
                continue
    return yn

【问题讨论】:

  • 您可能想在Code Review上提问
  • "关键是要找出任意两个三角数的 sum 是否等于输入 n" - 那为什么你的代码看看平方和
  • 因为我打错了
  • 所以我尝试了 Triangular(6),它应该返回 True,但却收到了 false。这里有点困惑>.>
  • Nvm,才发现打错了

标签: python performance loops


【解决方案1】:

将三角形数字的正方形放入 d̶i̶c̶t̶i̶o̶n̶a̶r̶y 集合(不是列表)中。然后遍历 d̶i̶c̶t̶i̶o̶n̶a̶r̶y 集合,对于每个键,询问该键是否小于或等于 n/2,以及 n - key 是否也是 l̶i̶s̶t 集合中的一个键。

最坏的情况是O(n log n),而不是O(n^2),而且速度明显更快。

当然,break 只跳出循环的一层,所以你可以通过返回 true 更快地成功。

【讨论】:

  • 就是这样,即使只是返回 true 也可以。我不知道我在想什么,谢谢你的帮助。
  • 我不明白如果将语句if i <= (n/2) and (n-i) in lst放在字典中如何满足条件?一个用户案例是 n = 2,从技术上讲,结果应该是 False。
  • set 有什么问题? BTW in 对于 dict 和 set 来说是 O(1),所以这应该是 O(n) 吗?
  • @AChampion -- 一套会更好。在将 set() 添加到语言之前,我停止使用 Python。现已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2022-01-08
  • 1970-01-01
  • 2018-06-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多