【问题标题】:Sort finished requests by start time按开始时间对完成的请求进行排序
【发布时间】:2019-11-17 22:00:07
【问题描述】:

给定在未知时间到达且 ID 为未知的请求: 1. StartRequest(int id) 2. EndRequest(int id)

我需要返回已完成请求的 ID,以及按开始时间排序的总时间 (endTime-startTime)。

请注意,如果之前的请求还没有完成,当前的请求即使已经完成也不会返回。

我尝试了天真的方式: 在开始请求时,我添加到列表中,在结束请求时,我检查是否有从列表开头到第一个未完成的请求并返回它们。

有没有更有效的方法?在 EndRequest 上返回结果是最好的方式吗?

【问题讨论】:

  • 这是一个非常经典的排序,你所要做的就是实现一个看起来像boolean is_smaller(object1, object2)的函数。这种函数通常称为“比较器”。完成此操作后,您可以使用您选择的排序算法实现排序,将符号 < 替换为函数 is_smaller
  • 您得到的请求已经排序,因为您可以将它们保存在到达时间。挑战是在它们完成后返回它们..例如,如果您收到请求:A B C 和 B 已完成,那么您需要等到 A 完成并返回 A B

标签: algorithm performance sorting data-structures


【解决方案1】:

在您喜欢/使用的语言中使用以下过程:

public class StartEndRequest {
private static void swap(int [] starts, int [] ends, int i, int j) {
    int temp = starts[i];
    int temp1 = ends[i];

    starts[i] = starts[j];
    ends[i] = ends[j];

    starts[j] = temp;
    ends[j] = temp1;
}
// selection sort ..
private static void sortByProcessTime(int [] starts, int [] ends) {
    for(int i=0; i<starts.length-1; i++) {
        int min = i;
        for(int j=i+1; j<starts.length; j++) {
            // swap according to execution time..
            if((ends[j] - starts[j]) > (ends[i] - starts[i]))
                min = j;
        }

        swap(starts, ends, i, min);
    }
}
private static ArrayList<ArrayList<Integer>> getFinishedProcess(int [] prevProcess, int [] starts, int [] ends){
    ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

    for(int i=0; i<prevProcess.length; i++) {
        // add the first operation, it has no prev. operation..
        if(i == 0) {
            ArrayList<Integer> temp = new ArrayList<>();
            temp.add(starts[i]);
            temp.add(ends[i]);

            list.add(temp);
        }
        if(prevProcess[i] != -1) {
            ArrayList<Integer> temp = new ArrayList<>();
            temp.add(starts[i]);
            temp.add(ends[i]);

            list.add(temp);
        }
    }
    return list;
}
private static void blockUnfinishedProcess(int [] preProcesses, int [] starts, int [] ends) {
    for(int i=1; i<preProcesses.length; i++) {
        if(ends[i] == -1) {
            preProcesses[i] = -1;
        }
    }
}
public static void main(String[] args) {
    // use an auxiliary space to point prev. operations..
    int [] prevProcess = {-1, 0, 0, 0, 0, 0};
    int [] startReq = {2, 3, 1, 4, 6, 5};
    // i am using -1 to indicate unfinished jobs..
    int [] endReq = {7, 4, 3, -1, 8, -1};

    // sort according to execution time..
    sortByProcessTime(startReq, endReq);

    // block those operation whose prev was not finished ..
    blockUnfinishedProcess(prevProcess, startReq, endReq);

    //
    for(int i=0; i<startReq.length; i++) {
        System.out.println(startReq[i]+" -- "+endReq[i]);
    }

    // add only those operation, whose prev also executed successfully.. 
    System.out.println(getFinishedProcess(prevProcess, startReq, endReq));
}

}

【讨论】:

  • 用文字或伪代码描述算法会更有用。如果 OP 不懂 Java,他将很难从您的代码中得出任何意义。
  • 由于我只使用基本的编程逻辑,我认为 OP 理解它并不困难!我仍然会在未来记住这一点!谢谢!
猜你喜欢
  • 2017-11-28
  • 2018-04-30
  • 2011-03-03
  • 2021-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多