在O(log(n))时间

时间:2017-11-19 11:17:03

标签: java intervals asymptotic-complexity

我有2个间隔数组,trip_beginning和trip_end。 trip_beginning [j] trip_end [j]表示第j个间隔的结束和开始。 数组M和S已排序。

程序需要过滤掉行程(badTrip),如果它包含S中的任何索引,并且如果它不是badTrip,则需要计算其间隔中M个索引的数量。 最后以maxCt计数(tripMax)结束的旅程获胜。

代码返回正确的结果,但需要渐近更快。 T *(日志(M + S)。 由于for循环,情况并非如此。 是否有更快的方法来进行间隔(包括端点)比较?

int tripMax = 0;
int maxCt = Integer.MIN_VALUE;

for (int j=0; j< trip_beginning.length; j++){
    int tripNo = j+1;
    boolean badTrip = false;
    int tripS = trip_beginning[j];
    int tripE = trip_end[j];
    int mountains = 0;


        for (int k=tripS; k <= tripE; k++){
            if (Bsearch(S,k)==1){
                badTrip= true;
                // break;
            } 
            if (!badTrip && Bsearch(M,k)==1){
                    mountains++;
            }

        } //endfor


    if (!badTrip && (mountains>maxCt)){
        maxCt = mountains;
        tripMax = tripNo;

    }

1 个答案:

答案 0 :(得分:0)

你应该只对两个值进行二元搜索:trip_beginning [j]和trip_end [j] + 1,而不是它们之间的每个整数。二进制搜索应找到相应值小于要搜索的数字的最大索引(如果小于或等于数组中的第一个数字,则为-1)。然后计算行程两端的指数差。对于S,如果索引差异不为0,则S中的一些元素位于两端之间,因此行程较差。对于M,指数差异是山脉的数量。这给出了O(n(log | S | + log | M |))时间。