Цитата:
Сообщение от
gl00mie
Какой там внутри цикла?! Они внутри 2-х if!
Точно! Вчера спросонья ошипся.
Значит, и в моем алгоритме можно вынести оба difference за цикл.
вот и получается структурная разница - у тебя intersection + difference, а у меня difference + difference.
вот мой исправленный алгоритм без итераторов на псевдокоде:
(плюс, в качестве побочного эффекта, исходные множества oldSet, newSet остаются не изменными. т.е. удалось избавиться от побочных эффектов в передаваемых в алгоритм параметрах

)
X++:
[oldKey, newKey] getPair(deadSet, seedSet)
{
if( deadSet.empty() )
return []; // нечего менять - поэтому ничего менять не нужно
if( seedSet.empty() )
return []; // не на что менять - поэтому ничего менять не нужно
newKey = seedSet.anyValue(); // любое значение из множества зародышей
oldKey = deadSet.anyValue(); // любое значение из множества мертвеньких
return [oldKey, newKey];
}
seedSet = Set::difference( newSet, oldSet ); // зародыши: новые значения будут браться отсюда
deadSet = Set::difference( oldSet, newSet ); // мертвенькие: они исчезнут
pair = getPair( deadSet, seedSet );
while( pair != [] )
{
[oldKey, newKey] = pair;
// do something with oldKey, newKey
// next iteration
deadSet.remove(oldKey);
seedSet.remove(newKey);
pair = getPair( deadSet, seedSet );
}