社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
私信  •  关注

Michael Veksler

Michael Veksler 最近创建的主题
Michael Veksler 最近回复了
6 年前
回复了 Michael Veksler 创建的主题 » 如何提高python代码的时间效率?

你应该考虑你的解决方案的复杂性(这是非常糟糕的):

def modusoperandi(n, t):
    # Since 't' is a tuple, the complexity of 'not in t' is O(len(t))
    # This makes the overall complexity of this function O(len(t))
    if str(n) not in t:
        yield n 

n = int(input())
t = tuple(sr for sr in input().split()) # O(len(t))
for i in range(1,n+1):  # O(n) iterations

    # 0 or 1 iteration, but the call to 'modusoperandi' is O(len(t))
    for j in modusoperandi(i,t):  
        print(j,end=' ')

总复杂度o(n*len(t))。这不是一个很好的复杂性。你需要一个在输入中是线性的复杂度。有两种方法:

  1. 使用哈希表标记所有访问的整数,并且 set 是这样一个哈希表。不幸的是哈希表有一些缺点。
  2. 既然有 n 条目和数字在1..n范围内,那么使用特征向量是非常有效的 values_encountered ,其中 values_encountered[i] True 如果且仅当 i 遇到值。对于这种类型的大输入,这种解决方案可能比集合运行得更快,并且消耗更少的内存。

是的。

import numpy as np
n = int(input())

values_encountered = np.zeros(n+1, dtype=bool)     # O(n)
values_encountered[[int(i) for i in input().split()]] = True # O(n)
# Or:
# values_encountered[list(map(int, input().split()))] = True

values_missing= (values_encountered == False) # O(n)
values_missing[0] = False
print(*list(*values_missing.nonzero())) # O(n)