Показать сообщение отдельно
Старый 23.11.2010, 09:08   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от 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 );
}
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: gl00mie (5).