Вверх ↑
Ответов: 3889
Рейтинг: 362
#1: 2011-04-29 12:24:31 ЛС | профиль | цитата
nesco,
Tad писал(а):
При правильном алгоритме замены (выход из цикла при нахождении буквы) скорость увеличивается на 15-20%
Хоть тут и делфи, поделюсь соображениями как ассемблерщик, думаю, можно реализовать (если уже не реализовали). САМЫЙ быстрый алгоритм в природе - использование кодов символов в качестве чисел - как смещений относительно начала таблицы подмены. Никаких циклов, никакого перебора и лишних сравнений. Только специально сформированная таблица в памяти и извлечение кодов на подмену из (<адрес_начала_таблицы> + <коэффициэнт_смещения>). Скорость, близкая к первой космической)
------------ Дoбавленo в 12.24:
Предвосхищая вопрос о коэффициэнте смещения при соответствии (1 символ) -> (N символов): бинарным сдвигом влево умножаем код на 2 или 4, пропорционально увеличиваем размер "ячейки" таблицы (в байтах). У односимвольных замен заполнен только первый байт на подмену, остальные - маркеры-пустышки (здесь предполагается, что мы в пределах одной кодовой страницы юникода и первый байт с номером страницы можно опустить, если оперативная память очень-очень дорога, конечно). У многосимвольных ячеек подмены байт с кодами символов несколько. В конце каждой ячейки подмены - маркер-пустышка, указывающий алгоритму переходить к следующему символу.

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

[offtop]Ещё подход, описанный в последнем абзаце, снимает ограничения на диапазон заменяемых байт (не нужно резервировать "маркерный") и позволяет из элемента "Транслит" сделать очень интересный компонент скоростной замены бинарных данных по таблице. Скоростная бинарная замена по таблице применима не только к текстам, но и к палитрам цветов, к данным цветов каждого пикселя в картинке и многому другому.[/offtop]
карма: 1

0