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 )) . 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 На рис. 1 приведен алгоритм быстрого поиска по строке. Количество сравне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-го столбца образца // в направлении снизу вверх 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 j1 j1 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.