以最小间隔安排任务:算法

时间:2017-07-18 03:28:44

标签: ruby algorithm recursion greedy

  

给定一个char数组来表示CPU需要做的任务。它包含   大写字母A到Z,其中不同的字母代表不同   task.Tasks可以在没有原始订单的情况下完成。每项任务都可以   在一个区间内完成。对于每个间隔,CPU可以完成一项任务或   只是闲着。

     

然而,存在非负的冷却间隔n,意味着介于两者之间   两个相同的任务,CPU必须至少有n个间隔   不同的任务或只是闲着。

     

您需要返回CPU将占用的最小间隔数   完成所有给定的任务。 (来源:https://leetcode.com/problems/task-scheduler/#/description

我的代码:

def least_interval(tasks, n)
  calculate_smallest_interval(tasks, n, 0, 0)
end

def calculate_smallest_interval(tasks, n, index, occupied_task_count, cool_down = Hash.new { |h, k| h[k] = 0})
  return 0 if tasks.empty?
  index = 0 if index == tasks.length && !tasks.empty? # reset to the front
  cool_down.each_key do |k|
    cool_down[k] -= 1
    occupied_task_count -= 1 if cool_down[k] < 0 
  end

  curr_task = tasks[index]
  if cool_down[curr_task] > 0
    calculate_smallest_interval(tasks, n, index + 1, occupied_task_count, cool_down)
  elsif occupied_task_count == tasks.length
    # idle period
    # don't increment index here because reconsider curr element
    1 + calculate_smallest_interval(tasks, n, index, occupied_task_count, cool_down)
  else
    cool_down[curr_task] = n # set the cooldown timer
    occupied_task_count = 1 # increment number of tasks in hash
    1 + calculate_smallest_interval(tasks[0...index] + tasks[index + 1..-1], n, index, occupied_task_count, cool_down)
  end
end

警告: 我现在明白,这个问题的深刻见解是你总是想要承担剩余实例数量最多的任务。没有降温才能获得最佳效果。但是,我仍然有兴趣了解我的代码在哪里出错,否则接近(因为我的输出远小于最佳结果)。

说明:

我有一个哈希表,可以跟踪冷却的所有相关任务。我还有一个索引变量,它递增以跟踪当前任务 - 如果当前任务可用,请保留它。

对于大型任务数组和高n值,我的输出明显低于最佳输出(所以我知道我错了)。这是一个较小但具有示范性的输入/输出组合:

IN: tasks = ['A','A','A','B','B','B'], n = 2 
Correct output: 8 
Mine: 7

有人可以告诉我他们在推理中看到了逻辑错误吗?

0 个答案:

没有答案