Оценка скорости

From
Andrew Novikov ()
To
All
Date
2002-06-28T23:52:03Z
Area
RU.ALGORITHMS
From: "Andrew Novikov" <programmer@send-e.net>

Hello, All.

AN>  Необходим алгоритм для замены (для начала, поиска) подстроки в
AN> строке. Строка берется из файла и может быть достаточно большой
AN> (200К). Образец имеет вид %%имя%%, например,
AN> %%link%% заменяется на <A href="http://www.mysite.com/myprog.cgi">
AN> %%email%%          --> <A href="mailto:support@mysite.com">
AN> %%very_long_link%% --> <H1>Что-то там еще</H1>
AN>  итд.

  Итак, я пришел к тому, что левый терминал ("%%") ищется,
например, алгоритмом Б-М. Теперь надо определить является
ли последовательность, следующая сразу за ограничителем
допустимым тегом. На ум приходят два варианта:
  1. побайтовое сравнение символов
  2. использование хеш-функции.

  Предположим, есть k тегов в среднем по m символов.

  Первым методом необходимо выполнить k*m сравнений.

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

h(w[0, M-1]) = (2^(M-1)*w[0] + 2^(M-2)*w[1] + ... + w[M-1]*2^0) mod q

где q - большое простое число. M = max(m).
Плюсы - легкость вычисления h(w[0, M]) по h(w[0, M-1]). Может,
существует лучший вариант? Степени двойки находятся быстро при
помощи сдвигов.

  Собственно, проблема. Что быстрее:

 k*m раз: (char1 == char2)
ИЛИ
 Один раз: h(M) затем k (u_int1 == u_int2) и наконец m раз
(char1 == char2)

  Надеюсь, это не оффтопик...

With best regards, Andy Novikov.  E-mail: programmer@send-e.net


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)