Изменения

Перейти к: навигация, поиск

Правильные скобочные последовательности

828 байт добавлено, 08:52, 7 января 2012
Нет описания правки
Скобочная последовательность - класс комбинаторных объектов, представляющий собой последовательность скобочных символов.<wikitex>
Пример{{Определение|id = def1|definition ='''Скобочная последовательность''' {{---}} класс комбинаторных объектов, представляющий собой последовательность скобочных символов.}}''Примеры скобочных последовательностей''*$(())))($*$)()()))()(()())${{Определение|id = def1|definition ='''Правильная скобочная последовательность''' - частный случай скобочной последовательности, определяющийся следующими образами:
*""(пустая строка) есть правильная скобочная последовательность;*правильная скобочная последовательность, взятая в скобки есть правильная скобочная последовательность;(*)*скобочная последовательность, к которой приписана слева или справа другая скобочная последовательность, есть правильная скобочная последовательность;}}''Примеры правильных скобочный последовательностей''*$((()()()()))$*$(())(()())$
Определение: Правильная скобочная последовательность - частный случай скобочной последовательности, определяющийся следующими образами:  - ""(пустая строка) есть правильная скобочная последовательность; - правильная скобочная последовательность, взятая в скобки есть правильная скобочная последовательность;(*) - скобочная последовательность, к которой приписана слева или справа другая скобочная последовательность, есть правильная скобочная последовательность; Пример: (())(()()) == Алгоритм проверки правильности скобочной последовательности==
Пусть нам дана скобочная последовательность записанная в строку s. Возьмем переменную a, a = 0. Будем последовательно перебирать все символы этой строки. Если мы встречаем открывающуюся скобку, то увеличиваем a на 1, закрывающую - уменьшаем на 1. Если на протяжении всего перебора a было неотрицательным и после завершения осталось нулем, то скобочная последовательность правильна.
''псевдокод'':
function check(s: string): boolean;
Надо отметить что, скобочные последовательности могут состоять не только из одного типа скобок, при этом недопустимо такое расположение, когда один тип скобок закрывает другой:
Пример:''Примеры скобочных последовательностей с несколькими типами скобок''
*$()[()]\{()()[]\} $ - верно *$[(]\{\}) $ - неверно
В этом случае для проверки надо будет использовать стек.
== Лексикографический порядок порядок правильных скобочных последовательностей==
Для того чтобы определить лексикографический порядок для правильных скобочных последовательностей будем интерпретировать открывающуюся скобку как "0", а закрывающуюся как "1"(**). Тогда первая последовательность с n открывающимися скобками будет иметь вид:
{| border="1" cellpadding="3" | (||(||(||(||...||(||(||(||)||)||)||...||)||)||)||) ||(***) |-0000 |0||0||0||0||...000111||0||0||0||1||1||1||...1111||1||1||1||1 |}
что соответствует самому маленькому возможному числу, а последняя:
{| border="1" cellpadding="3" | (||)||(||)||...||(||)||(||)||(||)||...||(||)||(||) |-0101 |0||1||0||1||...010101||0||1||0||1||0||1||...0101||0||1||0||1 |}
что соответствует самому большому возможному числу.
Для последовательностей с разным типом скобок надо определять свой порядок, например "("<"["<")"<"]".
''Примеры лексикографического порядка для n и k, где n - число открывающихся скобок, а k - число видов скобок:''
{| border="1" cellpadding="3" |n = 3;||k = 1 |- |$((()))$||$(()())$||$(())()$||$()(())$||$()()()$ |}
k {| border= "1" cellpadding="3" ((())) (()()) (())() ()(()) ()()()  |n = 2; ||k = 2; |- |$()[] $||$([]) $||$[()] $||$[]()$ |}
Алгоритм генерации лексикографического порядка будет предложен ниже.
== Количество правильных скобочных последовательностей. Числа Каталана==
Количество правильных скобочных последовательностей со скобками одного типа совпадает с числами Каталана.
{{Определение|id = def1|definition =Числа Каталана представляют собой:{{---}} последовательность чисел, выражающихЖ - *количество неизоморфных упорядоченных бинарных деревьев с корнем и n+1 листьями; - *Количество способов соединения 2n точек на окружности n непересекающимися хордами; - *количество разбиений выпуклого (n+2)-угольника на треугольники непересекающимися диагоналями; - *Количество правильных скобочных последовательностей имеющих n открывающихся скобок.}}
Числа Каталана удовлетворяют следующему рекурентному соотношению:
$c_0 $ = 1; - так как существует только одна скобочная последовательность с 0 открывающихся скобок - пустая
$C_n $ = (Сумма по i от 1 до n - 1) C_i * C_(n - 1 - i).
Это соотношение легко получается из (*). Для этого надо перебрать все возможные последовательности d_1 и d_2, являющиеся правильными скобочными последовательностями, такие, что (d_1)d_2 образуют новые правильные скобочные последовательности необходимой нам длины.
94
правки

Навигация