Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.104.248] |
|
Сообщ.
#1
,
|
|
|
Автор: mikv
Вариант генерации подмножеств Используем двоичное представление. Для перебора всех подмножеств нам необходимо перебрать все числа от 0 до 2n-1. Как переходить от текущего двоичного числа к следующему? Можно каждый раз осуществлять перевод из 10-ной системы в 2-чную. Но там используются крайне медленные операции деления. А почему бы не просто складывать "в лоб" двоичные числа? То есть точно также, как мы делаем на бумажке, складывая обычные числа. Складываются так: 1+1=0. То есть 0 пишем в текущий разряд, а единичка переносится в следующий. 1+0=1 0+1=1 0+0=0 Если внимательно взглянуть на эту табличку - можно понять, что на самом деле перед нами таблица значений функции XOR. поэтому мой вариант генерации множеств: procedure NextSubset; var i : Integer; begin i := n + 1; repeat dec(i); B[i] := B[i] xor 1; until B[i]=1; end; n - количество элементов в исходном множестве. Однако, здесь следует четко отслеживать, чтобы для варианта, когда массив B содержит n единиц не была вызвана еще раз процедура NextSubset. предлагаю использовать примерно так: maxk := 1 shl n; FillChar (B,SizeOf(B),0); for k := 1 to maxk do begin NextSubset; {Некоторые действия} end; |