Цезарь Шифр ​​Частотный анализ на Java - PullRequest
0 голосов
/ 22 ноября 2018

Цезарь Шифр ​​с использованием частотного анализа ** в Java: это мой код для части декодирования:

public static String decode (String code){
    int key=0;
    final int ALPHABET_SIZE = 26;
    int[] freqs = new int[ALPHABET_SIZE];
    for (int l=0;l<freqs.length;l++){ 
        freqs[l]=0;
    }
    for (int k=0;k<code.length();k++){
        if (code.charAt(k)>='a' && code.charAt(k)<='z'){
            freqs[code.charAt(k)-'a']++;
        }
    }
    int biggest = 0;
    for (int t=0;t<freqs.length;t++){
        if (freqs[t]>biggest){
            biggest= t;
        }
    }
    if (biggest<4){
        key = (biggest + 26 - ('e'+'a'));

    }
    else{
        key = biggest + 'a' - 'e';
    }
    return (decode(code,key));
}

Я не могу использовать карты, импортировать, списки или добавить ключ, я знаю, чтоНаиболее часто встречающаяся буква - E, но я не знаю, как реализовать ее в другой функции.Буду признателен за более элегантное решение, спасибо.** Частотный анализ

1 Ответ

0 голосов
/ 22 ноября 2018

Я не совсем уверен, каково ваше определение «элегантного», но ваше решение в целом выглядит хорошо.

Несколько комментариев:

  1. На самом деле вам не нужно вручную инициализировать массив в 0 при запуске, поскольку Java сделает это за вас

  2. Поиск буквы с наивысшей частотой можно выполнить при подсчете символов

Например, цикл for может стать:

int highestFreq = 0;
int highestFreqIdx = -1;
for (int k=0; k < code.length(); k++) {
    if (code.charAt(k) >= 'a' && code.charAt(k) <= 'z') {
        int count = freqs[code.charAt(k)-'a']++;

        if (count > highestFreq) {
          highestFreq = count;
          highestFreqIdx = k;
        }
    }
}
Расчет ключа можно упростить

Если я не ошибаюсь, ваш ключ - это число позиций, на которых буква с самой высокой частотой находится вдали от «е».В этом случае вы можете просто сделать это:

key = biggest - ('e' - 'a');

Таким образом, ваш код станет:

public static String decode (String code){
    int key = 0;
    final int ALPHABET_SIZE = 26;
    int[] freqs = new int[ALPHABET_SIZE];

    int highestFreq = 0;
    int highestFreqIdx = -1;
    for (int k=0; k < code.length(); k++) {
        if (code.charAt(k) >= 'a' && code.charAt(k) <= 'z') {
            int count = freqs[code.charAt(k)-'a']++;

            if (count > highestFreq) {
              highestFreq = count;
              highestFreqIdx = k;
            }
        }
    }

    key = highestFreqIdx - ('e' - 'a'); // Can also directly use 4 instead of 'e' - 'a'

    return (decode(code, key));
}

При этом ваш код будет работать только для сообщений, которые действительно имеют букву 'e'как наиболее распространенное письмо ...

P / S Такие вопросы проверки кода могут быть лучше на этом сайте Stack Exchange для проверки кода вместо

...