Изменения

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

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

372 байта добавлено, 19:07, 4 сентября 2022
м
rollbackEdits.php mass rollback
'''Рассмотрим алгоритм нахождения лексикографически следующего разбиения на подмножества:'''
*Будем хранить подмножества в списке списков, например, разбиение <tex> \{1, 2, 3\}~ \{4, 5\}</tex> будет выглядеть так:
{| class="wikitable" border = 1
|}
* Будем поддерживать массив "удалённых" элементов {{---}} элементы , которые затем нужно будет вернуть в разбиение.
* Двигаясь снизу вверх будем рассматривать подмножества.
** Если мы можем дописать в текущее подмножество минимальный элемент из удалённых, то мы нашли следующее разбиение и идти дальше вверх не нужнозавершить цикл.** Если дописать не можем, значит, либо нужно укоротить и заменить какой -то элемент в текущем подмножестве, либо перейти к следующему подмножеству. Будем идти справа налево и рассамтривать рассматривать элементы:*** Если мы можем заменить текущий элемент минимальным удалённым {{---}} мы нашли следующее разбиение, завершаем оба проходацикла и выполняем алгоритм дальше. Стоит отметить, что нельзя перезаписывать последний элемент в подмножестве, иначе мы не сможем дописать минимальный хвост после этого подмножества {{---}} в удалённых будет элемент меньше текущего и мы не сможем дописать правильный хвоствыписать удаленные элементы так, чтобы получилось корректное разбиение.*** Если заменить не можемтекущий элемент каким-то из удалённых нельзя, то его нужно следует удалитьи этот.
* Допишем лексикографически минимальный хвост подмножеств из оставшихся удалённых элементов.
'''if''' (used.size != 0) '''and''' (max(used) > a[i][-1]) <font color=green>// в удалённых есть хотя бы один элемент, который мы можем добавить в конец.</font>
m = '''минимум из''' used '''строго больше''' a[i][-1]
a[i].add(m) <font color=green>//добавляем</font>
used.remove(m)
'''break'''
'''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'''
'''if''' fl
'''break'''
<font color=green>//далее выведем все удалённые, которые не выбрали</font>
sort(used)
'''for''' i = 0 '''to''' used.size - 1
a.add('''list<int>'''(used[i])) <font color=green>//добавляем лексикографически минимальных хвост</font>
'''return''' a
| ||^|| ||Удалили элемент 5.
|-
| || || ||usedУдалённые элементы
|}
|^|| || ||Удалили элемент 4. Так как он является последним в подмножестве, то мы не можем заменить его на другой.
|-
|5|| || ||usedУдалённые элементы
|}
| || || ||^||Дополнили первое подмножество элементом 4
|-
|5|| || || ||usedУдалённые элементы
|}
|style="background:#FFCC00"|5|| || || ||Дописали лексикографически минимальный хвост
|-
| || || || ||usedУдалённые элементы
|}
1632
правки

Навигация