FAST WAY OF TWO-DIMENSIONS PATTERN MATCHING 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 direction (можно сказать по строкам - rows). Рассматривается быстрый способ сопоставления с двумерным образцом, в котором ускорение сканирования двумерного слова достигается за счет предварительной обработки образца. Вычисление позиций сдвига образца позволяет сократить время сканирования двумерного слова в горизонтальном направлении. БЫСТРЫЙ СПОСОБ СОПОСТАВЛЕНИЯ С ДВУМЕРНЫМ ОБРАЗЦОМ 1. ОСНОВНЫЕ ПОНЯТИЯ И ОБОЗНАЧЕНИЯ Обозначим через А конечный алфавит, через М множество имен, имеющее мощность не более счетной. Определение 1. Пара (символ алфавита, имя) называется клеткой и обозначается (a, m) A M . Символ a называется состоянием клетки, m – именем клетки. Определение 2. Множество клеток W A M , в котором нет двух клеток с одинаковыми именами, называется клеточным множеством. Определение 3. Конечное клеточное множество W = { (a 1 , m1 ) , (a 2 , m 2 ) , …, (a n , m n ) } называется словом. Слово можно представить в наглядной геометрической форме, если множество имен M интерпретировать точками пространства. Слово W = { (a,1) , (b,1) , (a ,2) , (b,3) } имеет линейную форму и располагается в одномерной целочисленной решетке. Имена клеток являются координатами узлов этой решетки, а узлы помечены символами алфавита А – состояниями клеток. Слово W = { (a, 2,2 ) , (b, 2,3 ) , (c, 3,3 ) , (c, 3,4 ) } располагается в двумерной решетке, как показано на рис. 1. y d 4 3 b 2 a c 1 1 2 3 x Рис. 1. Пример двумерного слова Далее слова будем представлять помещенными в целочисленную прямоугольную решетку размерности n, n = 1, 2, …. Тогда множество имен можно представить в виде M = N n , где N = {1, 2, …}. Определение 4. Два слова Wi и Wj пересекаются, если в них есть одинаковые клетки (с одинаковыми именами и состояниями) и множество Wi Wj является словом. Определение 5. Два слова Wi и Wj равны, если для каждой клетки слова Wi найдется точно такая же клетка в слове Wj и слова Wi и Wj состоят из одинакового количества клеток. Определение 6. Слово Wi входит в слово Wj , если для каждой клетки слова Wi найдется точно такая же клетка в слове Wj и слово Wi состоит из такого количества клеток, что оно меньше или равно количеству клеток в слове Wj . Определение 7. Процесс поиска вхождений слова Wi в слове Wj называется сопоставлением. Поиск всех непересекающихся вхождений слова Wi в слове Wj называется глобальным сопоставлением. Для формулирования задачи сопоставления с двумерным образцом шаблон представим в виде списка клеток в локальной прямоугольной системе координат 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 ). Задача сопоставления образца и 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 . Введенные обозначения рассмотрим для образца V = { (b, 1,1 ) , (b, 2,1 ) , (c, 3,1 ) , (d, 2,2 ) , (a, 3,2 ) , (a, 2,3 ) , (a , 3,3 ) }, изображенного на рис. 2. 1 2 3 b b c 2 d a 3 a a 1 y x Рис. 2. Пример двумерного образца V в локальной прямоугольной системе координат Для двумерного образца V: n = 3, m = 3, f 1 =3, f 2 =2, f 3 =2, g 1 =1, g 2 =3, g 3 =3, =2, x max =3, x 3min =2, x 3max =3, y1min =1, y1max =1, y min =1, y max =3, y 3min =1, x1min =1, x1max =3, x min 2 2 2 2 y3max =3. Также мы будем полагать, что существует способ получения буквы образца (обрабатываемого слова) по координатам x, y, и будем рассматривать образцы, столбцы (строки) которых представляют собой слова, не содержащие пробелов. 2. ПРЯМОЙ ПОДХОД К СОПОСТАВЛЕНИЮ Поиск вхождения двумерного образца начинается с сопоставления обрабатываемого слова с 1-й строкой образца. При успешном результате сопоставления необходимо сопоставить 2-ю строку образца с соответствующей подстрокой следующей строки обрабатываемого слова и т.д., пока не будут успешно сопоставлены все строки образца или не будет достигнут конец строки обрабатываемого слова. При обнаружении отвергающего символа (символ образца называется отвергающим, если в процессе сопоставления он не совпал с очередным символом обрабатываемого слова; с тем же основанием отвергающим называется и соответствующий символ обрабатываемого слова) процесс сопоставления с двумерным образцом снова начинается с поиска вхождения 1-й строки образца в позиции на единицу большей позиции обнаружения частичного вхождения. Если вхождение образца при просмотре слова слева направо обнаружить не удалось, выполняется поиск вхождения образца со следующей строки слова и т. д., пока не будет обнаружено вхождение или не будет достигнута последняя строка обрабатываемого слова. При каждой новой итерации построчного сопоставления образца с соответствующими буквами обрабатываемого слова сравниваются не более n f j1 j символов, так что суммарное количество проверок при сканировании образца в горизонтальном направлении относительно одной фиксированной строки n обрабатываемого слова не превосходит (p m 1) f j . Тогда общее количество j1 проверок при сканировании образца в горизонтальном направлении по всем строкам n обрабатываемого слова не превосходит (r n 1)(p m 1) f j . Количество j1 сравнений максимально, когда отвергающим символом является буква образца с координатами (m, y max . Количество сравнений минимально, когда отвергающим m ) символом является первая буква первой строки образца, и равно (r n 1)(p m 1). Однако на практике подобные ситуации встречаются редко. Средняя n эффективность равна O(r p f j ) , так как отвергающие символы, как правило, j1 приходятся не на последнюю букву последней строки образца, а гораздо раньше. Очевидно, что реальная эффективность прямого подхода к сопоставлению зависит от реальных свойств как двумерного образца, так и обрабатываемого слова. Алгоритм, реализующий прямой подход, приведен на рис. 3. В самом начале пара индексов (i, j) образца указывает на первый символ первой строки образца, пара (s, t) индексов обрабатываемого слова указывают на символ, с которым первым будет сопоставлен символ образца (i, j). Индексы sb и tb задают глобальное смещение локальной области сопоставления с двумерным образцом. Индекс sb увеличивается каждый раз на 1 при обнаружении отвергающего символа. Индекс tb увеличивается на 1, когда горизонтальное сканирование (индекс sb) достигает правой границы обрабатываемого слова. При равенстве очередного i-го символа j-й строки образца и (s, t) символа обрабатываемого слова осуществляется сравнение (i+1)-го символа j-й строки образца и (s+1, t) символа слова, пока не будут успешно сопоставлены все символы j-й строки образца или до обнаружения отвергающего символа, после чего индексы переустанавливаются, и пара (i, j) снова указывает на первый символ первой строки образца, а пара (s, t) на следующую локальную область сопоставления. Если вхождение двумерного образца обнаружено, то пары индексов (sb+1, tb+1) и (sb+1+m, tb+1+n) задают верхний левый и нижний правый углы локальной области вхождения образца в обрабатываемом слове. j := 1; t := 1; sb := 0; tb := 0; while ( (tb <= r – n) и (sb <= p - m) ) { while ((sb <= p - m) и (j <= n) ) { i = x min ; j s = sb + i while ( i <= x max j ) { // Поиск строки образца if (A(i, j) == B(s, t) ) { i := i + 1; s := s + 1; } else { // несовпадение sb := sb + 1; j := 1; continue 2; // Продолжаем внешний цикл } } // Переходим к поиску следующей // строки образца j := j + 1; t := t + 1; } if (j > n) { // проверка успешности сопоставления // Область вхождения (sb+1, tb+1)-(sb+1+m, tb+1+n) break; } // Переходим к сканированию // относительно следующей строки слова j := 1; sb := 0; tb := tb + 1; } Рис. 3. Сопоставление с двумерным образцом прямым методом 3. БЫСТРЫЙ ПОИСК ПО СТРОКЕ В предлагаемом алгоритме двумерный образец движется вдоль прямоугольной матрицы обрабатываемого слова слева направо до ее правой границы, однако фактическое сравнение символов выполняется начиная с букв самого правого столбца образца. При успешном сопоставлении букв образца самого правого столбца в порядке снизу вверх выполняется сопоставление предыдущего столбца снизу вверх и т.д. При достижении правой границы обрабатываемого слова процесс сканирования начинается с левой границы слова и со смещением на одну строку вниз. Первыми таким образом сравниваются символы 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 позиций вправо, так как можно быть уверенным, что ни одна из начинающихся с одной из первых (s m) позиций подстрок (t y max -й строки обрабатываемого слова не совпадает с y max -й m ) 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(m, y max и B(k, l) . Как уже m ) отмечалось, если B(k, l) не содержится нигде в y max -й строке образца, шаблон m можно сдвинуть на f y max m позиций вправо. С другой стороны, если B(k, l) присутствует в образце и A(m v, y max – его самое правое вхождение в y max -й m ) m строке, то образец можно сдвинуть лишь на v позиций вправо, совмещая с B(k, l) . Поиск можно продолжить сравнением A(m, y max с A(m v, y max m ) m ) B(k v, l) , то есть индекс отвечающий за движение в горизонтальном направлении по обрабатываемому слову увеличиваем на v. Если A(m, y max и B(k, l) совпадают, нужно сравнивать все символы в m-м m ) столбце образца и с соответствующими символами k-го столбца обрабатываемого слова, пока весь подстолбец обрабатываемого слова не будет сопоставлен со столбцом образца или пока не встретится несовпадение. Когда вхождение m –го столбца будет определено, необходимо перейти к сопоставлению (m-1)-го столбца образца с соответствующими символами (k-1)-го столбца обрабатываемого слова и т.д. Если отвергающим оказался, например, символ A(i, j) , то мы знаем, что суффикс j-й строки образца A(i 1, j) , …, A ( x max 1, j) j равен подстроке i 1, l) , …, B(k, l) , и A(i, j) B(k x max i, l) . обрабатываемого слова B(k x max j j i, l) в j-й строке образца снова Теперь, если самым правым вхождением B(k x max j v, j) , образец можно сдвинуть по горизонтали на является, например, A ( x max j v, j) окажется на одной позиции с (i x max v) символов вправо, так что A ( x max j j B(k x max i, l) . Процедуру поиска следует продолжить сравнением A(m, y max с j 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 )) . j1 Проиллюстрируем работу одной таблицы 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 idelta[ A ] , то есть y i 4 . образец текст A B C D B …L M N A B C D B … i i+4 На рис. 4 приведен быстрый алгоритм сопоставления двумерного образца с прямоугольной матрицей символов, представляющей обрабатываемое слово. n Количество сравнений максимально и не превосходит (r n 1)(p m 1) f j , j1 когда все буквы образца, кроме отвергающего символа с координатами (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-го столбца образца // в направлении снизу вверх min while ( (t > 0) и (j >= y i ) ) { if (A(i, j) == B(s, t)) { j := j – 1; t := t – 1; } else { // несовпадение if (i > delta[j][B(s, t)]) { 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; } Рис. 4. Сопоставление с двумерным образцом методом быстрого сканирования по строке 4. СРАВНЕНИЕ ЭФФЕКТИВНОСТИ В таблице представлены численные результаты сравнения эффективности прямого подхода к сопоставлению с двумерным образцом и быстрого поиска по строкам обрабатываемого слова. В машинном эксперименте решалась задача сопоставления обрабатываемого слова, состоящего из 1024 строк и 1024 столбцов, с двумерным образцом, состоящим из n строк и n столбцов, где n варьировалось от 1 до 10, в случае отсутствия вхождений образца. Обрабатываемое слово и образец генерировались при помощи датчика псевдослучайных чисел, распределенных по равномерному закону. Использовался 48-ми буквенный алфавит. На рис. 5 изображен график зависимости количества сравнений символов от конфигурации образца для прямого подхода к сопоставлению и быстрого сопоставления по строкам обрабатываемого слова. Количество сравнений символов в таблице и на рис. 5 приведено в масштабе 1:1000. Несложно заметить, что эффективность прямого подхода к сопоставлению с двумерным образцом линейна относительно конфигурации образца, эффективность быстрого поиска по строкам с ростом n стремиться к числу, кратному n 2 . Таблица Сравнение эффективности способов сопоставления с двумерным образцом Алгоритм сопоставления Прямой подход Быстрый поиск по строке 1 2 1069 540 1049 1049 Длина образца, буквы 4 5 6 7 1065 1063 1060 1058 280 229 195 171 3 1067 366 8 1056 150 9 1054 135 10 1052 129 Кол-во сравнений символов 1200 1000 800 600 400 200 0 1 2 3 4 5 6 7 8 9 10 Длина образца, буквы Прямой подход Быстрый поиск по строкам Рис. 5. График зависимости количества сравнений символов, требуемых для поиска всех вхождений двумерного образца образца, от длины образца СПИСОК ЛИТЕРАТУРЫ 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.