<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TheNewHackers</title>
    <description>The latest articles on DEV Community by TheNewHackers (@thenewhackers).</description>
    <link>https://dev.to/thenewhackers</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F651198%2F7bddc0da-aef3-4bc0-9020-07729888804a.png</url>
      <title>DEV Community: TheNewHackers</title>
      <link>https://dev.to/thenewhackers</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thenewhackers"/>
    <language>en</language>
    <item>
      <title>Busca Binária</title>
      <dc:creator>TheNewHackers</dc:creator>
      <pubDate>Thu, 17 Jun 2021 22:05:42 +0000</pubDate>
      <link>https://dev.to/thenewhackers/busca-binaria-5c0b</link>
      <guid>https://dev.to/thenewhackers/busca-binaria-5c0b</guid>
      <description>&lt;p&gt;A &lt;strong&gt;Busca Binária&lt;/strong&gt; (&lt;em&gt;Binary Search&lt;/em&gt;) é um dos algoritmos de busca mais fáceis de implementar e entender na minha opinião.&lt;/p&gt;

&lt;p&gt;Antes de iniciarmos a explicação, vamos ver o seguinte problema:&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;"Dado um array de inteiros ordenado, descubra se o número 42 está nesse array"&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;O problema parece extremamente simples a primeira vista, e logo já pensamos em uma solução em O(N) - no pior caso. Ou seja percorrer o array do inicio até encontrar o número &lt;em&gt;42&lt;/em&gt;, ou chegar ao fim do array.&lt;/p&gt;

&lt;p&gt;Por exemplo esse código em Ruby:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def naive_solution(arr)
  for elem in arr
    return true if elem == 42
  end

  false
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certo, mas está faltando algo nesse exercício... Qual é o tamanho desse array? Em outras palavras, qual é o valor máximo de N?&lt;/p&gt;

&lt;p&gt;Segue abaixo o benchmark para entendermos até onde nossa solução é viável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                user     system      total        real
N = 10^3    0.000041   0.000002   0.000043 (  0.000038)
N = 10^4    0.000356   0.000015   0.000371 (  0.000370)
N = 10^5    0.003486   0.000000   0.003486 (  0.003486)
N = 10^6    0.038462   0.000000   0.038462 (  0.038473)
N = 10^7    0.352321   0.000000   0.352321 (  0.352354)
N = 10^8    3.532989   0.000000   3.532989 (  3.533004)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que a partir de &lt;code&gt;N = 10^8&lt;/code&gt;, nosso código já começa a apresentar problemas de desempenho!&lt;/p&gt;




&lt;h2&gt;
  
  
  Busca Binária implementada pelo Ruby
&lt;/h2&gt;

&lt;p&gt;Antes mesmo de explicar como a &lt;strong&gt;Busca Binária&lt;/strong&gt; funciona, veja o código e o benchmark dele logo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def built_in_binary_search(arr)
  !arr.bsearch { |elem| 42 - elem }.nil?
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;N = 10^3    0.000026   0.000001   0.000027 (  0.000006)
N = 10^4    0.000019   0.000001   0.000020 (  0.000020)
N = 10^5    0.000015   0.000001   0.000016 (  0.000003)
N = 10^6    0.000028   0.000001   0.000029 (  0.000030)
N = 10^7    0.000004   0.000000   0.000004 (  0.000004)
N = 10^8    0.000004   0.000000   0.000004 (  0.000005)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso mesmo, para N = 10^8, nosso código levou 0,000005 segundos para resolver o problema!&lt;/p&gt;




&lt;h2&gt;
  
  
  Entendendo a Busca Binária
&lt;/h2&gt;

&lt;p&gt;Na busca binária sempre teremos um array ordernado, pois só através da pré-ordenação que conseguiremos fazer otimizações, de modo que passaremos a encontrar um elemento no array em O(logN).&lt;/p&gt;

&lt;p&gt;A primeira etapa é encontrar o inicio do array atual, o fim e o meio desse array. Aqui chamaremos o inicio de &lt;strong&gt;L&lt;/strong&gt;, o fim de &lt;strong&gt;R&lt;/strong&gt; e o meio de &lt;strong&gt;MID&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Utilizaremos o seguinte array para o exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1, 9, 15, 17, 23, 42, 80]
 ^         ^           ^
 L         MID         R 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa primeira etapa teremos &lt;strong&gt;L&lt;/strong&gt; = 0, &lt;strong&gt;R&lt;/strong&gt; = 6 e &lt;strong&gt;MID&lt;/strong&gt; = &lt;strong&gt;(L+R)/2&lt;/strong&gt; = 3.&lt;/p&gt;

&lt;p&gt;Em &lt;strong&gt;MID&lt;/strong&gt; teremos o valor 17, que é menor que o número procurado (&lt;strong&gt;42&lt;/strong&gt;). Então como o array está ordenado, sabemos que o elemento está do lado direito, e que tudo antes de &lt;strong&gt;MID&lt;/strong&gt; pode ser ignorado!&lt;/p&gt;

&lt;p&gt;Assim partimos para a segunda etapa, onde atualizamos os valores das variáveis.&lt;br&gt;
Agora &lt;strong&gt;L&lt;/strong&gt; = &lt;strong&gt;MID&lt;/strong&gt; (3), &lt;strong&gt;R&lt;/strong&gt; continua 6, e &lt;strong&gt;MID&lt;/strong&gt; = &lt;strong&gt;(L+R)/2&lt;/strong&gt; = 4&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1, 9, 15, 17, 23, 42, 80]
           ^   ^       ^
           L   MID     R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Novamente o valor em &lt;strong&gt;MID&lt;/strong&gt; é menor que 42, pois ele é igual a 23.&lt;br&gt;
Assim partiremos para atualização das variáveis novamente.&lt;br&gt;
&lt;strong&gt;L&lt;/strong&gt; = &lt;strong&gt;MID&lt;/strong&gt; (4), &lt;strong&gt;R&lt;/strong&gt; continua 6  e &lt;strong&gt;MID&lt;/strong&gt; = &lt;strong&gt;(L+R)/2&lt;/strong&gt; = 5&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1, 9, 15, 17, 23, 42, 80]
               ^   ^    ^
               L   MID  R
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o valor em &lt;strong&gt;MID&lt;/strong&gt; é 42, então finalizamos nosso algoritmo!&lt;/p&gt;

&lt;p&gt;Veja que gastamos 3 iterações para achar o número 42, e em uma busca sequencial (similar a &lt;code&gt;naive_solution&lt;/code&gt;) gastaríamos 6 iterações! Ou seja, 2 VEZES MAIS RÁPIDO!&lt;/p&gt;




&lt;p&gt;Abaixo segue os links dos arquivos utilizados para o benchmark:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/binary_search.rb"&gt;https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/binary_search.rb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/built_in_binary_search.rb"&gt;https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/built_in_binary_search.rb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/naive.rb"&gt;https://github.com/TheNewHackers/busca-algoritmos/blob/master/binary_search/naive.rb&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algoritmos</category>
      <category>buscabinaria</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
