Forbidden

You don't have permission to access /zzz_siteguard.php on this server.

СПОСОБ НАХОЖДЕНИЯ МАКСИМАЛЬНЫХ ПОВТОРЯЮЩИХСЯ УЧАСТКОВ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ КОНЕЧНОГО АЛФАВИТА И СПОСОБ ВЫЧИСЛЕНИЯ ВСПОМОГАТЕЛЬНОГО МАССИВА
Главная страница  |  Описание сайта  |  Контакты
Патент на изобретение №2473960

(19)

RU

(11)

2473960

(13)

C2

(51) МПК G06F17/00 (2006.01)

G06F7/74 (2006.01)

H03M7/30 (2006.01)

(12) ОПИСАНИЕ ИЗОБРЕТЕНИЯ К ПАТЕНТУ Статус: по данным на 17.01.2013 - нет данных Пошлина:

(21), (22) Заявка: 2010120949/08, 26.05.2010

(24) Дата начала отсчета срока действия патента:

26.05.2010

Приоритет(ы):

(22) Дата подачи заявки: 26.05.2010

(43) Дата публикации заявки: 10.12.2011

(45) Опубликовано: 27.01.2013

(56) Список документов, цитированных в отчете о

поиске: US 6226628 В1, 01.05.2001. US 5883588 А, 16.03.1999. ЕР 0129439 В1, 01.02.1989. RU 2377670 С2, 27.12.2009. RU 2212709 С1, 20.09.2003.

Адрес для переписки:

117997, Москва, В-342, ГСП-7, ул. Профсоюзная, 65, ИПУ, патентный отдел

(72) Автор(ы):

Грузман Владимир Аронович (RU),

Алчинов Александр Иванович (RU),

Иванов Анатолий Витальевич (RU)

(73) Патентообладатель(и):

Учреждение Российской академии наук Институт проблем управления им. В.А. Трапезникова РАН (RU)

(54) СПОСОБ НАХОЖДЕНИЯ МАКСИМАЛЬНЫХ ПОВТОРЯЮЩИХСЯ УЧАСТКОВ ПОСЛЕДОВАТЕЛЬНОСТИ СИМВОЛОВ КОНЕЧНОГО АЛФАВИТА И СПОСОБ ВЫЧИСЛЕНИЯ ВСПОМОГАТЕЛЬНОГО МАССИВА

(57) Реферат:

