Быстрое сопоставление с двумерным образцом по строке и по

advertisement
FAST WAY OF TWO-DIMENSIONS PATTERN
MATCHING TO ROW AND TO COLUMN
The fast way of two-dimensions pattern matching is considered, in which one the acceleration of scanning of a twodimensions string is reached at the expense of preprocessing of a sample. The calculation of positions of shift of a sample allows to minimize time of scanning of a two-dimensions string in a horizontal and a vertical directions.
БЫСТРОЕ СОПОСТАВЛЕНИЕ С ДВУМЕРНЫМ
ОБРАЗЦОМ ПО СТРОКЕ И ПО СТОЛБЦУ
Рассматривается быстрый способ сопоставления с двумерным образцом, в котором ускорение сканирования
двумерного слова достигается за счет предварительной обработки образца. Вычисление позиций сдвига образца позволяет сократить время сканирования двумерного слова в горизонтальном и вертикальном направлениях.
Сформулируем задачу сопоставления с двумерным образцом. Образец представим в виде списка клеток в локальной прямоугольной системе координат
V = { (a 1 ,  x 1 , y1 ) , (a 2 ,  x 2 , y 2 ) , …, (a d ,  x d , y d ) }, где a i  A (i = 1, d ), обрабатываемое слово представим перечислением P  R клеток прямоугольной матрицы
W = { (b1,1 ,  1,1 ) , (b 2,1 ,  2,1 ) , …, (b p ,1 ,  p,1 ) ,
(b1, 2 ,  1,2 ) , (b 2, 2 ,  2,2 ) , …, (b p , 2 ,  p,2 ) ,
….,
(b1,r ,  1, r ) , (b 2,r ,  2, r ) , …, (b p ,r ,  p, r ) }, где a i , j  A (i = 1, p , j = 1, r ).
Клеткой будем называть пару (a,  x, y ) , где символ a является состоянием
клетки,  x, y  – именем клетки. Для образца (обрабатываемого слова) символ a –
это буква, которая расположена в x-ом столбце y-й строке в прямоугольной системе
координат.
Задача сопоставления образца V и слова W состоит в поиске двухкоординатных позиций вхождения V в слово W.
Будем называть буквы (a i ,  x i , y i ) образца V, координаты y i которых равны, столбцом образца, буквы (a j ,  x j , y j ) образца V, координаты x j которых равны, строкой.
Обозначим через m – максимальный индекс столбца образца, через n – максимальный индекс строки образца, количество букв образца в j-й строке через f j , ко-
личество букв образца в i-м столбце через g i , максимальный индекс буквы образца
в j-й строке через x max
, минимальный индекс в j-й строке через x min
, максимальный
j
j
индекс буквы образца в i-ом столбце через yimax , минимальный индекс в i-м столбце
через y imin .
Известен быстрый способ сопоставления с двумерным образцом, в котором
двумерный образец движется вдоль прямоугольной матрицы обрабатываемого слова
слева направо до ее правой границы, однако фактическое сравнение символов выполняется начиная с букв самого правого столбца образца. При успешном сопоставлении букв образца самого правого столбца, начиная с последней буквы этого
столбца, выполняется сопоставление букв предыдущего столбца, также начиная с
последней буквы столбца и т.д. При достижении правой границы обрабатываемого
слова процесс сканирования продолжается с левой границы слова со смещением на
одну строку вниз.
Первыми таким образом сравниваются символы A(m, y max
и B(s  m, t  y max
.
m )
m )
Если они не совпадают и B(s  m, t  y max
не встречается среди букв y max
-й строки
m )
m
образца, то согласно этому способу образец сдвигается по горизонтали на f y
max
m
пози-
ций вправо. Следующими сравниваются A(m, y max
и B(s  f m  m, t  y max
.
m )
m )
max
При обнаружении отвергающих символов A(m, j) , где y min
m  j  ym
и
B(s  m, t  j) , и при отсутствии среди букв j-й строки образца буквы B(s  m, t  j) ,
образец сдвигается по горизонтали на f j позиций вправо.
Если отвергающими являются символы A(i, j) и B(k, l) , то суффикс j-й строки
 1, j) равен подстроке обрабатываемого слова
образца A(i  1, j) , …, A ( x max
j
B(k  x max
 i  1, l) , …, B(k, l) , и A(i, j)  B(k  x max
 i, l) . При этом самым правым
j
j
 i, l) в j-й строке образца снова оказывается, например,
вхождением B(k  x max
j
A ( x max
 v, j) , образец сдвигается по горизонтали на (i  x max
 v) символов вправо,
j
j
 v, j) совпадает с позицией буквы обрабатытак что позиция буквы образца A ( x max
j
ваемого слова
B(k  x max
 i, l) . Процедура поиска продолжается сравнением
j
с соответствующим символом обрабатываемого слова, в данном случае с
A(m, y max
m )
B(k  i  x max
 v, l) . Приращение индекса, отвечающего за движение в горизонтальj
ном направлении по обрабатываемому слову с позиции несовпадения до следующей
 v) – (k  x max
 i) = v .
