Генерация комбинаторных объектов в лексикографическом порядке — различия между версиями
|  (→Пример генерации сочетаний из N элементов по K в лексикографическом порядке) |  (→Определение) | ||
| Строка 1: | Строка 1: | ||
| == Определение == | == Определение == | ||
| − | Генерация [[Комбинаторные объекты|комбинаторных объектов]] в [[Лексикографический порядок|лексикографическом порядке]] -  | + | Генерация [[Комбинаторные объекты|комбинаторных объектов]] в [[Лексикографический порядок|лексикографическом порядке]] {{---}} непосредственное построение и перебор всех объектов заданного типа так, чтобы для любых двух объектов выполнялось условие: <tex>K_i</tex> <tex><</tex> <tex>K_i</tex><tex>_+</tex><tex>_1</tex>. | 
| == Алгоритм построения == | == Алгоритм построения == | ||
Версия 09:01, 6 ноября 2011
Содержание
Определение
Генерация комбинаторных объектов в лексикографическом порядке — непосредственное построение и перебор всех объектов заданного типа так, чтобы для любых двух объектов выполнялось условие: .
Алгоритм построения
Описание процедуры построения
Пусть - процедура генерирования, где - глубина рекурсии, - комбинаторный объект.
Gen(p, K)
  if p = <требуемый размер объекта>
    <выводим> K
  else
     for <все w из алфавита на котором строится K>
       if (K + w) = <корректный префикс требуемого объекта>
         Gen(p + 1, K + w)
Генерация с помощью процедуры получения следующего объекта
Составляем первый объект - , для него получаем следующий объект - , для получаем , далее действуем также, для получая объект, пока не получим последний объект .
Примеры
Пример генерации сочетаний из N элементов по K в лексикографическом порядке
Первым сочетанием, очевидно, будет сочетание . Научимся для текущего сочетания находить лексикографически следующее. Для этого в текущем сочетании найдём самый правый элемент, не достигший ещё своего наибольшего значения; тогда увеличим его на единицу, а всем последующим элементам присвоим наименьшие значения.
Пусть - процедура генерирования, где - текущее сочетание, - количество элементов.
bool next_combination (vector<int> & a, int n) {
int k = (int)a.size();
  for (int i=k-1; i>=0; --i)
          if (a[i] < n-k+i+1) {
                  ++a[i];
                  for (int j=i+1; j<k; ++j)
                          a[j] = a[j-1]+1;
                  return true;
          }
  return false;
}
Пример работы процедуры генерации
Иллюстрация работы процедуры генерирования всех перестановок из чисел

