23.11.2010, 10:43 | #21 |
Участник
|
да здравствует коллективный разум! Пожалуй, после всех оптимизаций алгоритм получился достаточно простой для того, чтобы даже не выносить его в отдельный метод тогда и от промежуточного списка можно избавиться...
PS. Можно разве что перед получением второго множества отличающихся значений проверять, что первое множество отличающихся значений не пустое. Последний раз редактировалось gl00mie; 23.11.2010 в 10:47. |
|
23.11.2010, 15:46 | #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.11.2010, 18:26 | #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.11.2010, 15:05 | #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 |
|