пробной позиции, равно, таким образом, (k  i  x max
j
j
 v, j) располагается правее A(i, j) , то значение (i  x max
 v) отЕсли A ( x max
j
j
 v, j) с B(k  i  x max
 v, l) оказывается непродукрицательно и совмещение A ( x max
j
j
тивным, поскольку приводит к отступу. В этих обстоятельствах образец сдвигают на
одну позицию вправо и сравнивают A(m, y max
с B(k  1, l) . Для этого индекс, отвеm )
чающий за движение в горизонтальном направлении по обрабатываемому слову,
 i) = ( x max
 1  i) .
увеличивают на (k  1) – (k  x max
j
j
Приращения v, используемые для перемещения по обрабатываемому слову в
горизонтальном направлении в случаях обнаружения отвергающих символов, вычисляются заранее для каждой строки образца отдельно и хранятся в таблицах
delta[n]. В процессе поиска доступ к таблице j-й строки образца delta[j] осуществляется по отвергающим символам обрабатываемого слова, поэтому размер каждой
таблицы равен мощности используемого алфавита символов.
При формировании таблицы delta[j] вход для символа w равен (f j  i) , где
A(i, j) – самое правое вхождение w в j-ю строку образца, и равен f j , если w не со-
держится в j-й строке образца, то есть:
 v, j) = w)}
delta[j][w] = min {v : v = f j или ( 0  v  f j и A ( x max
j
Таблица delta[j] для алфавита  инициализируется следующим образом:
for j := 1 to n do
for w := 1 to |  |
delta[j][w] :=
fj
for j := 1 to n do
for i :=
x min
j
to
x max
j
delta[j][A(i, j)] :=
x max
j
– i
Отсюда видно, что время инициализации n таблиц delta равно
n
O(n  (|  |  f j )) .
j1
Проиллюстрируем работу одной таблицы delta для одномерного образца
x = ABCDB (m = 5 – длина образца).
w
A B C D E F G H …
delta[w] 4 0 2 1 5 5 5 5 …
Несовпадение возникает при y i  A .
x – образец
y – текст
A B C D B
…L M N A B C D B …
i
Следующими сравниваются символы x m и y idelta[ A ] , то есть y i  4 .
образец
текст
A B C D B
…L M N A B C D B …
i
i+4
На рис. 1 приведен алгоритм быстрого поиска по строке. Количество сравнеn
ний максимально и не превосходит (r  n  1)(p  m  1)   f j , когда все буквы обj1
разца, кроме отвергающего символа с координатами (1, y1min ) , на каждом этапе локального сопоставления совпадают с соответствующими буквами обрабатываемого
слова. Эффективность алгоритма ограничена снизу величиной (r  n  1)(mod(p / m)) ,
где функция mod – целая часть вещественного числа.
i := m;
s := m;
tb := 0;
while ( (tb <= r - n) и (s <= p) ) {
while ( (s > 0) и (i > 0) и (s <= p) ) {
max
j := y i ;
t := tb + j;
// поиск вхождения i-го столбца образца
// в направлении снизу вверх
while ( (t
if (A(i,
j := j
t := t
} else {
if (i -
min
> 0) и (j >= y i ) ) {
j) == B(s, t)) {
– 1;
– 1;
// несовпадение
fj
+ delta[j][B(s, t)] <= 0) {
s := s +
fj
+ 1 - i;
} else {
s := s + delta[j][B(s, t)];
}
i := m;
continue 2; // Продолжаем внешний цикл
}
}
// переход к поиску вхождения
// предыдущего столбца образца
i := i – 1;
s := s – 1;
}
if (i < 1) { // Проверка успешности сопоставления
// Область вхождения (s + 1, tb + 1)-(s + 1 + m, tb + 1 + n)
break;
}
// Переход к поиску вхождения образца относительно
// следующей строки обрабатываемого слова
i := m;
s := m;
tb := tb + 1;
}
Рис. 1. Алгоритм быстрого сопоставления с двумерным
образцом по строке
Из алгоритма быстрого поиска по строке следует, что сканирование обрабатываемого слова в вертикальном направлении всегда выполняется с постоянной скоростью, равной одной строке за один проход в горизонтальном направлении. В предлагаемом алгоритме быстрого поиска по строке и по столбцу теоретические основы
быстрого поиска по строке распространены на случай движения в вертикальном
направлении с сохранением быстрого сканирования в горизонтальном направлении.
Пусть в результате поиска вхождений двумерного образца алгоритмом быстрого поиска по строке обнаружены отвергающие символы A(i, j) и B(k, l) . Такое состояние характеризуется тем, что часть i-го столбца образца A(i, j  1) , …, A(i, yimax )
равна части k-го столбца обрабатываемого слова B(k, l  1) , …, B(k, l  yimax  j  1) , и
A(i, j)  B(k, l) . При этом самым нижним вхождением B(k, l) в i-ом столбце образ-
ца оказывается, например, A(i, yimax  v) , тогда образец может быть сдвинут по вертикали не на одну позицию при следующем проходе по строке, а на ( yimax  v) символов вниз. Следует заметить, что такой сдвиг возможен только на локальном
участке обрабатываемого слова в процессе его прохода по строкам. Для того чтобы
пропускать некоторые позиции сопоставления образца с частью обрабатываемого
слова, во временной памяти сохраняются позиции тех столбцов обрабатываемого
слова, в которых начинался процесс сравнения образца с частью обрабатываемого
слова и приводил к обнаружению отвергающего символа. Каждой такой позиции во
временной памяти ставится в соответствие номер строки обрабатываемого слова,
зависящий от максимального сдвига в вертикальном направлении, вычисленного на
этапе обнаружения отвергающего символа.
Прежде чем начать очередной этап сравнения образца с частью двумерного
слова, который всегда состоит в сравнении букв A(m, Ymmax ) и B(s+m,t+ Ymmax ), номер
столбца (s+m) слова, с которым первым будет сопоставлен m-й столбец образца,
проверяется на наличие во временной памяти. При отсутствии номера столбца во
временной памяти, переходят собственно к последовательному сравнению букв образца и части слова в известном порядке. Если номер столбца (s+m) найден во временной памяти, извлекается соответствующий ему номер строки двумерного слова,
с которого следует начинать двумерное сопоставление, вычисленный в результате
обнаружения отвергающего символа на предыдущем этапе поиска. Если этот номер
больше текущего номера строки слова (t+ Ymmax ), то процесс сравнения в столбце
(s+m) не начинается, а переходят к следующей итерации в столбце слова (s+m+1).
Приращения v, используемые для ускорения перемещения по обрабатываемому слову в вертикальном направлении, вычисляются заранее для каждого столбца
образца отдельно и хранятся в таблицах delta2[m]. В процессе поиска доступ к таблице i-го столбца образца delta2[i] осуществляется по отвергающим символам обрабатываемого слова, поэтому размер каждой таблицы равен мощности используемого
алфавита символов. Правило генерации таблиц delta2 аналогично правилу формирования таблиц delta.
Таким образом, общее время инициализации n+m сдвиговых таблиц равно
n
m
j1
j1
O(n  (|  |  f j )  m  (|  |  g j )) .
На рис. 2 приведен алгоритм быстрого поиска по строке и по столбцу.
i := m;
s := m;
tb := 0;
bs := s;
while ( (tb <= r - n) и (s <= p) ) {
while ( (s > 0) и (i > 0) и (s <= p) ) {
max
j := y i ;
t := tb + j;
// тест на возможность пропуска
// сопоставления в этой области
if ( mem[bs] <= t ) {
// поиск вхождения i-го столбца образца
// в направлении снизу вверх
while ( (t
if (A(i,
j := j
t := t
} else {
if (j -
min
> 0) и (j >= y i ) ) {
j) == B(s, t)) {
– 1;
– 1;
// несовпадение
gi
+ delta2[i][B(s, t)] <= 0) {
mem[bs] := t + g i – j;
} else {
mem[bs] := t + delta2[i][B(s, t)];
}
if (i s :=
fj
fj
+ delta[j][B(s, t)] <= 0) {
+ 1 - i;
} else {
s := s + delta[j][B(s, t)];
}
i := m;
bs := s;
continue 2; // Продолжаем внешний цикл
}
}
} else {
s := s + 1;
bs := s;
continue; // новая итерация
}
// переход к поиску вхождения
// предыдущего столбца образца
i := i – 1;
s := s – 1;
}
if (i < 1) { // Проверка успешности сопоставления
// Область вхождения (s + 1, tb + 1)-(s + 1 + m, tb + 1 + n)
break;
}
// Переход к поиску вхождения образца относительно
// следующей строки обрабатываемого слова
i := m;
s := m;
bs := s;
tb := tb + 1;
}
Рис. 2. Алгоритм быстрого сопоставления с двумерным
образцом по строке и по столбцу
В таблицах 1, 2 представлены численные результаты сравнения эффективности прямого подхода к сопоставлению с двумерным образцом, алгоритма быстрого
поиска по строкам обрабатываемого слова и алгоритма быстрого поиска по строкам
и по столбцам обрабатываемого слова. В машинном эксперименте № 1 решалась задача сопоставления обрабатываемого слова, состоящего из 1024 строк и 1024 столбцов, с квадратным двумерным образцом, состоящим из n строк и n столбцов, где n
варьировалось от 1 до 10, в случае отсутствия вхождений образца. В машинном эксперименте № 2 решалась задача сопоставления обрабатываемого слова, состоящего
из 1024 строк и 1024 столбцов, с прямоугольным двумерным образцом, состоящим
из n строк и 4-х столбцов, где n варьировалось от 1 до 10, в случае отсутствия вхождений образца. Обрабатываемое слово и образец генерировались при помощи датчика псевдослучайных чисел, распределенных по равномерному закону. Использовался 48-ми буквенный алфавит.
На рис. 3 изображен график зависимости количества сравнений символов от
конфигурации образца n x n для прямого подхода к сопоставлению, быстрого сопоставления по строкам обрабатываемого слова и быстрого сопоставления по строкам
и по столбцам. Количество сравнений символов в таблице 1 и на рис. 3 приведено в
масштабе 1:1000.
На рис. 4 изображен график зависимости количества сравнений символов от
конфигурации образца n x 4 для прямого подхода к сопоставлению, быстрого сопоставления по строкам обрабатываемого слова и быстрого сопоставления по строкам
и по столбцам. Количество сравнений символов в таблице 2 и на рис. 4 приведено в
масштабе 1:1000.
Несложно заметить, что эффективность прямого подхода к сопоставлению с
двумерным образцом в обоих экспериментах линейна относительно конфигурации
образца. В машинном эксперименте № 1 алгоритм быстрого поиска по строкам и по
столбцам с ростом n демонстрирует большую производительность по сравнению с
алгоритмом поиска по строкам. Выигрыш достигает 25 % при сопоставлении с образцом 10 x 10 символов. В машинном эксперименте № 2 эффективность алгоритма
быстрого поиска по строкам приблизительно равна константе и не зависит от коли-
чества строк образца, в то время как алгоритм поиска по строкам и по столбцам демонстрирует повышенную производительность, которая линейна относительно количества строк образца, и при обработке образца 10 x 4 символов в 2,4 раза больше,
производительности алгоритма поиска по строке.
Таблица 1
Сравнение эффективности способов сопоставления
с двумерным образцом в конфигурации n x n символов
Алгоритм сопоставления
Прямой подход
Быстрый поиск по строке
Быстрый поиск по строке
и по столбцу
1
1049
1049
1049
2
1069
540
515
Длина образца, буквы
4
5
6
7
1065
1063
1060
1058
280
229
195
171
235
185
155
134
3
1067
366
324
8
1056
150
118
9
1054
135
106
10
1052
129
97
Кол-во сравнений символов
1200
1000
800
600
400
200
0
1
2
3
4
5
6
7
8
9
10
Длина образца, буквы
Прямой подход
Быстрый поиск по строке
Быстрый поиск по строке и по столбцу
Рис. 3. График зависимости количества сравнений символов, требуемых
для поиска всех вхождений двумерного образца с конфигурацией n x n,
от количества строк (столбцов) n образца
Таблица 2
Сравнение эффективности способов сопоставления
в конфигурации n x 4 символов
Алгоритм сопоставления
Прямой подход
Быстрый поиск по строке
Быстрый поиск по строке
и по столбцу
1
1068
278
278
2
1066
276
272
3
1065
276
258
Длина образца, буквы
4
5
6
7
1065
1064
1063
1062
275
275
275
275
233
200
175
155
8
1061
274
137
9
1059
274
125
10
1058
273
114
Кол-во сравнений символов
1200
1000
800
600
400
200
0
1
2
3
4
5
6
7
8
9
10
Длина образца, буквы
Прямой подход
Быстрый поиск по строке
Быстрый поиск по строке и по столбцу
Рис. 4. График зависимости количества сравнений символов, требуемых
для поиска всех вхождений двумерного образца с конфигурацией n x 4,
от количества строк n образца
СПИСОК ЛИТЕРАТУРЫ
1. Корректность параллельных вычислительных процессов/Ачасова С.М.,
Бандман О. Л. – Новосибирск: Наука. Сиб. отд-ние, 1990. – 253 с.
2. Специализированные процессоры для высокопроизводительной обработки
данных/Бандман О. Л., Миренков Н. Н., Седухин С. Г. и др. – Новосибирск: Наука,
1988.
3. Boyer R.S., Moore J.S. (1977) "A fast string searching algorithm,"
Communications of the ACM, Vol. 20, No. 10, p. 762-72, October 1977.
4. Knuth D.E., Morris (Jr) J.H., Pratt V.R., 1977, Fast pattern matching in strings,
SIAM Journal on Computing 6(1):323-350.
Download