减少功能调用次数

时间:2017-01-05 20:39:24

标签: java performance

我正在为单峰搜索编写程序,以通过compareToComparator找到一行数字的最大值。

我已经编写了代码,从技术上来说应该没问题。但是,运行时太高了。它应该小于或等于28.

提示是创建一个变量,因此不会反复调用该函数以减少运行时间。但我很难做到这一点。有人可以帮忙吗?这是我的代码。

import java.util.Comparator;

public class UnimodaleSuche {
    public static <T extends Comparable<T>> T suche (UnimodaleListe <T> Liste, int s, int e){
        if (s == e){
            return Liste.hole(e);   
        } else if(s+1 == e){
            if (Liste.hole(s).compareTo(Liste.hole(e)) < 0) {
                return Liste.hole(e);
            } else {
                return Liste.hole(s);
            }
        }

        int m = (s+e)/2;
        Liste.hole (m).compareTo(Liste.hole(m+1));
        if (Liste.hole (m).compareTo(Liste.hole(m+1)) < 0){
            return suche(Liste, m+1, e);
        }else{
            return suche(Liste, s, m);
        }
    }

    public static <T> T suche (UnimodaleListe <T> Liste, int s, int e, Comparator <T> c) {
        if (s == e) {
            return Liste.hole(e);   
        } else if(s+1 == e){
            if (c.compare(Liste.hole(s), Liste.hole(e)) < 0) {
                return Liste.hole(e);
            } else {
                return Liste.hole(s);
            }
        }

        int m = (s+e)/2;
        c.compare(Liste.hole(m), Liste.hole(m+1));
        if (c.compare(Liste.hole(s), Liste.hole(e)) < 0) {
            return suche(Liste, m+1, e,c);
        }else{
            return suche(Liste, s, m, c);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您在Liste.hole(m).compareTo(Liste.hole(m + 1))之前拨打了if多余的电话。我认为通过删除它可以将近一半的呼叫数量。

答案 1 :(得分:0)

我会按如下方式重写您的代码:

public class UnimodaleSuche {
    public static <T extends Comparable> T suche (UnimodaleListe <T> liste, int s, int e){
        return (T) suche(liste, s, e, Comparator.naturalOrder());
    }

    public static <T> T suche (UnimodaleListe <T> liste, int s, int e, Comparator<T> c) {
        while (s + 1 < e) {
            int m = (s + e)/2;
            if (c.compare(liste.hole(m), liste.hole(m + 1)) < 0) {
                s = m + 1;
            } else {
                e = m;
            }
        }

        if (s == e) {
            return liste.hole(e);
        } else {
            T lowValue = liste.hole(s);
            T highValue = liste.hole(e);
            return (c.compare(lowValue, highValue) < 0) ? highValue : lowValue;
        }
    }
}