检查超时的算法

时间:2017-10-16 20:45:03

标签: algorithm queue timeout

我有一组有限的任务需要由客户完成。客户端在连接时被分配任务,并在完成上一个任务后继续获取新任务。每个任务都需要由3个唯一客户端完成。这可以确保客户端不会给任务提供错误的结果。

但是,我不希望客户花费超过3000毫秒。由于某些任务相互依赖,这可能会阻碍进度。

问题在于我无法检查任务的超时 - 这应该在没有任何免费任务时完成。

此时每个任务都有一个名为assignedClients的属性,如下所示:

assignedClients: [
  {
    client: Client,
    start: Date,
    completed: true
  },
    {
    client: Client,
    start: Date,
    completed: true
  },
    {
    client: Client,
    start: Date,
    completed: false
  }
]

所有任务(大约1000个)都存储在一个数组中。基本上,当客户端需要新任务时,伪代码如下:

function onTaskRequest:
  for (task in tasks):
    if (assignedClients < 3)
      assignClientToTask(task, client)
      return

   // so no available tasks
   for (task in tasks):
      for (client in assignedClients):
        if (client.completed === false && Time.now() - client.start > 3000):
          removeOldClientFromAssignedClients()
          assignClientToTask(task, client)

但这似乎效率很低。是否有更有效的算法?

1 个答案:

答案 0 :(得分:0)

您要做的是将任务存储在优先级队列中(通常实现为堆),当它们与最早的第一个一起可用时。当客户端需要新任务时,您只需查看队列的顶部即可。如果可以安排它,可以安排在该任务上。

插入任务时,现在将其作为优先级。当您填写任务列表时,您将其置于最旧客户端到期的时间点。

如果您正在使用堆,那么与您当前的O(log(n))实施相比,所有操作都不应低于O(n)

您的数据结构看起来像JSON,在这种情况下https://github.com/adamhooper/js-priority-queue是我查看Google时出现的优先级队列的第一个JavaScript实现。你的伪代码看起来像Python,在这种情况下https://docs.python.org/3/library/heapq.html在标准库中。如果您无法找到您所用语言的实施,https://en.wikipedia.org/wiki/Heap_(data_structure)应该能够帮助您弄清楚如何实施它。