【发布时间】:2018-01-08 03:38:03
【问题描述】:
我有一个存储大量任务的系统。每个任务都有以下参数:
Time t
Priority p
每个任务都有一个独特的时间。这意味着没有 2 个任务可以具有相同的时间参数。
但是,优先级并不是唯一的。多个任务可以具有相同的优先级。
我需要设计一个可以处理四种类型查询的系统。每种查询类型的概率均等。以下是查询的类型:
更新任务(t,p)
此查询希望系统将时间t的任务的优先级设置为优先级p。如果系统中不存在该任务,则会创建一个新任务。如果任务存在,则更新其优先级。删除任务(t)
此查询希望系统删除与时间t关联的任务。如果系统中不存在此类任务,则无需执行任何操作。GetMaximumPriority() 和 GetMinimumPriority()
此查询希望系统打印系统中可用任务的最低优先级和最高优先级。GetPriorityofTaskAtMaximumTime()
该查询希望系统打印参数t(时间)最大值的任务的优先级
我需要为这个系统设计数据结构并为这些数据结构实现算法。我需要在 Java 中实现它。
我的方法:创建一个HashMap,其中键为时间,值为优先级。 HashMap 允许我在恒定时间内解决前两个查询。但最后两个查询的时间复杂度为O(n)。
问题:有没有更好的时间效率和空间效率的数据结构和算法来解决这个问题?我主要需要一种方法来解决这个问题。不需要完全实现的代码。谢谢。
【问题讨论】:
-
为什么不尝试自己提出一个结构,然后在此处(如果您有问题)或在 [codereview](如果您需要意见)询问?看起来你要么需要学习一些东西(最好自己尝试一下),要么就是你的工作(在这种情况下,你的努力得到了钱,所以先展示一些;))。
-
你的时间是什么样的?您可以将其用作
Map<Time, Priority>中的键值吗? -
我认为最难的查询是Q4,你有更多关于这个查询的信息吗?喜欢它需要实时完成还是可以缓存一些查询并以批处理模式处理它们?或者你知道时间范围吗?如果您一次批处理所有查询,则可以在 O(lg n) 时间内完成,但如果您想要实时结果似乎并不容易
-
所有查询都不会提前提供。仅当查询可用时才必须回答查询,具体取决于当时存储的数据。所以,它是一种实时的。
-
看看Java
TreeMap。这些将在 O(log(n)) 时间内处理所有剩余的查询。您需要一个按时键控,另一个按优先级键控。更新和删除必须在树形图中执行相同的操作。这些也是 O(log(n))。应该直截了当。线性空间提供了很好的加速。您可能会发现边缘有所改进,但这种操作组合不会承认所有解决方案都是 O(1)。
标签: java algorithm sorting data-structures