О глобальном потеплении
Oct. 3rd, 2016 05:52 pmИнтересно, сколько мегаватт-часов электроэнергии было потрачено впустую, и ещё будет потрачено из-за того, что гораздо проще написать
if (std::find_first_of(set1.begin(), set1.end(), set2.begin(), set2.end()) == set1.end())
вместо того, чтобы написать предикатик isEmptyIntersection из 5 строк, работающий линейно, а не квадратично. А всё из-за [expletive omitted] Степанова, не предусмотревшего в STL нормальные методы работы с множествами. Чтоб ему в аду черти code reviews делали!
if (std::find_first_of(set1.begin(), set1.end(), set2.begin(), set2.end()) == set1.end())
вместо того, чтобы написать предикатик isEmptyIntersection из 5 строк, работающий линейно, а не квадратично. А всё из-за [expletive omitted] Степанова, не предусмотревшего в STL нормальные методы работы с множествами. Чтоб ему в аду черти code reviews делали!
no subject
Date: 2016-10-04 01:00 am (UTC)Сегодня в одном месте добавил камент, что надо пофиксить - поиск столбца по имени ведется линейно.
no subject
Date: 2016-10-04 01:10 am (UTC)Ну чё, на одном тесте было 672 минуты, после фикса стало 366 секунд.
no subject
Date: 2016-10-04 01:31 am (UTC)Проще? Чур меня, чур. И я на этом супе программировал 10+ лет и считал, что так и надо.
no subject
Date: 2016-10-04 01:41 am (UTC)no subject
Date: 2016-10-04 02:13 am (UTC)no subject
Date: 2016-10-04 04:18 am (UTC)Ну вот более-менее код, над которым ревьюер не будет смеяться:
(Каждый раз, когда такое пишу/читаю, представляю себе разложение выражения
c = a + b;в последовательностьmov ax, [a]; add ax, [b]; mov [c], ax.)Этот код линейный, но с большой константой (обработка обоих множеств целиком, копирование совпавших элементов). Для оптимума, действительно, проще всего написать отдельный алгоритм наподобие
set_intersection, но прерывающий цикл сразу после первого совпадения.no subject
Date: 2016-10-04 04:57 am (UTC)А так-то да, всё красиво, и линейно, и самодеятельного кода не надо...
no subject
Date: 2016-10-04 05:35 am (UTC)Ну вот где-то я видел утверждение, что STL — не набор примитивов на все случаи жизни, а методология. Не хватает алгоритма — напиши по образу и подобию.
Из области извращений, можно ещё так сделать:
Кстати, есть одна gotcha: решение на
find_first_ofпроверяет равенство, а решения, линейные за счёт сортированности set’ов — только эквивалентность, порождённую тем слабым порядком, которым множества отсортированы. И, в общем случае, нет способа сделать проверку равенства, не потеряв линейную асимптотику алгоритма, если эта эквивалентность существенно отличается от равенства.no subject
Date: 2016-10-04 05:46 am (UTC)Так если мы хотим определить пустоту пересечения множеств, заданных отношением слабого порядка, зачем нам равенство?
no subject
Date: 2016-10-04 07:02 am (UTC)no subject
Date: 2016-10-04 07:27 am (UTC)Это, по крайней мере, попроще будет, чем автоматически сообразить, что если единственное использование массива - проверка на empty, то его создавать не надо.
no subject
Date: 2016-10-04 05:25 am (UTC)no subject
Date: 2016-10-04 05:32 am (UTC)no subject
Date: 2016-10-04 05:51 am (UTC)no subject
Date: 2016-10-04 06:01 am (UTC)no subject
Date: 2016-10-04 05:26 am (UTC)Ввести туда эту строчку, и попробовать оценить -- а реально, сколько таких конструкций используется.
no subject
Date: 2016-10-04 05:34 am (UTC)no subject
Date: 2016-10-04 07:08 pm (UTC)no subject
Date: 2016-10-05 01:30 am (UTC)no subject
Date: 2016-10-05 03:52 am (UTC)no subject
Date: 2016-10-05 03:54 am (UTC)no subject
Date: 2016-10-05 01:26 am (UTC)no subject
Date: 2016-10-05 01:29 am (UTC)no subject
Date: 2016-10-05 01:37 am (UTC)Для ордеред н лог н, ну тогда действительно лучше руками писать.
no subject
Date: 2016-10-05 01:55 am (UTC)no subject
Date: 2016-10-05 01:58 am (UTC)no subject
Date: 2016-10-05 02:05 am (UTC)no subject
Date: 2016-10-05 02:09 am (UTC)no subject
Date: 2016-10-05 02:23 am (UTC)