编程挑战代码花费太多时间

时间:2016-04-29 11:37:08

标签: python algorithm performance python-3.x

我为this problem.

编写了以下代码
prof = sorted([int(input()) for x in range(int(input()))])
student = sorted([int(input()) for x in range(int(input()))])

prof_dates = len(prof)
stud_dates = len(student)

amount = 0

prof_index = 0
stud_index = 0

while stud_index < stud_dates and prof_index < prof_dates:
    if student[stud_index] == prof[prof_index]:
        amount += 1
        stud_index += 1

    elif student[stud_index] > prof[prof_index]:
        prof_index += 1

    elif student[stud_index] < prof[prof_index]:
        stud_index += 1


print(amount)

但是代码产生了超出时间限制的错误。之前我曾尝试对学生的每个项目使用in,但它产生了TLE,我相信这是因为in语句是O(n)。所以,我编写了这段代码,其所需的步骤大致等于两个列表的长度之和。但这也产生了一个TLE。那么,我应该在我的代码中做出哪些更改。是否有一些特定的部分有很高的时间费用?

感谢。

2 个答案:

答案 0 :(得分:3)

您正在使用排序+合并。这需要O(NlogN + MlogM + N + M)时间复杂度。

但您可以将教授数据放在set中,检查每个学生年份值(来自未排序的列表)并获得O(M + N)复杂性(平均)。

请注意,此方法消除了学生列表排序的长时间操作。

另外:python有内置集。对于没有此类规定的语言,教授的列表已经排序,因此您可以每年使用二进制搜索。复杂性为O(NlogM)

答案 1 :(得分:1)

由于问题基本上是找到两组整数的交集,所以当假设在O(M + N)

中可以进行字典访问时,以下代码解决了O(1)中的问题
prof = set([int(input()) for x in range(int(input()))])
student = set([int(input()) for x in range(int(input()))])

equals_dates = len(prof.intersection(student))