Комбинаторные алгоритмы для программистов



             

Процесс последовательных разбиений


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

Применим описанный прием для решения следующей задачи.

Пусть дано некоторое множество из

n
предметов, стоящих в определенном порядке. Разобьем это множество на две непустые части так, чтобы одна из этих частей лежала левее второй (то есть, скажем, одна часть состоит из элементов от первого до
m
- го, а вторая - из элементов от
(m + 1)
-го до
n
-го). После этого каждую из частей таким же образом разобьем на две непустые части (если одна из частей состоит уже из одного предмета, она не подвергается дальнейшим разбиениям). Этот процесс продолжается до тех пор, пока не получим части, состоящие из одного предмета каждая. Сколько существует таких процессов разбиения (два процесса считаются различными, если хотя бы на одном шагу они приводят к разным результатам)?

Обозначим число способов разбиения для множества из

n + 1

предметов через

B_n
. На первом шагу это множество может быть разбито
n
способами (первая часть может содержать один предмет, два предмета,…,
n
предметов). В соответствии с этим множество всех процессов разбиений распадается на
n
классов - в
s
- класс входят процессы, при которых первая часть состоит из
s
предметов.

Подсчитаем число процессов в

s
-м классе. В первой части содержится
s
элементов. Поэтому ее можно разбивать далее
B_{s - 1}
различными процессами. Вторая же часть содержит
n - s + 1
элементов, и ее можно разбивать далее
B_{n - s}

процессами. По правилу произведения получаем, что

s
- класс состоит из
B_{s - 1} B_{n - s}
различных процессов. По правилу суммы отсюда вытекает, что
B_n=B_0 B_{n - 1} + B_1 B_{n - 2} + \ldots + B_{n - 1} B_0.

(7.6)

Таким образом получено рекуррентное соотношение для

B_n
. Двоичный поиск, поиск делением пополам. Поиском по числам Фибоначчи называется поиск, основанный на том, что область поиска делится в точках, являющихся числами Фибоначчи.




Содержание  Назад  Вперед