КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Генерация сочетаний
Булеан можно рассматривать как объединение всевозможных сочетаний, построенных из элементов множества Поэтому генерация множества может быть сведена к генерации булеана и выбору из него всех подмножеств с мощностью (2) На рис. 14 представлена схема построения множества сочетаний из элементов множества Закрашенным прямоугольником на рисунке обозначены номера (индексы) элементов битовых последовательностей и элементов множества Стрелки связывают битовые последовательности, содержащие три двоичные единицы и сгенерированные сочетания множества Для каждой стрелки указаны индексы единичных позиций соответствующих битовых последовательностей. Эти индексы используются для выбора элементов из множества для включения в соответствующее сочетание. Очевидно, что такой алгоритм генерации сочетаний имеет сложность как и алгоритм генерации множества всех подмножеств. 25:
Рис.14. Схема генерации сочетаний на основе множества всех подмножеств
26: Рассмотрим еще один пример. Имеется множество всех подмножеств:. Всего подмножеств 16. Требуется найти все сочетания по три.
27-29: На рис. 15 и 16 представлена реализация генератора сочетаний на языке С++. Генератор реализован в виде структуры xcombination.
Рис. 15. Шаблон структуры генератора сочетаний
Рис. 16. Реализация функций генератора сочетаний
Структура xcombination имеет один конструктор с двумя параметрами. Первый параметр определяет количество элементов в исходном множестве, второй – количество элементов в генерируемых сочетаниях. Для хранения текущего состояния генератора используются три переменные: n (мощность исходного множества), m (количество элементов в генерируемых сочетаниях), sset (адрес нулевого элемента массива индексов) и nc (номер текущего сочетания). Все переменныеинициализируются в конструкторе. Значение nc увеличивается на единицу после формирования очередного сочетания, а значение остальных переменных остается постоянным. Кроме конструктора, структура xcombination содержит еще пять функций. Функция getfirst (рис. 16) не имеет параметров и предназначена для проверки корректности параметров, заданных в конструкторе. Эта функция не формирует массива индексов, как это происходило в структуре subset (генератор множества всех подмножеств). В основном она существует для унификации интерфейсов всех генераторов. Функция возвращает отрицательное значение, если параметры генератора заданы неверно. Функция getnext формирует массив индексов следующего сочетания и увеличивает значение переменной nc на единицу. При каждом вызове функции для текущего массива индексов вычисляется новое значение j -индекса и, если оно не превышает m, строится новый массив индексов. При достижении j -индексом значения, равного или превышающего m, функция возвращает отрицательное значение, в других случаях возвращается положительное значение. Функция ntx возвращает значение элемента массива индексов по индексу этого элемента и служит для сокращения записи при переборе элементов массива. Функция count вычисляет и возвращает общее количество сочетаний из n по m. Как и в генераторе множества всех подмножеств, для сброса генератора сочетаний в начальное состояние служит функция reset. После вызова reset снова могут вызываться getfirst и getnext.
30-32: Пример использования генератора сочетаний и результат выполнения программы.
Рис. 17. Пример применения генератора сочетаний
Рис. 18. Результат выполнения программы, представленной на рис. 17
В качестве исходного множества в примере используется строковый массив, состоящий из пяти элементов. Вначале программы этот массив распечатывается. Далее объявляется структура xcombination и ее конструктору в качестве параметров передаются количество элементов исходного множества и размерность сочетаний. Генерация сочетаний начинается функцией getfirst. Если функция возвращает положительное значение, то сформирован индекс массивов первого сочетания. Массив индексов каждого следующего сочетания формируется функцией getnext. Выбор элементов исходного массива осуществляется с помощью функции ntx. Признаком завершения цикла генерации является отрицательное значение функции getnext. 33:
Дата добавления: 2014-01-20; Просмотров: 917; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |