1

私は以下の運動をしています:

ターン制ストラテジーLosers-Vを開発したLavinInteractiveCompanyは、ゲームをできるだけ多くの言語にローカライズすることで、ターゲット市場を絶えず拡大しています。特に、彼らはオーストラリア先住民が話す言語の1つであるAnindilyakwaでゲームのバージョンを作成することに興味を持っています。ただし、Anindilyakwaには数字がないため、ローカリゼーションは複雑です。「あなたには7つの黒いドラゴンがいて、敵には40の黒いドラゴンがいる」などのフレーズをこの言語に翻訳するにはどうすればよいですか?ローカライザーはそれを次のように翻訳することを決定しました:「あなたには黒いドラゴンがほとんどなく、敵にはたくさんの黒いドラゴンがいます。」彼らは、モンスターの数をアニンディリアクワの言葉に置き換える規則を示す表をまとめました。

そして、以下の私の実装:

import java.util.Scanner;

public class Localization {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int number;
        String designation;

        number = s.nextInt();

        if (number >= 1 && number <= 4) {
        designation = "few";
        }else if(number >= 5 && number <= 9){
            designation = "several";
        }else if(number >= 10 && number <= 19){
            designation = "pack";
        }else if(number >= 20 && number <= 49) {
            designation = "lots";
        }else if(number >= 50 && number <= 99){
            designation = "horde";
        }else if(number >= 100 && number <= 249){
            designation = "throng";
        }else if(number >= 250 && number <= 499){
            designation = "swarm";
        }else if(number >= 500 && number <= 999){
            designation = "zounds";
        }else{
            designation = "legion";
        }
        System.out.println(designation);

    }
}

コードを競合サーバーにロードしました。そして、私は次の統計を見ます:

実行時間:0.109

使用メモリ:1 434 KB

この後、私はトップレベルの結果と私が見たものをチェックしました:

ランク1:

実行時間:0.062

使用メモリ:78 KB

結論:

私のコードは2倍遅くなります。私のコードは20倍のメモリを使用しています。

私の質問:どうやって?どのように?どうしてそれは可能ですか?なぜ私のコードはとても愚かですか?コードを改善するには何を変更する必要がありますか?

4

6 に答える 6

2

このようなif-elseステートメントでチェックをカットできます。それ以外の:

if (number >= 1 && number <= 4) {
    designation = "few";
}else if(number >= 5 && number <= 9){
    // ....

上限のみを確認できます。

if (number >= 1 && number < 5) {
    designation = "few";
}else if(number < 10){
    // ...
于 2012-11-17T22:30:50.047 に答える
1

スキャナーを回避することでメモリを減らすことができます。InputStreamReaderを介して行を読み取り、Integerクラスで解析するだけです。

于 2012-11-17T22:32:05.707 に答える
1

メモリの問題についてはよくわかりません。時間とメモリは、おそらくライブラリコード(println、scanner)によって支配されています。たとえば、printlnはストリームをフラッシュすると思いますが、これはコストがかかります。

比較の平均数と最大数を減らすために、数がどのように分散されているかを利用することができます。それを知らなくても、二分探索を使用できます(ここではバケットに対して実行されますが、別のツリーを生成する数値空間に対しても実行できます)。

if (number < 50) {
  if (number < 10) {
    if (number < 5) {
      designation = "few";
    } else {
      designation = "several";
    }
  } else {
    if(number < 20) {
      designation = "pack";
    } else {
      designation = "lots";
  }
} else {
  if (number < 250) {
    if (number < 100) {
      designation = "horde";
    } else {
      designation = "throng";
    }
  } else {
    if (number number < 500) {
      designation = "swarm";
    } else if (number number < 1000) {
      designation = "zounds";
    } else{
      designation = "legion";
    }
  }
} 

このコードは、8ではなく1000に到達するために、4つの比較が必要です。

于 2012-11-17T22:46:19.087 に答える
0

try-catchブロックを使用して入力を整数に安全に変換する代わりに、別の回答からのBufferedStream入力のアイデアを使用していると仮定すると、mainメソッドからExceptionをスローできます。これにより、特殊な例外をロードできなくなります。

366kbのメモリで.078秒を思いついた。私が見た中で最高のものは、18kbのメモリを備えた.062でした。それは正気ではありません。

于 2012-11-17T22:33:33.717 に答える
0

実行時間を改善したい場合は、条件内でSystem.out.printlnを実行してから、戻り値を指定する必要があります。また、指定変数を作成する必要はありません。

}else if(number >= 5 && number <= 9){
        System.out.println("several");
        return;
于 2012-11-17T22:41:24.087 に答える
0

このコードで370KB、0.78秒になりました。それをさらに進めるためにちょっと退屈しました...

import java.io.IOException;

public class Localization {
    public static void main (String[] args) {
        short s = 0;
        while (true) {
            int next = 0;
            try {
                next = System.in.read();
            } catch (IOException e) {

            }
            if (next < '0' || next > '9') break;

            s = (short) (s * 10);
            s = (short) (s + ((short) (next - '0')));
        }

        if (s >= 100) {
            if (s >= 500) {
                if (s >= 1000) {
                    System.out.print('l');
                    System.out.print('e');
                    System.out.print('g');
                    System.out.print('i');
                    System.out.print('o');
                    System.out.print('n');
                } else {
                    System.out.print('z');
                    System.out.print('o');
                    System.out.print('u');
                    System.out.print('n');
                    System.out.print('d');
                    System.out.print('s');
                }
            } else {
                if (s >= 250) {
                    System.out.print('s');
                    System.out.print('w');
                    System.out.print('a');
                    System.out.print('r');
                    System.out.print('m');
                } else {
                    System.out.print('t');
                    System.out.print('h');
                    System.out.print('r');
                    System.out.print('o');
                    System.out.print('n');
                    System.out.print('g');
                }
            }
        } else {
            if (s >= 10) {
                if (s >= 50) {
                    System.out.print('h');
                    System.out.print('o');
                    System.out.print('r');
                    System.out.print('d');
                    System.out.print('e');
                } else if (s >= 20) {
                    System.out.print('l');
                    System.out.print('o');
                    System.out.print('t');
                    System.out.print('s');
                } else {
                    System.out.print('p');
                    System.out.print('a');
                    System.out.print('c');
                    System.out.print('k');
                }
            } else {
                if (s >= 5) {
                    System.out.print('s');
                    System.out.print('e');
                    System.out.print('v');
                    System.out.print('e');
                    System.out.print('r');
                    System.out.print('a');
                    System.out.print('l');
                } else {
                    System.out.print('f');
                    System.out.print('e');
                    System.out.print('w');
                }
            }
        }

        System.out.println();
        System.out.flush();
    }
}
于 2012-11-17T23:36:39.597 に答える