Блог пользователя bazsi700

Автор bazsi700, история, 9 лет назад, По-английски

I have just discovered, that std::set::lower_bound for larger sets is much-much faster than std::lower_bound.

Can anyone give explanation why does this happen?

Also, use std::set::lower_bound instead of std::lower_bound, I struggled on a problem for like 2 hours because of getting TLE for this.

  • Проголосовать: нравится
  • +4
  • Проголосовать: не нравится

»
9 лет назад, скрыть # |
Rev. 2  
Проголосовать: нравится -8 Проголосовать: не нравится

std::lower_bound это бинпоиск по элементу и в данном случае он работает за N * log2, в то время как std::set::lower_bound это проходу по дереву который суммарно ищет за log

»
9 лет назад, скрыть # |
 
Проголосовать: нравится +24 Проголосовать: не нравится

http://www.cplusplus.com/reference/algorithm/lower_bound/:

On non-random-access iterators, the iterator advances produce themselves an additional linear complexity in N on average.

http://www.cplusplus.com/reference/set/set/:

iterator — a bidirectional iterator to const value_type

»
9 лет назад, скрыть # |
 
Проголосовать: нравится -15 Проголосовать: не нравится

As far as i know std::lower_bound works with complexity O(log n) * O(access_of_element), it is O(log n) for vectors, arrays, but for sets it is something like O(n * log^2 n) (because you can get element in set in O(n log n)). std::set::lower_bound is function specified for using in sets, it has complexity O(log n).