Изобретение относится к компьютерной обработке цифровых данных, точнее к способам сжатия массивов цифровой информации путем нахождения совпадающих фрагментов последовательности данных. Техническим результатом является уменьшение количества памяти, требующейся для представления всех максимальных повторяющихся участков. Для нахождения максимальных участков в конечной последовательности символов x[i] (0 isl[m-1]-1, а конечный индекс n равен m+sl[m]-1, для чего для каждого значения i проверяют выполнение условия sl[i]>sl[i-1]-1, и в случае выполнения этого условия устанавливают в битовых массивах beg[i] и end[i] значения beg[i]=1 и end[i+sl[i]]=1. Совокупность всех указанных максимальных участков восстанавливают по двум битовым массивам beg[i] и end[i]. 2 н. и 1 з.п. ф-лы, 2 ил.

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

Как указано в описании патента США 6400289 (раздел «Уровень техники»), существует три типа способов сжатия последовательности цифровых данных без потери информации, а именно статистическое кодирование, словарное кодирование и грамматическое кодирование. Наиболее известными алгоритмами словарного кодирования являются алгоритмы Лемпеля-Зива и их варианты. Методы словарного кодирования обеспечивают сжатие информации за счет использования избыточности данных через некоторый механизм сопоставления строк еще не закодированных данных с данными, которые уже закодированы. При этом объем вспомогательных данных, необходимых для организации эффективного поиска совпадений еще не закодированных данных с уже закодированными данными, может в несколько раз превышать объем собственно закодированных данных. В случае сжатия очень больших файлов это приводит к тому, что область поиска приходится ограничивать только самыми последними закодированными данными, используя так называемое скользящее окно поиска, длина которого может составлять десятки или сотни килобайт. Различные варианты такого поиска приведены в следующих патентах.

В патенте США 4464650 (п.123 формулы в части сжатия) предложен способ сжатия цифровых данных, в котором разбивают последовательность данных на отрезки, каждый из которых включает в себя префикс и следующий за этим префиксом символ. Префикс представляет собой самое длинное совпадение с более ранним отрезком, причем указанное разбиение определяет дерево поиска, имеющее узлы и ветви, выходящие из указанных узлов. Каждый узел имеет самое большее одну входящую ветвь. Выходящие из узла ветви представляют соответствующие символы указанного алфавита, узлы имеют соответствующие связанные с ними метки и адреса, причем дерево поиска имеет единственный коревой узел без входящих ветвей и листовые узлы без выходящих ветвей. При этом каждому узлу дерева приписывается виртуальный адрес, соответствующий номеру данного узла дерева в полном дереве поиска, частью которого является указанное дерево. Меткой узла является порядковый номер появления узла в дереве в процессе его построения. Таблица меток является массивом F, выдающим для каждого виртуального адреса метку узла, приписанную узлу с этим виртуальным адресом. Поскольку в общем случае имеется намного больше адресов, чем меток, большая часть таблицы меток является пустой, и для экономного хранения используют хеширование части массива с большими адресами. Таким образом, метка может записываться прямо в массив F по самому виртуальному адресу, или виртуальные адреса могут использоваться как входной ключ к хеш-функции, которая вычисляет реальный адрес в F, по которому записывается метка. Память, выделенная для меток узлов в массиве F, разбивается в начале кодирования на прямую и хешированную части. При этом начальная (верхняя) часть таблицы меток F записывается прямо, чтобы сэкономить время, поскольку обращение к ней происходит часто. Более поздние части таблицы меток хешируются, чтобы сэкономить память, поскольку обращение к ним происходит реже. Для обратного преобразования используется таблица адресов - массив G, выдающий для каждой метки узла виртуальный адрес узла. Массив G является обратным к массиву F и для каждой метки узла содержит приписанный ему виртуальный адрес. Поскольку таблица адресов G имеет размер, равный числу внутренних узлов, она не требует хеширования.

Как указано в абзаце 2 колонки 22 описания патента США 4464650, в программной реализации этого способа секция 4 программы кодирования выполняет корректировку дерева поиска до тех пор, пока не будет достигнут максимальный размер дерева КМ. Данная программа сохраняет дерево в статическом состоянии, когда исчерпана выделенная память. В другом варианте память под дерево поиска может быть освобождена и начат рост нового дерева. Счетчик К внутренних узлов увеличивается, и метка К внутреннего узла записывается по надлежащему адресу в массив таблицы меток F. Таким образом, недостатком этого способа является ограниченная длина поиска.

В патенте США 4558302 (п.107 формулы изобретения) предложен способ сжатия потока сигналов символов данных в сжатый поток кодовых сигналов, содержащий шаги:

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

поиск в указанном потоке сигналов символов данных путем сравнения указанного потока с указанными записанными в память строками, чтобы определить самое длинное соответствие между ними;

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

назначение кодового сигнала, соответствующего указанной расширенной строке;

выдача кодового сигнала, связанного с указанным самым длинным соответствием, для получения указанного сжатого потока кодовых сигналов.

Как указано в абзаце 2 колонки 7 описания США 4558302, данный способ использует ограниченную длину поиска, т.е. ему присущ тот же недостаток, что и предыдущему способу.

В патенте США 4906991 предложен способ сжатия цифровых данных, в котором для поиска совпадающих фрагментов используются дерево поиска и скользящее окно поиска, причем согласно абзацу 1 колонки 25 описания максимальный размер окна может выбираться в пределах от 1000 до 63000. При этом реализация дерева поиска в виде так называемого суффиксного дерева позволяет провести весь поиск за время, линейно зависящее от длины массива цифровых данных.

В патенте США 6292115 предложен способ реализации дерева поиска в виде словаря кодовых слов, причем подробно описаны несколько вариантов словаря, содержащего 1024 кодовых слова, и отмечено, что словарь может содержать и 512, 2048, 4096 или больше кодовых слов (колонка 7 описания, 3-й абзац снизу).

Все вышеуказанные способы реализуются так называемыми «жадными» алгоритмами, когда каждый раз при кодировании оставшейся незакодированной части последовательности данных в ней производится поиск максимального фрагмента, совпадающего с некоторым фрагментом уже закодированной части данных и начинающегося с начала оставшейся незакодированной части. Недостатком этих способов является то, они не позволяют находить ситуации, когда более предпочтительной является добавление литерала, хотя существует длинный повторяющийся фрагмент, начинающийся непосредственно с начала оставшейся незакодированной части. Пример такой ситуации показан на фиг.1. На этой фигуре горизонтальной прямой условно показана строка данных, заштрихованная часть 1 которой уже закодирована. Сверху и снизу от этой прямой длинными узкими прямоугольниками показаны максимальные фрагменты, совпадающие с некоторыми фрагментами в уже закодированной части.

Символами "а" и "b" показаны реальные символы "а" и "b", присутствующие в строке данных. Позиции 2, 3, 4 указывают на фрагменты, выделяемые «жадным» алгоритмом. Позиции 5 и 6 указывают на другие максимальные фрагменты, совпадающие с некоторыми фрагментами в уже закодированной части. «Жадный» алгоритм кодирования предложит закодировать оставшуюся незакодированной часть последовательности путем кодирования фрагментов 2, 3 и 4 как копий ранее частей ранее закодированной начальной части 1 последовательности. В то же время имеется возможность закодировать оставшуюся незакодированной часть последовательности путем кодирования символов "а" и "b" в виде литералов и фрагментов 5 и 4 в виде копий частей ранее закодированной начальной части 1 последовательности. Таким образом, вместо двух копий фрагментов последовательности можно использовать одну копию фрагмента и два литерала. В большинстве схем кодирования типа Лемпеля-Зива второй вариант является более экономным. Тем самым предпочтительно использовать «нежадные» алгоритмы кодирования.

В патенте США 5883588 (описание второй реализации изобретения) предложена модификация этого подхода, не являющаяся «жадной». При кодировании последовательности данных x(i) после того как закодирована строка из первых s-1 символов, находят самое длинную подстроку x(s), x(s+j), совпадающую с ранее закодированными данными, и если она является недостаточно длинной, то находят самую длинную совпадающую подстроку x(s+1), x(s+j ) символов из подстрок символов, начинающихся с символа x(s+1). Сравнивают длину совпадения j с длиной совпадения j , и если j больше, то x(s) кодируют в режиме литерала, a x(s+1), x(s+j ) кодируют в режиме копирования. С другой стороны, когда длина совпадения j больше или равна длине совпадения j , то x(s), x(s+j) кодируют в режиме копирования. Далее процесс переходит к кодированию строк символов, начинающихся соответственно с x(s+j +1) или с x(s+j+1). Недостатком этого способа является то, что он обеспечивает выявление литералов только длиной в один символ, т.е. отличается от «жадного» способа весьма незначительно.

В патенте США 6226628 (п.1 формулы изобретения) предложен способ предобработки файла данных для последующего сжатия, где файл данных имеет множество упорядоченных элементов данных, где соответствующие элементы данных начинают строки разных длин, включающий в себя:

создание множества указателей смещений для разных длин совпадений, где указатели смещения для определенной длины совпадения указывают смещения от соответствующих элементов данных до предыдущих строк этой длины совпадения, которые совпадают со строками этой длины совпадения, начинающимися с соответствующих элементов данных;

запоминание индексов смещений в ассоциации с файлом данных.

Как видно из фиг.6 и соответствующего описания в патенте США 6226628, объем данных, необходимых для хранения таких указателей, в несколько раз превышает объем исходного файла, что делает возможным применение этого способа только для файлов умеренного объема или только на очень мощных серверах.

Исходя из изложенного, актуальной является разработка способа нахождения всех максимальных участков в конечной последовательности символов x[i] (0 i
При этом в обоих способах достигается технический результат, состоящий в уменьшении количества памяти, требующейся для представления всех максимальных повторяющихся участков, до 2N бит (N/4 байт, т.е. ¼ от объема исходной последовательности).

Первый способ нахождения всех максимальных участков в конечной последовательности символов x[i] (0 i
создают в памяти компьютера два битовых массива beg[i] и end[i] (0 i
заполняют все элементы указанных битовых массивов нулями;

вычисляют последовательность s 1 [i] по всем N значениям индексов i (0 i
определяют все указанные максимальные участки как все отрезки x[m,n] последовательности x[i], для которых начальный индекс m удовлетворяет условию s 1 [m]>s 1 [m-1]-11, а конечный индекс n равен m+s 1 [m]-1, для чего для каждого значения i проверяют выполнение условия s 1 [i]>s 1 [i-1]-1, и в случае выполнения этого условия устанавливают в битовых массивах beg[i] и end[i] значения beg[i]=1 и end[i+s 1 [i]]=1;

совокупность всех указанных максимальных участков восстанавливают по двум битовым массивам beg[i] и end[i], где единичное значение i-го элемента означает, что i-я позиция в указанной последовательности является, соответственно, началом и концом некоторого максимального указанного участка.

Второй способ нахождения всех максимальных участков в конечной последовательности символов x[i] (0 i
создают в памяти компьютера два битовых массива beg[i] и end[i] (0 i
заполняют все элементы указанных битовых массивов нулями;

вычисляют последовательность s 2 [i] по всем N значениям индексов i (0 i
определяют все указанные максимальные участки как все отрезки x[m,n] последовательности x[i], для которых конечный индекс n удовлетворяет условию s 2 [n]>s 2 [n+1]-1, а начальный индекс n равен n-s 2 [n]+1, для чего для каждого значения i проверяют выполнение условия s 2 [i]>s 2 [i+1]-1, и в случае выполнения этого условия устанавливают в битовых массивах beg[i] и end[i] значения end[i]=1 и beg[i-s 2 [i]+1]=1;

совокупность всех указанных максимальных участков восстанавливают по двум битовым массивам beg[i] и end[i], где единичное значение i-го элемента означает, что i-я позиция в указанной последовательности является, соответственно, началом и концом некоторого максимального указанного участка.

Изобретение поясняется графическими материалами.

Фиг.1. Пример неоптимальности «жадного» алгоритма.

Фиг.2. Типичный вид графика функции s 1 [i].

Осуществление изобретения

1. Основные понятия

Прежде чем перейти к подробному описанию осуществления вышеизложенных способов, необходимо ввести некоторые понятия, связанные с поиском повторяющихся фрагментов в последовательности символов. Для заданной последовательности символов x[i] (0 i
В случае прохождения последовательности вперед для заданного фрагмента х[m,n] (0 m n0), совпадающих с фрагментом х[m,n], т.е. пытаются найти такое d>0, что x[i]=x[i-d] для всех i, где m i n. В случае прохождения последовательности назад для заданного фрагмента х[m,n] (0 m n0), совпадающих с фрагментом х[m,n], т.е. пытаются найти такое d>0, что x[i]-x[i+d] для всех i, где m i n. Другими словами, при любом порядке прохождения последовательности для фрагмента х[m,n] пытаются найти совпадающий с ним фрагмент х[m 1 ,n 1 ], расположенный в уже пройденной части последовательности. В этом случае независимо от направления прохождения последовательности такой фрагмент x[m 1 ,n 1 ] будем называть предыдущим появлением фрагмента х[m,n].

Информация о том, для каких фрагментов х[m,n] существует предыдущее появление, представляет значительный интерес для исследования избыточности информации в заданной последовательности символов и для ее сжатия, поскольку наличие предыдущего появления для заданного фрагмента х[m,n] говорит о том, что весь этот фрагмент может быть задан всего тремя числами: границами m, n и смещением данного фрагмента относительно его предыдущего появления. В то же время возможно задание такой информации, не требующее двумерного массива. Определим две функции

s 1 [i]=max{0 j
s 2 [i]=max{0 j
Другими словами, s 1 [i] - максимальная длина линейного участка указанной последовательности данных, индекс начального элемента которого совпадает с данным индексом i, совпадающего с некоторым другим участком той же последовательности данных x[i], начальный элемент которого расположен ближе к началу прохождения последовательности данных x[i], чем начальный элемент указанного линейного участка. Аналогично, s 2 [i] - максимальная длина линейного участка указанной последовательности данных, индекс конечного элемента которого совпадает с данным индексом i, совпадающего с некоторым другим участком той же последовательности данных x[i], начальный элемент которого расположен ближе к началу прохождения последовательности данных x[i], чем начальный элемент указанного линейного участка.

Очевидно, что для фрагмента х[m,n] существует предыдущее появление тогда и только тогда, когда n-m s 1 [m]. Таким образом, знание функции s 1 [i] позволяет для любого фрагмента х[m,n] сразу сказать, существует ли для него предыдущее появление.

Отметим следующие важнейшие свойства функции s 1 [i]:

А1. s 1 [i+1] s 1 [i]-1 (см. фиг.2). В самом деле, пусть s 1 [i]=s. Тогда по определению для фрагмента x[i,i+s] существует предыдущее появление, т.е. найдется такое , что x[i,i+s] совпадает с x[i+ ,i+s+ ], где <0 в случае прохождения последовательности данных x[i] вперед и <0 в случае прохождения последовательности данных x[i] назад. Тем более x[i+1,i+s] совпадает с x[i+1+ ,i+s+ ], причем x[i+1,i+s]=x[i+1,i+1+(s-1)] и x[i+1+ ,i+s+ ]=x[i+1+ ,i+1+(s-1)+ ]. Следовательно, для фрагмента x[i+1,i+1+(s-1)] существует предыдущее появление, откуда по определению s 1 [i+1] s-1.

Б1. Для m>0 фрагмент х[m,n] является максимальным фрагментом, для которого существует предыдущее появление, тогда и только тогда, когда n=m+s 1 [m] и s 1 [m]>s 1 [m-1]-1. В самом деле, пусть х[m,n] - максимальный фрагмент, для которого существует предыдущее появление. Тогда х[m,n]=х[m,m+(n-m)] является максимальным фрагментом, для которого существует предыдущее появление, откуда по определению s 1 [m]=n-m, т.е. n=m+s 1 [m]. Кроме того, поскольку фрагмент х[m-1,n] строго содержит фрагмент х[m,n], являющийся максимальным фрагментом, для которого существует предыдущее появление, то для фрагмента х[m-1,n]=х[m-1,m-1+(n-m+1)] уже не существует предыдущего появления. Следовательно, n-m+1>s 1 [m-1]. Таким образом, s 1 [m-1]-1
Обратно, пусть n=m+s 1 [m] и s 1 [m]>s 1 [m-1]-1. Предположим, что фрагмент х[m,n] содержится во фрагменте x[m 1 ,n 1 ], для которого также существует предыдущее появление. Если m 1
B1. Пусть m 1 =n j =m j +s 1 [m j ]. Тогда фрагмент x[m j ,n j ] строго содержится внутри фрагмента х[m i ,n i ], что противоречит максимальности фрагмента x[m j ,n j ].

Для функции s 2 [i] имеют место свойства, соответствующие свойствам функции s 1 [i], которые доказываются аналогично:

А2. s 2 [i-1] s 2 [i]-1.

Б2. Для ns 2 [n+1]-1.

В2. Пусть n 1
2. Осуществление способа хранения значений функций s 1 [i] и s 2 [i]

Для хранения функции si[i] создают два битовых массива beg[i] и end[i], 0<=is 1 [i-1]-1, в элементы массивов beg[i] и end[i+s[i]] (только при i+s[i]
Совокупность значений функций s 1 [i] и s 2 [i] может быть восстановлена по значениям битовых массивов beg[i] и end[i], 0 i
3. Вычисление массива всех значений функции s 2 [i] для 0 i
Вычисление массива всех значений функции s 2 [i] для 0 i
Для заданного слова x 1 x N в алфавите алгоритм Укконена последовательно строит суффиксные деревья для подслов x 1 x i , i=1, , N. На шаге i+1 алгоритм преобразует суффиксное дерево T i для слова x 1 x i в суффиксное дерево T i+1 слова x 1 x i+1 . Важнейшим понятием для алгоритма Укконена является понятие активного суффикса слова х 1 x i . Активным суффиксом слова называется самый длинный суффикс данного слова, для которого существует предыдущее появление. Тем самым значение s 2 [i] совпадает с длиной активного суффикса слова x 1 x i . Таким образом, все, что надо сделать - это дополнить алгоритм Укконена операторами, позволяющими выдавать длину активного суффикса на каждом шаге.

Напомним, что суффиксное дерево T i является поддеревом в атомарном суффиксном дереве ast i для слова х 1 x i . В атомарном суффиксном дереве ast i каждому суффиксу w слова соответствует узел w дерева, называемое положением w, такой, что Здесь - слово, получающееся конкатенацией всех символов алфавита , являющихся метками ребер, составляющих путь из корня дерева в узел Если узел входит в суффиксное дерево T i , то положение называется явным, в противном случае - неявным.

Если w=uv и является узлом в суффиксном дереве T i , то пара называется ссылочной парой строки w относительно T i . Если u - самый длинный префикс в w, такой, что является ссылочной парой, то называется канонической ссылочной парой. В алгоритме Укконена ссылочная пара задается парой (s,k), где s - узел суффиксного дерева, k - число символов в слове v. Этой информации вполне достаточно, чтобы полностью задать положение узла атомарного суффиксного дерева ast i , соответствующего суффиксу w.

Алгоритм Укконена имеет вид:

1:

Т пустое дерево

2:

добавить root и в T

3:

for всех х do

4:

добавить ребро root

5:

end for

6:

suffix_link(root)

7:

n length(t)

8:

s root

9:

k 1

10:

for i 1 to n do

11:

(s, k) canonize (s, (k, i-1))

12:

(s, k) update (s, (k, i))

13:

end for

Для нас существенным является то, что в основном цикле построения суффиксного дерева (операторы 10-13) для каждого i в операторе 12 производится вычисление канонической ссылочной пары (s,k) активного суффикса слова t 1 t i . Знание (s,k) позволяет вычислить длину активного суффикса. Действительно, в узле s суффиксного дерева хранится позиция j начала суффикса слова x 1 x i , соответствующего узлу s суффиксного дерева. Значение длины активного суффикса вычисляют как s 2 [i]=i-j-k+1. Добавление этого действия позволяет вычислить весь массив значений s 2 [i] за время O(N).

4. Осуществление способа нахождения достаточно длинных повторяющихся фрагментов

Нахождение максимальных участков в конечной последовательности символов x[i] (0 is 1 [m-1]-1, а конечный индекс n равен m+s 1 [m]-1. To, что при этом получаются именно все максимальные участки в конечной последовательности символов x[i] (0 i
Формула изобретения

1. Способ нахождения всех максимальных участков в конечной последовательности символов x[i] (0 i
создают в памяти компьютера два битовых массива beg[i] и end[i] (0 i
заполняют все элементы указанных битовых массивов нулями;

вычисляют последовательность s 1 [i] по всем N значениям индексов i (0 i
определяют все указанные максимальные участки как все отрезки x[m,n] последовательности x[i], для которых начальный индекс m удовлетворяет условию s 1 [m]>s 1 [m-1]-1, а конечный индекс n равен m+s 1 [m]-1, для чего для каждого значения i проверяют выполнение условия s 1 [i]>s 1 [i-1]-1 и в случае выполнения этого условия устанавливают в битовых массивах beg[i] и end[i] значения beg[i]=1 и end[i+s 1 [i]]=1;

совокупность всех указанных максимальных участков восстанавливают по двум битовым массивам beg[i] и end[i], где единичное значение i-го элемента означает, что i-я позиция в указанной последовательности является соответственно началом и концом некоторого максимального указанного участка.

2. Способ нахождения всех максимальных участков в конечной последовательности символов x[i] (0 i
создают в памяти компьютера два битовых массива beg[i] и end[i] (0 i
заполняют все элементы указанных битовых массивов нулями;

вычисляют последовательность s 2 [i] по всем N значениям индексов i (0 i
определяют все указанные максимальные участки как все отрезки x[m,n] последовательности x[i], для которых конечный индекс n удовлетворяет условию s 2 [n]>s 2 [n+1]-1, а начальный индекс n равен n-s 2 [n]+1, для чего для каждого значения i проверяют выполнение условия s 2 [i]>s 2 [i+1]-1 и в случае выполнения этого условия устанавливают в битовых массивах beg[i] и end[i] значения end[i]=l и beg[i-s 2 [i]+1]=1;

совокупность всех указанных максимальных участков восстанавливают по двум битовым массивам beg[i] и end[i], где единичное значение i-го элемента означает, что i-я позиция в указанной последовательности является соответственно началом и концом некоторого максимального указанного участка.

3. Способ по п.2, в котором для вычисления массива всех значений функции s 2 [i] для всех N значений индексов i (0
РИСУНКИ