0

意図したとおりに動作する vigenere 暗号化/復号化プログラムを作成しましたが、非常に大きなテキスト ファイル (約 500,000 文字) で暗号化/復号化を実行するには 2 ~ 4 分かかります。コードを調べましたが、どの操作がコードを遅くしているのかわかりません。これをスピードアップする方法を知っている人はいますか?

コード:

public static String encrypt(String text, String key)
{
    String cipherText = "";
    text = text.toLowerCase();
    for(int i = 0; i < text.length(); i++)
    {
        System.out.println("Count: "+ i); //I just put this in to check the 
                                          //loop wasn't doing anything unexpected
        int keyIndex = key.charAt(i%key.length()) - 'a';
        int textIndex = text.charAt(i) - 'a';
        if(text.charAt(i) >= 'a' && text.charAt(i) <= 'z') { //check letter is in alphabet
            int vigenere = ((textIndex + keyIndex) % 26) + 'a';
            cipherText = cipherText + (char)vigenere;
        } else 
            cipherText = cipherText + text.charAt(i);
        }

    }
    return cipherText;
}

暗号化を実行する前に、スキャナーを使用してテキスト ファイルを文字列に読み取るメソッドがあります。この文字列と定義済みのキーを使用して、暗号化されたテキストが作成されます。

ありがとう。

答え

RC のおかげで、文字列の連結に時間がかかっていました。他の誰かが興味を持っている場合、これは私の更新されたコードで、すぐに動作します:

public static String encrypt(String text, String key)
{
    StringBuilder cipher = new StringBuilder();
    for(int i = 0; i < text.length(); i++)
    {
        int keyIndex = key.charAt(i%key.length()) - 'a';
        int textIndex = text.charAt(i) - 'a';
        if(text.charAt(i) >= 'a' && text.charAt(i) <= 'z') {
            int vigenere = ((textIndex + keyIndex) % 26) + 'a';
            cipher.append((char)vigenere);
        } else {
            cipher.append(text.charAt(i));
        }

    }
    return cipher.toString();
}
4

2 に答える 2

0

新しい String インスタンスを作成する代わりに、StringBuilder に追加します。あなたがしたい

buffer.append((char)vigenere);

の代わりにcipherText = cipherText + (char)vigenere;

于 2013-10-26T13:21:05.530 に答える
0

現在あなたがしている

for(int i = 0; i < text.length(); i++){
    ...
    int keyIndex = key.charAt(i%key.length()) - 'a';
    ...
}

-loop から keyIndex の計算を削除してfor、前処理ステップで実現することができます。たとえば、keyIndex 値/文字を別の配列に格納し、元のループで配列の内容にアクセスできます。これにより、いくつかの計算手順を節約できます。

于 2013-10-26T13:24:24.667 に答える