spamsink: (lenin)
[personal profile] spamsink
Интересно, сколько мегаватт-часов электроэнергии было потрачено впустую, и ещё будет потрачено из-за того, что гораздо проще написать
if (std::find_first_of(set1.begin(), set1.end(), set2.begin(), set2.end()) == set1.end())
вместо того, чтобы написать предикатик isEmptyIntersection из 5 строк, работающий линейно, а не квадратично. А всё из-за [expletive omitted] Степанова, не предусмотревшего в STL нормальные методы работы с множествами. Чтоб ему в аду черти code reviews делали!

Date: 2016-10-04 01:00 am (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Да по-моему, у населения идея, что множества не являются списками, вызывает какой-то ступор.

Сегодня в одном месте добавил камент, что надо пофиксить - поиск столбца по имени ведется линейно.

Date: 2016-10-04 01:31 am (UTC)
From: [identity profile] yatur.livejournal.com
> if (std::find_first_of(set1.begin(), set1.end(), set2.begin(), set2.end()) == set1.end())

Проще? Чур меня, чур. И я на этом супе программировал 10+ лет и считал, что так и надо.

Date: 2016-10-04 02:13 am (UTC)
yigal_s: (Default)
From: [personal profile] yigal_s
Прелестно, да.

Date: 2016-10-04 04:18 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Ну вот более-менее код, над которым ревьюер не будет смеяться:

std::vector<T> intersection;
std::set_intersection(set1.begin(), set1.end(),
                      set2.begin(), set2.end(),
                      std::back_inserter(intersection));
if (intersection.empty()) …

(Каждый раз, когда такое пишу/читаю, представляю себе разложение выражения c = a + b; в последовательность mov ax, [a]; add ax, [b]; mov [c], ax.)

Этот код линейный, но с большой константой (обработка обоих множеств целиком, копирование совпавших элементов). Для оптимума, действительно, проще всего написать отдельный алгоритм наподобие set_intersection, но прерывающий цикл сразу после первого совпадения.

Date: 2016-10-04 05:35 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Ну вот где-то я видел утверждение, что STL — не набор примитивов на все случаи жизни, а методология. Не хватает алгоритма — напиши по образу и подобию.

Из области извращений, можно ещё так сделать:

struct FoundMatch {};
class AnyAcceptor {
public:
    AnyAcceptor& operator++() { return *this; }
    AnyAcceptor& operator++(int) { return *this; }
    AnyAcceptor& operator*() { return *this; }
    template <typename AnyT>
    void operator=(const AnyT&) { throw FoundMatch(); }
};

template <typename SortedRange1T, typename SortedRange2T>
bool intersects(const SortedRange1T& set1, const SortedRange2T& set2)
{
    try {
        std::set_intersection(std::begin(set1), std::end(set1),
                              std::begin(set2), std::end(set2),
                              AnyAcceptor());
        return false;
    }
    catch (FoundMatch)
    {
        return true;
    }
}

Кстати, есть одна gotcha: решение на find_first_of проверяет равенство, а решения, линейные за счёт сортированности set’ов — только эквивалентность, порождённую тем слабым порядком, которым множества отсортированы. И, в общем случае, нет способа сделать проверку равенства, не потеряв линейную асимптотику алгоритма, если эта эквивалентность существенно отличается от равенства.

Date: 2016-10-04 07:02 am (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
Теоретически так и надо, но на практике можно поспорить с сеньором о стоимости исключений на целевой платформе.

Date: 2016-10-04 05:25 am (UTC)
From: [identity profile] fatoff.livejournal.com
И ведь никто не заставляет использовать параметризованные алгоритмы по любому поводу.

Date: 2016-10-04 05:51 am (UTC)
From: [identity profile] fatoff.livejournal.com
C, C with classes, C++ without templates, and only then C++ with templates. Вот не надо слишком быстро прогрессировать новоиспечённым программистам. Повторяя эволюцию языка они будут привычны работать руками, не только головой. :)

Date: 2016-10-04 05:26 am (UTC)
From: [identity profile] gineer.livejournal.com
Вот был гуглевский поисковик по коду... сейчас вроде бы тоже какой-то есть.

Ввести туда эту строчку, и попробовать оценить -- а реально, сколько таких конструкций используется.

Date: 2016-10-04 07:08 pm (UTC)
From: [identity profile] stumari.livejournal.com
а я то думал, вы про Челси Клинтон, которая полетала на самолете на конференцию по ГП, вмето того, чтобы по телефону обсудить :)

Date: 2016-10-05 03:52 am (UTC)
From: [identity profile] stumari.livejournal.com
в новом дизайне, в котором это у меня было показано, "С++" видно не было, сейчас специально проверил (видно только в tool-tip-e, если мышку подвести к кружку со стрелочкой, означающей этот кат, но не нажать)

Date: 2016-10-05 01:26 am (UTC)
From: [identity profile] freeborn.livejournal.com
Any_of отменили разве? 11 год вроде давно был

Date: 2016-10-05 01:37 am (UTC)
From: [identity profile] freeborn.livejournal.com
Для unordered_set линейно
Для ордеред н лог н, ну тогда действительно лучше руками писать.

Date: 2016-10-05 01:58 am (UTC)
From: [identity profile] freeborn.livejournal.com
Что то я не уверен в логарифмичности, если, к примеру, множества четных и нечетных чисел сравнивать

Date: 2016-10-05 02:09 am (UTC)
From: [identity profile] freeborn.livejournal.com
Я привык худший случай учитывать, похоже n log n получится - а инкрементами линейно всегда

Profile

spamsink: (Default)
spamsink

February 2026

S M T W T F S
12345 67
8 91011 121314
15161718 192021
22 2324 25262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 5th, 2026 06:27 am
Powered by Dreamwidth Studios