优化程序时间复杂度的思路

问题描述

我遇到了一个编程问题,并且我已经被它困住了很长一段时间。我意识到我才刚刚开始学习算法和数据结构,但确实需要更多有经验的人的一些想法。

程序接收输入为 txt 文件,具有时间间隔(开始、停止)。这是一项汽车送货服务。输入看起来像这样: 4(叫车次数) 08:00:00 11:00:00(调用1开始:结束) 09:00:00 10:00:00(调用2开始:结束) 10:00:00 11:10:00(调用2开始:结束) 10:59:59 13:00:00(调用 2 开始:结束)

一个数字是交货数量,第二个数字是最后一个,时间间隔。当汽车接听电话时,它在“完成”时间之前不可用,因此如果我们在第一辆车完成之前有另一个电话,我们必须发送另一个电话。

我的目标是找到完成所有呼叫所需的最少汽车数量

对于上面的例子,那个是 3。汽车可以在完成前一个调用后直接开始另一个调用,所以可以在 10:00:00 结束并在 10:00:00 开始另一个调用

所以下面的代码,显然很笨拙,效率也不够高。它提供了正确的解决方案,但在大型数据集的时间复杂度上失败,对优化该程序有帮助吗?

input_file = open('input1.txt')

calls = [x.split() for x in input_file.readlines()[1:]]
calls.sort(key=lambda x:x[0])
time_available = [x[1] for x in calls]

for start,stop in calls:
    for i in time_available:
        if start >= i:
            time_available.remove(i)
            break

print(len(time_available))

这个解决方案设法给了我所有正确的答案,包括我正在检查它的黑匣子分级机,但尽管它的内存很好,但它因时间复杂度而失败。我猜测它与嵌套的 for 循环有关。

附言我需要对输入时间间隔进行排序,因为其他测试似乎需要它。 P.P.S 其他例子: 10 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 12:00:00 12:00:01 12:00:00 23:59:59 12:00:00 13:00:01 13:00:00 13:00:01 13:00:00 13:00:01 答案:5

解决方法

开始时间和结束时间按顺序排列,开始时累积值为 1,结束时累积值为 -1,最大值(高水位线)将是您的答案:

from itertools import accumulate

calls = [("08:00:00","11:00:00"),("08:00:00",("12:00:00","12:00:01"),"23:59:59"),"13:00:01"),("13:00:00","13:00:01")]

startends = [ (time,ss) for s,e in calls for (time,ss) in ((s,1),(e,-1)) ]
levels    = [ lv for _,lv in sorted(startends) ]
maxCars   = max(accumulate(levels))

print(maxCars) # 5

这类似于计算嵌套括号的级别。打开括号(即开始通话)时上一级,关闭括号时(即结束通话)减 1。最高级别的左括号就像同时通话的汽车数量。

如果您从需要手动拆分的字符串开始,您可以像这样构建 startends 列表:

line = "10 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 08:00:00 11:00:00 12:00:00 12:00:01 12:00:00 23:59:59 12:00:00 13:00:01 13:00:00 13:00:01 13:00:00 13:00:01"
startends = [ (time,(-1)**i) for i,time in enumerate(line.split()[1:]) ]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...