数据结构:请求计数任务

时间:2014-10-11 19:38:18

标签: c algorithm data-structures

我正在看这个编程任务,我发现了以下问题。 问题陈述:给出了专业人员start_time和end_time的列表。给出了任务的end_tasks列表。找出每个专业人员在其时间范围内可以完成的任务数量。

输入: 请求:[4,2,5,3,1],start_time:[2,5],end_time:[5,6]。

输出: 4 1

解释:由于Professional_1有time_frame 2到5,他可以执行四个任务(4,2,5,3),Professional_2有时间范围5到6,他只能做一个任务(即5)

程序代码:

#include <stdio.h>

void count_requests(int *requests, int requests_length, int *pro_start, int pro_start_length, int *pro_end, int pro_end_length) {

    int i,j,req,start,end,task;
        for(i=0;i<pro_start_length;i++){
            start=*(pro_start+i);
            end=*(pro_end+i);
            task=0;
            for(j=0;j<requests_length;j++){
                req=*(requests+j);
                if(req>=start && req<=end){
                    task=task+1;
                }
            }
         printf("%d\n",task);
        }
}

当输入数量为50000时,嵌套的for循环运行时间超过30秒。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

现在,您正在遍历每个工作人员的整个输入列表。相反,您可以对输入列表进行排序,然后为每个工作程序执行两次二进制搜索,以确定边界内任务的索引

sortedInputs = Sort(inputs)
for(i=0;i<pro_start_length;i++){
  startIndex = BinarySearch(sortedInputs, *(pro_start+i));
  endIndex = BinarySearch(sortedInputs, *(pro_end+i));
  printf("%d\n",endIndex - startIndex)
}

在对输入进行排序时,您预先获得了初始O(n * log(n))成本,但每个任务计数的成本为O(log(n))


如果您有一组固定的工作人员和一组请求(因此对请求进行排序是不切实际的),那么您可以创建Segment Tree个工作人员,然后为每个请求检索能够满足要求的工人组。这具有相同的复杂性 - 用于创建段树的O(n * log(n))和用于查询每个请求的树的O(log(n))。