这是一个程序,它具有输入数组中元素数量的第一个输入,第二个输入是输入数组,第三个输入是要在列表中计数的数字
num = int(input())
array = input()
lissst = array.split()
lissst = [int(a) for a in lissst]
num_query = int(input())
i = num_query
while i > 0:
queries = int(input())
x = lissst.count(queries)
if x > 0:
print (x)
elif x == 0:
print("NOT PRESENT")
i = i - 1
输入格式如下所示:
6
1 1 1 2 2 0
6 1
2
1
0
3
4
输出布局如下:
3
2
3
1
不存在
不存在
我需要减少大输入的执行时间,有关如何解决此特定问题的任何提示吗?
答案 0 :(得分:0)
更快地回答查询号码,可以建立数字的字典映射 - >计数。
接收查询号时,使用字典映射返回O(1)摊销的结果(而不是原始天真解决方案的O(n))
构建地图 O(n)
:
num2count = {}
for i in my_array:
if not i in num2count:
num2count[i] = 1
else:
num2count[i] += 1
回答一个问题"数组中x的次数" O(1)
平均
counts = num2count.get(x, 0)
您的代码已更新
num = int(input())
array = input()
lissst = array.split()
lissst = [int(a) for a in lissst]
num2count = {}
for i in lissst:
if not i in num2count:
num2count[i] = 1
else:
num2count[i] += 1
num_query = int(input())
i = num_query
while i > 0:
queries = int(input())
x = num2count.get(queries, 0)
if x > 0:
print (x)
elif x == 0:
print("NOT PRESENT")
i = i - 1
答案 1 :(得分:0)
缓慢可能来自这里:
x = lissst.count(queries)
因为list.count
每次都必须阅读整个列表。
您可以通过将输入数组中的每个数字放入字典中来加快速度(数字 - >它出现在数组中的频率)。下面我使用collections.Counter
,它只是一个方便的dicts包装器:
from collections import Counter
num = int(input())
array = input()
array = [int(a) for a in array.split()]
counter = Counter(array)
i = int(input())
while i > 0:
query = int(input())
x = counter[query]
if x > 0:
print (x)
else:
print("NOT PRESENT")
i -= 1
答案 2 :(得分:0)
除现有答案外,您还可以尝试Pypy:https://pypy.org
“如果你希望你的代码运行得更快,你应该只使用PyPy。” - Guido van Rossum(Python的创建者)