鱼C论坛

 找回密码
 立即注册
查看: 4705|回复: 1

并查集机器调度问题

[复制链接]
发表于 2021-10-1 11:49:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这题目啥意思
a是最晚截止时间吗
怎么对"包含当前时间段a和a-1的等价类进行合并”呢
调度1.png
调度.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-1 13:21:40 | 显示全部楼层
  1. 对于每个任务,确定一个空闲时间段
  2. 这句话的意思是 要你计算出这个任务在哪个时间执行
  3. 是时间 0 开始执行吗?
  4. 是时间 1 开始执行吗?
  5. 是时间 2 开始执行吗?
  6. 是时间 3 开始执行吗?
  7. 是时间 4 开始执行吗?

  8. 这个时间段在截止时间之前,但与截止时间最接近
  9. 这句话是这个意思
  10. 确定当前要开始执行的任务
  11. 当前时间是 0
  12. 先看开始时间
  13. A B C D 中
  14. 只有 A 和 B 可以开始执行
  15. 然后再看截止时间
  16. A 和 B 的截止时间一样,随便选一个,就选 A 了

  17. 当前时间是 1
  18. 还有 B C D 三个任务
  19. 先看开始时间
  20. 只有 B 和 C 可以开始执行
  21. 然后再看截止时间
  22. B 的截止时间是 4
  23. C 的截止时间是 2
  24. 当前时间是 1
  25. 1 离 2 最近
  26. 选 C
  27. 与截止时间最接近
  28. 选当前时间和截止时间之间,离截止时间最近的

  29. 我想不到这个问题如何用并查集解决
  30. 下面是一个没有使用并查集的解决方法
  31. #include <iostream>
  32. #include <vector>
  33. #include <algorithm>

  34. using task_t = std::pair<char, std::pair<size_t, size_t>>;

  35. std::vector<task_t> get_ready_tasks(const std::vector<task_t> &tasks, size_t current_time) {
  36.     std::vector<task_t> v;
  37.     for(const auto &i: tasks) {
  38.         if(i.second.first <= current_time) {
  39.             v.push_back(i);
  40.         }
  41.     }
  42.     return v;
  43. }

  44. task_t alloc_task(const std::vector<task_t> &tasks, size_t current_time) {
  45.     std::vector<task_t> ready_tasks = get_ready_tasks(tasks, current_time);
  46.     if(ready_tasks.empty()) return {0, {0, 0}};
  47.     sort(ready_tasks.begin(), ready_tasks.end(), \
  48.             [](const task_t &a, const task_t &b){return a.second.second < b.second.second;});
  49.     return ready_tasks[0];
  50. }

  51. void delete_task(std::vector<task_t> &tasks, char name) {
  52.     for(size_t i = 0; i < tasks.size(); ++i) {
  53.         if(tasks[i].first == name) {
  54.             tasks.erase(tasks.begin() + i);
  55.         }
  56.     }
  57. }

  58. int main() {
  59.     std::vector<task_t> tasks = {
  60.         {'A', {0, 4}},
  61.         {'B', {0, 4}},
  62.         {'C', {1, 2}},
  63.         {'D', {2, 3}}
  64.     };
  65.     for(size_t i = 0; tasks.size(); ++i) {
  66.         task_t task = alloc_task(tasks, i);
  67.         delete_task(tasks, task.first);
  68.         if(task.first != 0) std::cout << task.first << std::endl;
  69.         else std::cout << "(null)" << std::endl;
  70.     }
  71.     return 0;
  72. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-12 16:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表