给定的是一个包含n个项目的数组。每个项目可以包含n个未排序的任务。样本:
projects = [
{"name" : "Sampleproject 1", "tasks" :
{"order" : 1, "description" : "Do something 1", "status" : "Done"},
{"order" : 3, "description" : "Do something 3", "status" : "Open"},
{"order" : 2, "description" : "Do something 2", "status" : "Open"}
},
{"name" : "Sampleproject 2", "tasks" :
{"order" : 1, "description" : "Do something 1", "status" : "Done"},
{"order" : 1, "description" : "Do something 3", "status" : "Open"},
{"order" : 1, "description" : "Do something 2", "status" : "Open"},
{"order" : 2, "description" : "Do something 4", "status" : "Open"}
}
]
如果用户可以处理,我必须为每个任务添加一个活动键
任务可以并行和顺序处理,由订单号表示。这意味着:订单号为1的所有任务必须在处理订单号为2的任务之前完成,订单号为2的所有TAK必须在处理订单号为3的任务之前完成,依此类推
所需输出:
projects = [
{"name" : "Sampleproject 1", "tasks" :
{"order" : 1, "description" : "Do something 1", "status" : "Done", "active" : false},
{"order" : 3, "description" : "Do something 3", "status" : "Open", "active" : false},
{"order" : 2, "description" : "Do something 2", "status" : "Open", "active" : true}
},
{"name" : "Sampleproject 2", "tasks" :
{"order" : 1, "description" : "Do something 1", "status" : "Done", "active" : false},
{"order" : 1, "description" : "Do something 3", "status" : "Open", "active" : true},
{"order" : 1, "description" : "Do something 2", "status" : "Open", "active" : true},
{"order" : 2, "description" : "Do something 4", "status" : "Open", "active" : false}
}
]
不是最有效的解决方案,但您可以按
order
对任务进行排序,然后将Open
状态的最新优先级顺序设置为active
,其余的设置为false
。时间复杂度可能是O(P * TLog(T) + T)
,可以简化为O(P * TLog(T))
,其中P
是项目数,T
是每个项目的任务数。排序是NLog(N)
,因此TLog(T)
来自于此输出为JSON(便于查看结果):
我们浏览任务列表,找到打开任务的最小顺序。然后,我们再次浏览列表,并将顺序设置为
active: true
,其余设置为active: false
一种选择是使用
heap
来跟踪最低顺序。在每个heappop上,您将迭代所有任务,只需检查订单是否是要服务的订单,以及订单是否打开。这看起来像这样:这将建立订单号的最小堆。现在我们只需要为每一个提供服务:
现在您将看到
projects
的样子:然后因为它是一堆:
你有下一个服务在开始时再次。您可以重复相同的
heappop
过程,直到堆为空并且所有订单都得到了服务相关问题 更多 >
编程相关推荐