Поиск в массиве или переключатель?Для шифра подстановкой - PullRequest
3 голосов
/ 04 июня 2011

Я кодирую классический шифр путем подстановки в C ++, используя все печатные символы в ASCII, и мне интересно, что быстрее?Поиск в массиве ( edit: неассоциативный, просто что-то вроде letters[] = {'a', 'b', ...); (линейный или двоичный) или оператор switch? Компилятор может оптимизировать переключатель, не так ли?Разница заключается в использовании памяти? Мой выбор - переключатель, хотя код больше, но, возможно, я что-то упускаю.

(Возможно, этот вопрос кажется субъективным, но я думаю, что были бы объективные причины выбрать один илипо-другому. И извините за мой английский).

Ответы [ 3 ]

6 голосов
/ 04 июня 2011

Зачем вам нужен поиск?Просто имейте массив из 128 записей, проиндексированный вашим символом ASCII.Это в основном то, что компилятор делает с вашим переключателем.(Вы можете вычесть 32 и использовать массив из 96 записей, что позволит сэкономить место, используемое непечатаемыми печатными формами.)

2 голосов
/ 04 июня 2011

Какой из них быстрее, зависит от многих факторов: от оптимизации вашего компилятора (вам нужно посмотреть на сборку, чтобы узнать, что она делает) и от того, как вы настроите свой массив.

Еслипроизводительность действительно важна, и поскольку оба решения, вероятно, будут довольно просты в реализации, я бы реализовал их оба и оценил их в максимально возможной конфигурации, чтобы выяснить, какое из них быстрее.

1 голос
/ 04 июня 2011

Конечно, есть шанс, что достаточно умный компилятор может оптимизировать коммутатор для поиска, что будет быстрее, чем бинарный поиск. Но вы можете выполнить эту оптимизацию самостоятельно и получить короткий код:

char alphabet[] = {
    'Z', 'E', 'B', 'R', 'A', 'S', 'C', 'D', 'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'T', 'U', 'V', 'W', 'X', 'Y'
};
// now you can get the ciphertext for a single uppercase character with:
alphabet[ch - 'A'];
...