【问题标题】:Find overlap range on multiple regions查找多个区域的重叠范围
【发布时间】:2016-06-14 14:48:21
【问题描述】:

我有这个问题我正在努力解决,

我有一台机器,任务一个接一个地进入机器。

每个任务都有一个任务 ID、起始编号和它请求的单元数。

对于每个任务,我需要检查任务的范围[开始编号,开始编号+请求单位]是否与之前的任务范围重叠,如果重叠,则不会执行。

任务Id有32个,机器不能同时持有相同的任务Id(如果任务Id 2在机器中,必须在再次进入机器前执行,可能参数不同)

基本思想是保存一个控制块,其中包含机器中所有任务的范围(最多 32 个),并为每个新任务扫描此结构,但这并不是性能的最佳选择。

有什么想法吗?

这是取自真实世界的产品开发,我简化了这个模型。另外我需要用 C 编写解决方案,所以我不能有任何复杂的数学理论:)

【问题讨论】:

  • 你对机器的定义不够好,比如数字的范围,你没有说当一个新的任务无法处理时会发生什么。是否所有新请求都在此时被搁置,或者是否应该将它们放入搁置队列中,同时处理其他新请求?这可能非常复杂,因为新请求可能会不断地阻塞等待队列中的一个。例如,如果正在运行的任务正在处理单元 1-4,并且单元 3-6 的新任务排队,然后新任务到达处理单元 5-8,这可能是允许的,但任务保留在队列中仍然被阻止。

标签: c real-time


【解决方案1】:

创建一个任务控制块结构(TCB_t)来保存有关任务的参数和信息。创建一个 TCB_t * currentTasks[32] = {0} 数组并将指针初始化为 null。在您的 addTask(...) 例程中检查 currentTasks[newTaskID] == NULL 以及它是否分配了一个新的 TCB_t 并将其分配到那里。您可以处理 currentTasks 列表中的任务,完成后释放它们并将其设置回 NULL。由于只有 32 个任务,您可以使用直接哈希函数将 TCB_t 直接映射到 currentTasks 数组中的条目。 您还需要保留一个单独的区域列表,您可以将每个区域插入到排序的链表中,以便更容易确定要添加的任务是否与其他任务重叠。

【讨论】:

  • 我仍然需要扫描每个新任务的条目列表,不是吗?
  • 你提前知道 startNumber 或 requestUnits 吗?
  • 不,这些参数可以是任何东西
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多