|
|
#21 |
|
Участник
|
да здравствует коллективный разум!
Пожалуй, после всех оптимизаций алгоритм получился достаточно простой для того, чтобы даже не выносить его в отдельный метод тогда и от промежуточного списка можно избавиться...PS. Можно разве что перед получением второго множества отличающихся значений проверять, что первое множество отличающихся значений не пустое. Последний раз редактировалось gl00mie; 23.11.2010 в 10:47. |
|
|
|
|
#22 |
|
Участник
|
Что-то задело меня.
Можно еще чуть пооптимизировать X++: {
...
seedSet = Set::difference( newSet, oldSet ); // зародыши: новые значения будут браться отсюда
if( seedSet.empty() )
return ret; // не на что менять - поэтому ничего менять не нужно (gl00mie)
deadSet = Set::difference( oldSet, newSet ); // мертвенькие: они исчезнут
seedEnum = seedSet.getEnumerator();
deadEnum = deadSet.getEnumerator();
while ( deadEnum.moveNext() )
{
if ( !seedEnum.moveNext() )
break; // чтобы не бегать в цикле лишний раз, если в зародышах ничего не осталось
ret.addEnd([deadEnum.current(), seedEnum.current()]);
}
return ret;
} |
|
|
|
|
#23 |
|
Участник
|
X++: {
...
seedSet = Set::difference( newSet, oldSet ); // зародыши: новые значения будут браться отсюда
if( seedSet.empty() )
return ret; // не на что менять - поэтому ничего менять не нужно (gl00mie)
deadSet = Set::difference( oldSet, newSet ); // мертвенькие: они исчезнут
seedEnum = seedSet.getEnumerator();
deadEnum = deadSet.getEnumerator();
while ( deadEnum.moveNext() && seedEnum.moveNext() )
{
ret.addEnd([deadEnum.current(), seedEnum.current()]);
}
return ret;
} |
|
|
|
|
#24 |
|
----------------
|
вариант
парадоксально простой алгоритм получается, если пытаться сохранить сортировку старых элементов.
X++: ret = new List( Types::Container ); setIterOld = new SetIterator( _setOfValues2Replace ); setIterNew = new SetIterator( _setOfNewValues ); while (setIterNew.more() && setIterOld.more()) { if (setIterOld.value() > setIterNew.value()) { ret.addEnd( [ setIterOld.value(), setIterNew.value() ] ); } else if (setIterOld.value() < setIterNew.value()) { ret.addStart( [ setIterOld.value(), setIterNew.value() ] ); } setIterNew.next(); setIterOld.next(); } return ret; |
|
|
|
| За это сообщение автора поблагодарили: mazzy (5), gl00mie (5). | |
| Теги |
| законченный пример, уникальность |
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Универсальный изменятель значений полей | 17 | |||
| Опции темы | Поиск в этой теме |
| Опции просмотра | |
|