【问题标题】:Data Structure: Request Counting Task数据结构:请求计数任务
【发布时间】:2014-10-11 19:38:18
【问题描述】:

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

输入: 请求:[4,2,5,3,1],开始时间:[2,5],结束时间:[5,6]。

输出: 4 1

解释:由于Professional_1的time_frame 2到5,他可以执行四项任务(4,2,5,3),Professional_2的time frame 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 多秒才能运行。我在这里缺少什么?

【问题讨论】:

    标签: c algorithm data-structures


    【解决方案1】:

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

    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)) 为每个请求查询树。

    【讨论】:

    • 感谢您的回答。我应该执行您的建议并返回。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2014-09-13
    • 2021-07-17
    • 2013-02-13
    相关资源
    最近更新 更多