python-3.x - 如何降低给定 python 代码的时间复杂度?
问题描述
我有这个 python 程序,它计算给定数字的“自由平方数”。我面临时间复杂度的问题,即我在在线编译器中收到错误为“超出时间限制”。
number = int(input())
factors = []
perfectSquares = []
count = 0
total_len = 0
# Find All the Factors of the given number
for i in range(1, number):
if number%i == 0:
factors.append(i)
# Find total number of factors
total_len = len(factors)
for items in factors:
for i in range(1,total_len):
# Eleminate perfect square numbers
if items == i * i:
if items == 1:
factors.remove(items)
count += 1
else:
perfectSquares.append(items)
factors.remove(items)
count += 1
# Eleminate factors that are divisible by the perfect squares
for i in factors:
for j in perfectSquares:
if i%j == 0:
count +=1
# Print Total Square Free numbers
total_len -= count
print(total_len)
如何降低该程序的时间复杂度?那就是如何减少 for 循环,以便以更小的时间复杂度执行程序?
解决方案
降低 Python 代码时间复杂度 (TC) 的算法技术。
为了降低代码的时间复杂度,非常有必要随时随地减少循环的使用。
我会将您的代码的逻辑部分分为 5 个部分,并建议在每个部分中进行优化。
第 1 节 - 变量声明和输入
number = int(input())
factors = []
perfectSquares = []
count = 0
total_len = 0
您可以轻松地省略完美正方形、count 和 total_length 的声明,因为它们不是必需的,如进一步解释的那样。这将降低代码的时间和空间复杂性。
此外,您可以使用 Fast IO,以加快输入和输出速度。这是通过使用“stdin.readline”和“stdout.write”来完成的。
第 2 部分 - 查找所有因素
for i in range(1, number):
if number%i == 0:
factors.append(i)
- 在这里,您可以使用列表推导技术来创建因子列表,因为列表推导比循环语句更快。
- 此外,您可以只迭代直到 Number 的平方根,而不是循环直到 number 本身,从而以指数方式降低时间复杂度。上面的代码部分枪到...
应用 '1' hack 后
因子 = [for i in range(1, number) if number%i == 0]
应用 '2' hack 后 - 使用 from_iterable 在列表理解的每次迭代中存储超过 1 个值
factors = list( chain.from_iterable(
(i, int(number/i)) for i in range(2, int(number**0.5)+1)
if number%i == 0
))
第 3 节 - 消除完美正方形
# Find total number of factors
total_len = len(factors)
for items in factors:
for i in range(1,total_len):
# Eleminate perfect square numbers
if items == i * i:
if items == 1:
factors.remove(items)
count += 1
else:
perfectSquares.append(items)
factors.remove(items)
count += 1
实际上你可以完全省略这部分,只需在第 2 节中添加附加条件,即 ... type(i**0.5) != int,以消除那些具有整数平方根的数字,因此它们本身就是完全平方。实现如下......
factors = list( chain.from_iterable(
(i, int(number/i)) for i in range(2, int(number**0.5)+1)
if number%i == 0 and type(i**0.5) != int
))
第 4 节 - 我认为不需要此节,因为 Square Free Numbers 没有这样的限制
第 5 节 - 完成计数,打印计数
绝对不需要计数器,您只需计算因子列表的长度,并将其用作计数。
优化代码
方式 1 - 快一点
number = int(input())
# Find Factors of the given number
factors = []
for i in range(2, int(number**0.5)+1):
if number%i == 0 and type(i**0.5) != int:
factors.extend([i, int(number/i)])
print([1] + factors)
方式 2 - 最优编程 - 非常快
from itertools import chain
from sys import stdin, stdout
number = int(stdin.readline())
factors = list( chain.from_iterable(
(i, int(number/i)) for i in range(2, int(number**0.5)+1)
if number%i == 0 and type(i**0.5) != int
))
stdout.write(', '.join(map(str, [1] + factors)))
推荐阅读
- autodesk-viewer - 如何在 Autodesk Forge 查看器中为对象添加厚度
- python-3.x - 如何使用为 Python 提供的脚本?
- reactjs - React Native 深度链接仅在第二次点击时有效
- xcode - 如何在 MacOS 系统扩展中包含 CocoaPods 框架?
- flutter - Flutter Firebase 查询 - 在文本小部件中显示设置值
- javascript - Leaflet - 个性化工具提示
- javascript - 带变量的动态数组过滤函数
- mysql - 我怎样才能获得在特定项目上花费的总金额?
- ruby-on-rails - How to make scope for model, that has two foreign keys?
- java - Spring Data JPA 仅在不存在时保存