Comments 1
В копилку идей, как работать с бисекцией бесконечных интервалов — т.е. lower_bound(begin(iota), end(iota), xz)
Нужно вычислять точку разбиения не просто как start+distance(start,finish)/2, а
В принципе, можно надругаться над difference_type, чтобы он содержал не только конечные числа, [0..oo), возможно, (-oo..0), но и бесконечные [oo-0, oo-1, oo-2, ..oo), ну и в минус-бесконечность (..., oo-(-3), oo-(-2), oo-(-1))
так, что операция деления пополам давала конечное: (oo-N)/2 = N; (oo-(-N))/2 = 0 ибо нефиг.
Всего-то навсего, один бит признака «вычитание из бесконечности».
В принципе, если нам не жалко разрядности, можем взять long long и зарезервировать оттуда 1 бит. Ну, будет у нас 62-битный диапазон доступных чисел.
Либо big int плюс булев флажок.
Нужно вычислять точку разбиения не просто как start+distance(start,finish)/2, а
iterator pivot(iterator start, finish) {
return
is_infinite_end(start) ? start :
is_infinite_end(finish) ? start + distance(absolute_zero(start), start) : // прыгаем в геометрической прогрессии (здесь: удваиваем)
start + distance(start,finish) / 2; // как обычно, делим пополам
}
В принципе, можно надругаться над difference_type, чтобы он содержал не только конечные числа, [0..oo), возможно, (-oo..0), но и бесконечные [oo-0, oo-1, oo-2, ..oo), ну и в минус-бесконечность (..., oo-(-3), oo-(-2), oo-(-1))
так, что операция деления пополам давала конечное: (oo-N)/2 = N; (oo-(-N))/2 = 0 ибо нефиг.
Всего-то навсего, один бит признака «вычитание из бесконечности».
В принципе, если нам не жалко разрядности, можем взять long long и зарезервировать оттуда 1 бит. Ну, будет у нас 62-битный диапазон доступных чисел.
Либо big int плюс булев флажок.
Sign up to leave a comment.
Интервалы в С++, часть 4: к бесконечности и далее