2017-01-05 5 views
1

私は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); 
     } 
    } 
} 
+1

をちょうどノート:、変数のための小文字を使用してくださいしてください。ドイツ語の文法はJavaでは問題ではありません(慣習と矛盾する場合は英語もありません)。 'Liste.hole'を見てみると、' Liste'はクラスであり、静的メソッド呼び出しであるとみなされます。 – maaartinus

答えて

2

あなただけifListe.hole(m).compareTo(Liste.hole(m + 1))に余計なコールを持っています。私はあなたがそれを取り除くことによってコールの数の半分近くをできると思う。

+0

ありがとう!それはそれだった。なぜ私は実際にそれを書いたのかわからない。 – knight240991

+1

これまでに似たようなコードを見たことがある。多分あなたはその答えを受け入れたいのですか? 「誰かが私の質問に答えるとき、私は何をすべきですか?」(http://stackoverflow.com/help/someone-answers) –

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; 
     } 
    } 
} 
+0

いい考えです(それが脇にあっても)。この正確なバージョンでは動作しません。それを修復する方法がわかりません。 'UnimodaleListe 'の3引数 'suche()'を最初に呼び出すと、 'if(c.compare(liste.hole(m)、liste.hole(m)) '行に' ClassCastException'があります。 + 1))<0){':' java.lang.ClassCastException:java.lang.Stringはjava.lang.Integer'にキャストできません。また、コンパイルエラーを導入することなく型引数を 'Comparator'に追加する方法を見つけることができません。 –

+0

修正を見つけました: 'return suche(liste、s、e、Comparator.naturalOrder());'。同時に、4引数 'suche()の最後のパラメータを' Comparator c'として宣言することもできます。 –

+0

ありがとうOle V.V.!あなたは正しいです。 'Comparator.comparing(liste :: hole) 'は' Liste.hole(m).compareTo(Liste。Liste2.hole())のための比較器を返しません。ホール(m + 1)) 'となる。ラムダ式を '(Comparator )(x、y) - > liste.hole(x).compareTo(liste.hole(y))'に変更しました。 – toongeorges

関連する問題