Изменения

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

Получение следующего объекта

367 байт добавлено, 19:57, 9 января 2021
Специализация алгоритма для генерации следующего разбиения на подмножества
'''Рассмотрим алгоритм нахождения лексикографически следующего разбиения на подмножества:'''
*Будем хранить подмножества в списке списков, например, разбиение <tex> \{1, 2, 3\}~ \{4, 5\}</tex> будет выглядеть так:
{| class="wikitable" border = 1
|}
* Будем поддерживать массив "удалённых" элементов {{---}} элементы , которые затем нужно будет вернуть в разбиение.
* Двигаясь снизу вверх будем рассматривать подмножества.
** Если мы можем дописать в текущее подмножество минимальный элемент из удалённых, то мы нашли следующее разбиение и идти дальше вверх не нужнозавершить цикл.** Если дописать не можем, значит, либо нужно укоротить и заменить какой -то элемент в текущем подмножестве, либо перейти к следующему подмножеству. Будем идти справа налево и рассамтривать рассматривать элементы:*** Если мы можем заменить текущий элемент минимальным удалённым {{---}} мы нашли следующее разбиение, завершаем оба проходацикла и выполняем алгоритм дальше. Стоит отметить, что нельзя перезаписывать последний элемент в подмножестве, иначе мы не сможем дописать минимальный хвост после этого подмножества {{---}} в удалённых будет элемент меньше текущего и мы не сможем дописать правильный хвоствыписать удаленные элементы так, чтобы получилось корректное разбиение.*** Если заменить не можемтекущий элемент каким-то из удалённых нельзя, то его нужно следует удалитьи этот.
* Допишем лексикографически минимальный хвост подмножеств из оставшихся удалённых элементов.
'''for''' j = a[i].size - 1 '''downto''' 0
'''if''' (used.size != 0) '''and''' (j != 0) '''and''' (max(used) > a[i][j]) <font color=green>//если можем заменить элемент, другим элементом из списка used и он не последний</font>
m = '''минимум из''' used '''строго больше''' a[i][-1j] old = a[i][j]
a[i][j] = m <font color=green>//заменяем</font>
used.remove(m)
used.add(old)
fl = ''true''
'''break'''
| ||^|| ||Удалили элемент 5.
|-
| || || ||usedУдалённые элементы
|}
|^|| || ||Удалили элемент 4. Так как он является последним в подмножестве, то мы не можем заменить его на другой.
|-
|5|| || ||usedУдалённые элементы
|}
| || || ||^||Дополнили первое подмножество элементом 4
|-
|5|| || || ||usedУдалённые элементы
|}
|style="background:#FFCC00"|5|| || || ||Дописали лексикографически минимальный хвост
|-
| || || || ||usedУдалённые элементы
|}
8
правок

Навигация