首页 > 试题广场 >

任务务调度在分布式调度系统中是一个很复杂很有挑战的问题。请设

[问答题]
任务务调度在分布式调度系统中是一个很复杂很有挑战的问题。这里我们考虑一个简化的场景:假设一个中央调度机,有n个相同的任务需要调度到m台服务器上去执行。由于每台服务器的配置不一样,因此服务器执行一个任务所花费的时间也不同。现在假设第i个服务器执行一个任务需要的时间为t[i]。


例如:有2个执行机a, b. 执行一个任务分别需要7min,10min,有6个任务待调度。如果平分这6个任务,即a,b各分三个任务,则最短需要30min执行完所有。如果a分这4个任务,b分2个,则最短28min执行完。


请设计调度算法,使得所有任务完成所需的时间最短

        1) 简述思路

2) 请用你熟悉的编程语言编码实现以下方法,输入为m台服务器,每台机器处理一个任务的时间为t[i],完成n个任务,输出n个任务在m台服务器的分布:

int estimate_process_time(int[] t, int m, int n);


/**  * 思路:贪心。记录每个机器已经执行任务的耗时
*对于一个新任务,取所有机器(已用耗时 + 机器自身耗时)的最小值,即为这个新任务执行的机器  * 这个实现为N^2算法。用上排序可改为 Nlog(N)  */ private static int estimate_process_time(int[] t, int m, int n) { int [] cost = new int[m]; // cost 记录耗时  for (int i = 0; i < m ; i ++) {
        cost[i] = 0;    }  for (int i = 0; i < n; i ++) {  int temp = cost[0] + t[0], index = 0; 
      for (int j = 1; j < m; j ++) {  if (cost[j] + t[j] < temp) { // 选择执行机器    temp = cost[j] + t[j];  index = j;    }
        }
        cost[index] += t[index]; //记录耗时    }  int maxTime = 0;  for (int i = 0; i < m; i ++) {
        maxTime = Math.max(cost[i], maxTime); // 取所有机器的最大耗时    }  return maxTime; }

编辑于 2017-03-21 19:26:51 回复(0)
 private int estimate_process_time(int[] t, int m, int n) {
        int[] cost = new int[m]; // cost 记录耗时

        for ( int i = 0; i < n; i++) {
            int  index = 0,temp = cost[index] + t[i];
            for (int j = 1; j < m; j++) {
                if (cost[j] + t[i] < temp) { // 选择执行机器
                    temp = cost[j] + t[i];
                    index = j;
                }
            }
            cost[index] += t[i]; //记录耗时
        }
        int maxTime = 0;
        for (int i = 0; i < m; i++) {
            maxTime = Math.max(cost[i], maxTime); // 取所有机器的最大耗时
        }
        return maxTime;
    }

发表于 2020-11-07 22:31:06 回复(0)
思路和第一个是一样的,但是感觉时间复杂度还是比较高呀,不知道有没有大佬给出更低一点的时间负责度。
发表于 2017-03-22 09:06:13 回复(0)