我有两个列表,一个包含员工工资,另一个包含查询。对于每个查询,我想打印多少员工工资。
下面你可以找到我目前使用的代码,它超出了我对大输入的时间限制。因此,我正在寻找更有效的解决方案。
sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
count = 0
for ep in sal:
if ep < i:
count +=1
print count
答案 0 :(得分:3)
我不知道这比你的解决方案更快(或更慢)。您可以使用timeit
模块来确定您的大输入。
sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
print sum(1 for s in sal if s < i)
根据数据大小,您可以事先对工资和查询进行排序,然后您只需要对列表进行一次传递:
idx = 0
sal = sorted(sal)
count = 0
for q in sorted(queries):
while sal[idx] < q:
count += 1
idx += 1
print count
对于长输入,第二种方法会更快,但对于较短的输入可能会更慢 - 您必须使用代表性数据进行分析。如果您的数据已经排序,则此方法将非常快。
答案 1 :(得分:1)
sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
for i in q:
count = sum([1 for for ep in sal if ep < i])
print count
答案 2 :(得分:1)
在已排序的bisect
列表中使用sal
:
import bisect
sal = [int(raw_input()) for x in range(num_employees)]
q = [int(raw_input()) for x in range(num_queries)]
sal.sort()
for i in q:
print bisect.bisect_left(sal, i)
bisect
执行对数搜索,其中sal < i
的最大元素为。{1}}。对于大型列表,对于具有两个for循环的其他解决方案,复杂度为O(N * log(N))
而不是O(N ** 2)
。对于大数N
,这个速度要快得多。