我正在为单峰搜索编写程序,以通过compareTo
和Comparator
找到一行数字的最大值。
我已经编写了代码,从技术上来说应该没问题。但是,运行时太高了。它应该小于或等于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);
}
}
}
答案 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;
}
}
}