Codeforces и Polygon могут быть недоступны в период с 6 декабря, 22:00 (МСК) по 7 декабря, 00:00 (МСК) в связи с проведением технических работ. ×

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

Автор MKasirloo, история, 11 месяцев назад, По-английски

Binary Search

Hello everyone!

Today I'm going to talk you about a useful problem-solving method, binary search. If you have seen, in some problems we can't use an algorithm with $$$O(n^2)$$$ (because your program would be too slow to solve such problems). In those cases, you can use faster algorithms, but one of the popular algorithm is binary search. In binary search, you assume an integer as the answer, and you try that to see if it is the real answer or not. In this algorithm, you have an answer range, with usually starts with 0 and the end of the range will be maximum possible answer (i.g. 1e9). Let's play a game to understand better. One of your friends choose an integer from 1 to 100 and you need to ask some questions of your friend to find the number your friend had chosen. If you work smart (you will because you are smart) you start with this question: Is it less than 50? Do you agree if the friend's answer is yes, your range will be divided by 2 and also if your friend's answer is no. We assume he/she said NO, then you choose the number that is in the middle to work more efficiently, so you choose 25 and until you trap 1 exact integer, which is the answer!

Binary search is so similar to this game. You choose the middle integer in your current range, and check it. Let's calculate the order of algorithm. We assume you divide the range $$$x$$$ times, then $$$x$$$ would be $$$⌈log2(x)⌉$$$, because you it divides by 2 at most $$$⌈log2(x)⌉$$$ times! So the binary search is $$$O(⌈log(n)⌉)$$$.

Here's a simple code of binary search game:

C++ Code

I explained the game in detail in the code comments ;)

Binary search is optimal algorithm to solve a lot of problems, so if you didn't know how to solve some problems without "Time limit exceeded", then try this!

Hope you enjoy my entry, please make me happy by clicking this little green button below :)

Thanks codeforces!

//This tutorial is just for begginers!

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

»
11 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Shouldn't we use middle = left + (right-left)/2 to escape from overflow?

  • »
    »
    11 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    you are tottaly right this is your implementation is the right one because it avoids an overflow however i think the author tried to make the implementation more intuitive many beginners to binary search would not understand that implementation it still needs to be noticed

  • »
    »
    11 месяцев назад, # ^ |
      Проголосовать: нравится +21 Проголосовать: не нравится

    I have never seen a problem where you must binary search above $$$4 \cdot 10^{18}$$$ and $$$(left+right)/2$$$ overflows