<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Notação Big O - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Notação Big O - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 04:46:55 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/notacao-big-o/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Notação Big O explicada com exemplos ]]>
                </title>
                <description>
                    <![CDATA[ A notação Big O é uma forma de descrever a velocidade ou a complexidade de um determinado algoritmo. Se o seu projeto atual exige um algoritmo pré-definido, é importante entender se ele é mais rápido ou mais lento em comparação com outras opções. O que é a notação Big O ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/notacao-big-o-explicada-com-exemplos/</link>
                <guid isPermaLink="false">623355186a6ca90519ace767</guid>
                
                    <category>
                        <![CDATA[ Notação Big O ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Thu, 17 Mar 2022 16:05:22 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/5f9c9cf0740569d1a4ca3502.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/big-o-notation-explained-with-examples/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Big O Notation Explained with Examples</a>
      </p><p>A notação Big O é uma forma de descrever a velocidade ou a complexidade de um determinado algoritmo. Se o seu projeto atual exige um algoritmo pré-definido, é importante entender se ele é mais rápido ou mais lento em comparação com outras opções.</p><h2 id="o-que-a-nota-o-big-o-e-como-ela-funciona"><strong>O que é a notação Big O e como ela funciona?</strong></h2><p>De modo simplificado, a notação Big O informa a você o número de operações que um algoritmo fará. Ele recebe o nome do literal "Big O" adiante de um número de operações estimado.</p><p>O que a notação Big O não diz a você é a velocidade do algoritmo em segundos. Há muitos fatores que influenciam o tempo que leva para a execução de um algoritmo. Em vez disso, usamos a notação Big O para comparar algoritmos diferentes pelo número de operações que ele realiza.</p><h3 id="a-big-o-estabelece-o-pior-caso-para-o-tempo-de-execu-o"><strong>A Big O estabelece o pior caso para o tempo de execução</strong></h3><p>Imagine que você é um professor e tem uma aluna chamada Jane. Você quer encontrar os registros dela. Você usa um algoritmo de busca simples para percorrer o banco de dados da escola do bairro.</p><p>Você saber que uma busca simples leva O(n) vezes para ser executada. Isso quer dizer que, no pior caso, você terá que examinar cada registro (representado aqui pelo n) até encontrar o de Jane.</p><p>Quando você executa uma busca simples, no entanto, descobre que o registro de Jane é o primeiro do banco de dados. Você não precisa olhar todas as outras entradas – já a encontrou na primeira tentativa.</p><p><em>Esse algoritmo levou <em>O(n) </em>vezes<em>? O</em>u levou<em> O(1) </em>vez, já que você encontrou o registro de <em>Jane</em> de primeira<em>?</em></em></p><p>Neste caso, 0(1) é o melhor cenário – você teve a sorte de achar o registro de Jane bem no começo. Mas a notação Big O leva em conta o pior dos casos, que é 0(n) para a busca simples. É uma reafirmação de que a busca simples nunca será mais lenta que O(n).</p><h3 id="o-n-mero-de-vezes-de-execu-o-de-um-algoritmo-cresce-em-taxas-diferentes"><strong>O número de vezes de execução de um algoritmo cresce em taxas diferentes</strong></h3><p>Leve em conta que é preciso 1 milissegundo para verificar cada elemento no banco de dados a escola do bairro.</p><p>Com a busca simples, se você tivesse de verificar 10 entradas, a execução levaria 10 ms. Com o <em>algoritmo de busca binária</em>, porém, é necessário verificar apenas 3 elementos, o que faz com que a execução leve 3 ms.</p><p>Na maioria dos casos, a lista ou banco de dados em que você precisa procurar registros terá centenas ou milhares de elementos.</p><p>Se houver 1 bilhão de elementos, usar uma busca simples levará 1 bilhão de ms, ou 11 dias. Por outro lado, com a busca binária, levará apenas 32 ms no pior dos casos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/31781165-723a053c-b500-11e7-937c-7b33db281efe.png" class="kg-image" alt="31781165-723a053c-b500-11e7-937c-7b33db281efe" width="464" height="129" loading="lazy"></figure><p>Parece claro que os tempos de execução de uma busca simples e de uma busca binária não têm a mesma taxa de crescimento. Conforme o número de entradas na lista aumenta, a busca binária leva apenas um tempo minúsculo a mais para ser executada. Já o tempo de execução da busca simples aumenta exponencialmente à medida que a lista de entradas cresce.</p><p>É por isso que saber como aumenta o tempo de execução em relação ao tamanho da lista é tão importante. É exatamente por isso que a notação Big O é tão útil.</p><h3 id="a-nota-o-big-o-mostra-o-n-mero-de-opera-es"><strong>A notação Big O mostra o número de operações</strong></h3><p>Como mencionamos acima, a notação Big O não mostra o <em><em>t</em>empo</em> que um algoritmo leva. Em vez disso, ele mostra o número de operações que o algoritmo realizará. Ele mostra a velocidade na qual um algoritmo cresce e permite que o comparemos com outros algoritmos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/03/31781175-768c208e-b500-11e7-9718-e632d1391e2d.png" class="kg-image" alt="31781175-768c208e-b500-11e7-9718-e632d1391e2d" width="441" height="357" loading="lazy"></figure><p>Aqui temos alguns algoritmos comuns e seus tempos de execução em notação Big O:</p><!--kg-card-begin: html--><table style="box-sizing: inherit; border: 0px; margin: 0.5em 0px 2.5em; padding: 0px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-weight: 400; font-stretch: inherit; line-height: inherit; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, Cantarell, &quot;Open Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; font-size: 1.6rem; vertical-align: top; border-spacing: 0px; border-collapse: collapse; display: inline-block; overflow-x: auto; max-width: 100%; width: auto; white-space: nowrap; background: radial-gradient(at left center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 0px center / 10px 100% no-repeat scroll, radial-gradient(at right center, rgba(0, 0, 0, 0.2) 0px, rgba(0, 0, 0, 0) 75%) 100% center / 10px 100% scroll rgb(24, 26, 27); color: rgb(218, 215, 210); letter-spacing: normal; orphans: 2; text-align: start; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><thead style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">NOTAÇÃO BIG O</th><th style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 1.2rem; vertical-align: baseline; color: var(--darkreader-text--gray85); letter-spacing: 0.2px; text-align: center; text-transform: uppercase; background-color: var(--darkreader-bg--gray10);">ALGORITMO DE EXEMPLO</th></tr></thead><tbody style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">O(log n)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Busca binária</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">O(n)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Busca simples</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">O(n * log n)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Ordenação Quicksort</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">O(n2)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Ordenação de seleção</td></tr><tr style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline;"><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to right, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">O(n!)</td><td style="box-sizing: inherit; margin: 0px; padding: 6px 12px; border: var(--darkreader-border--gray10) 1px solid; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16px; vertical-align: baseline; background-image: linear-gradient(to left, rgb(24, 26, 27) 50%, rgba(24, 26, 27, 0) 100%); background-position: 100% 0px; background-size: 20px 100%; background-repeat: no-repeat; text-align: center;">Problema do caixeiro viajante</td></tr></tbody></table><!--kg-card-end: html--><p>Agora, você já sabe o suficiente para começar a explorar a notação Big O. Cabe a você começar a comparar seus algoritmos.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é a notação Big O: complexidade de tempo e de espaço ]]>
                </title>
                <description>
                    <![CDATA[ Você entende de fato a notação Big O? Se entende, este artigo ajudará a refrescar a memória antes de uma entrevista. Caso contrário, não se preocupe — venha e junte-se a nós nessa viagem pela Ciência da Computação. Se você já fez cursos relacionados com algoritmos, já ouviu falar do ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-a-notacao-big-o-complexidade-de-tempo-e-de-espaco/</link>
                <guid isPermaLink="false">61b78a4df15c8104f2fda0f9</guid>
                
                    <category>
                        <![CDATA[ Notação Big O ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Daniel Rosa ]]>
                </dc:creator>
                <pubDate>Wed, 15 Dec 2021 12:24:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_NSxbYAwcC7Qzk7PP.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/big-o-notation-why-it-matters-and-why-it-doesnt-1674cfa8a23c/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Big O Notation Explained: Space and Time Complexity</a>
      </p><p>Você entende de fato a notação Big O? Se entende, este artigo ajudará a refrescar a memória antes de uma entrevista. Caso contrário, não se preocupe — venha e junte-se a nós nessa viagem pela Ciência da Computação.</p><p>Se você já fez cursos relacionados com algoritmos, já ouviu falar do termo <strong>notação</strong> <strong><strong>Big O</strong></strong>. Se ainda não fez, vamos examinar essa notação aqui e buscar um entendimento maior sobre o que ela é de fato.</p><p>A notação Big O é uma das ferramentas mais importantes para os cientistas da computação analisarem o custo de um algoritmo. É uma prática recomendada para engenheiros de software entendê-la bem.</p><p>Este artigo foi escrito tendo em conta que você já mexeu com código em algum momento. Além disso, algumas partes mais "profundas" do material também requerem um conhecimento de matemática do ensino médio. Assim, pode ser um pouco menos confortável para iniciantes. Se, no entanto, você sentir que está pronto, vamos começar!</p><p>Neste artigo, discutiremos em profundidade a notação Big O. Começaremos com um algoritmo de exemplo para ampliar sua compreensão. Depois, veremos um pouco de matemática para termos um entendimento mais formal. Depois disso, veremos algumas variações comuns da notação Big O. No fim, veremos algumas das limitações da Big O em um cenário prático. Confira o sumário abaixo.</p><h3 id="sum-rio"><strong>Sumário</strong></h3><ol><li>O que é a notação Big O e qual a sua importância</li><li>Definição formal da notação Big O</li><li>Big O, Little O, Omega e Theta</li><li>Comparação de complexidade entre as Big Os típicas</li><li>Complexidade de tempo e de espaço</li><li>Complexidade ideal, média, de pior caso e esperada</li><li>Por que a Big O não importa</li><li>No fim das contas…</li></ol><p>Vamos começar.</p><h3 id="1-o-que-a-nota-o-big-o-e-qual-a-sua-import-ncia"><strong>1. </strong>O que é a notação Big O e qual a sua importância</h3><blockquote>"A notação Big O é uma notação matemática que descreve o comportamento limitante de uma função quando o argumento tende a um valor específico ou ao infinito. Ela pertence a uma família de notações inventadas por Paul Bachmann, Edmund Landau e outros, coletivamente chamadas de notação Bachmann–Landau ou de notação assintótica."<br><br>— Definição da Wikipédia de notação Big O</blockquote><p>Dito de modo um pouco mais simples, a notação Big O descreve a <strong><strong>complexi</strong>dade</strong> do seu código usando termos algébricos.</p><p>Para entender o que é a notação Big O, vamos dar uma olhada em um exemplo típico, <strong><strong><em><em>O(n²)</em></em></strong></strong>, que geralmente é chamada também de <strong><em>"</em><strong><em><em>Big O </em></em></strong><em>quadrática"</em></strong>. A letra <strong><em>"</em><strong><em><em>n</em></em></strong><em>"</em></strong> representa o <strong>tamanho da entrada</strong>, enquanto a função <strong><em>"</em><strong><em><em>g(n) = n²</em></em></strong><em>"</em></strong> interna ao <strong><em>"</em><strong><em><em>O()</em></em></strong><em>"</em></strong> nos dá a ideia da complexidade do algoritmo em relação ao tamanho da entrada.</p><p>Um algoritmo típico que tem a complexidade O(n²) seria o algoritmo <strong><strong>selection sort</strong></strong> (algoritmo de ordenação por seleção). O selection sort é um algoritmo de ordenação que itera por uma lista para garantir que cada elemento em um índice <strong><strong><em><em>i</em></em></strong></strong> seja o <strong><strong><em><em>i</em></em></strong><em>-ésimo</em></strong> elemento menor/maior da lista. Abaixo, vemos um <strong><strong>CODEPEN</strong></strong> que nos dá um exemplo visual disso.</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_yEpRVr" src="https://codepen.io/iMultiThinker/embed/preview/yEpRVr?default-tabs=js%2Cresult&amp;height=300&amp;host=https%3A%2F%2Fcodepen.io&amp;slug-hash=yEpRVr" title="Selection Sort" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" style="width: 100%; overflow: hidden;" loading="lazy"></iframe></figure><p>O algoritmo pode ser descrito pelo código abaixo. Para garantir que o <em><em>i</em>-ésimo</em> elemento seja o <em><em>i</em>-ésimo</em> menor elemento da lista, este algoritmo itera primeiramente por toda a lista por meio de um laço for. Depois, para cada elemento, ele usa outro laço for para encontrar o menor elemento na parte restante da lista.</p><pre><code class="language-js">SelectionSort(Lista) {
  for(i de 0 a Lista.Length) {
    MenorElemento = Lista[i]
    for(j de i a Lista.Length) {
      if(MenorElemento &gt; Lista[j]) {
        MenorElemento = Lista[j]
      }
    }
    Inverte(Lista[i], MenorElemento)
  }
}</code></pre><p>Neste cenário, vamos considerar a variável <strong><strong><em><em>Lis</em></em></strong><em>ta</em></strong> como a entrada. Desse modo, o tamanho da entrada n é o <strong><strong><em><em>n</em></em></strong><em>úmero de elementos dentro da </em><strong><em><em>List</em></em></strong><em>a</em></strong>. Levamos em conta que a instrução if e que a atribuição de valor ligada à instrução if levam um tempo constante. Assim, descobriremos a notação big O da função SelectionSort analisando quantas vezes as instruções serão executadas.</p><p>Primeiro, o laço interno executa as instruções dentro dele n vezes. Depois, após incrementar o <strong><strong><em><em>i</em></em></strong></strong>, o laço for interno é executado n-1 vezes… até executar uma última vez, quando os dois laços for chegarão à sua condição de encerramento.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_1ajbPJXjt3z7CofVODlaCw.png" class="kg-image" alt="1_1ajbPJXjt3z7CofVODlaCw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_1ajbPJXjt3z7CofVODlaCw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_1ajbPJXjt3z7CofVODlaCw.png 800w" sizes="(min-width: 720px) 720px" width="800" height="355" loading="lazy"><figcaption>Laços do Selection Sort ilustrados</figcaption></figure><p>Isso acaba nos dando uma soma geométrica. A <a href="https://pt.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF">matemática do ensino médio</a> nos ajudará a perceber que o laço interno se repetirá 1+2 … + n vezes, o que é igual a n(n-1)/2 vezes. Se multiplicarmos isso, teremos n²/2-n/2.</p><p>Ao calcularmos a notação big O, nos importamos apenas com os <strong><strong>d</strong>ermos d<strong>ominant</strong>e<strong>s</strong></strong>, sem nos importarmos com os coeficientes. Assim, assumimos que n² é a nossa big O final. Escrevemos isso como O(n²), o que, novamente, é chamado de <em>"<em>Big O </em>quadrática"</em>.</p><p>Você pode estar se perguntando o que é um <strong><em>"termo d</em><strong><em><em>ominant</em></em></strong><em>e"</em></strong>. E, talvez, o motivo de não nos importarmos com os coeficientes. Mas não se preocupe, veremos os motivos um por um. Pode ser um pouco difícil de entender no início, mas tudo fará mais sentido depois de você ler a próxima seção.</p><h3 id="2-defini-o-formal-da-nota-o-big-o"><strong>2. </strong>Definição formal da notação Big O</h3><p>Era uma vez um rei indiano que queria recompensar um homem sábio por seu excelente trabalho. O homem sábio pediu a ele apenas trigo suficiente para preencher um tabuleiro de xadrez.</p><p>A única regra era: na primeira casa, ele queria 1 grão de trigo, depois 2 na segunda, 4 na terceira… cada casa no tabuleiro de xadrez precisava ser preenchido com o dobro da quantidade de grãos da casa anterior. O rei inocente concordou sem hesitar, pensando que seria uma demanda simples de atender, até que finalmente tentou fazê-lo…</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_em0jJ2rgj-ZapCef.jpg" class="kg-image" alt="0_em0jJ2rgj-ZapCef" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/0_em0jJ2rgj-ZapCef.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_em0jJ2rgj-ZapCef.jpg 800w" sizes="(min-width: 720px) 720px" width="800" height="594" loading="lazy"><figcaption>Trigo e o tabuleiro de xadrez, imagem retirada da <a href="https://en.wikipedia.org/wiki/Wheat_and_chessboard_problem">Wikipédia</a></figcaption></figure><p>Quantos grãos de trigo o rei acabou devendo ao homem sábio? Sabemos que um tabuleiro de xadrez tem 8 por 8 casas, totalizando 64. Assim, a última casa terá 2⁶⁴ grãos de trigo. Se fizer os cálculos on-line, chegará a 1,8446744*10¹⁹, ou cerca de 18 seguido de 18 zeros. Levando em conta que cada grão pesa 0,01 gramas, isso nos dá 184.467.440.737 toneladas de trigo. E 184 bilhões de toneladas é bastante, não?</p><p>Os números crescem muito rapidamente com o crescimento exponencial, não é mesmo? A lógica também serve para algoritmos computacionais. Se o esforço exigido para realizar uma tarefa cresce exponencialmente com relação ao tamanho da entrada, ele pode acabar sendo incrivelmente grande.</p><p>Bem, o quadrado de 64 é 4096. Se você adicionar 4096 ao número 2⁶⁴, será um valor desprezível com relação aos algarismos significativos. É por isso que, ao olharmos para a taxa de crescimento, só nos importamos com os termos dominantes. Como queremos analisar o crescimento com relação ao tamanho da entrada, os coeficientes que apenas multiplicam o valor em vez de crescer juntamente com o tamanho da entrada não contêm informações úteis.</p><p>Abaixo, vemos a definição formal de Big O (em inglês):</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_cyqWw3UxODl-wqJi.jpg" class="kg-image" alt="0_cyqWw3UxODl-wqJi" width="800" height="600" loading="lazy"><figcaption><a href="https://slideplayer.com/slide/9739625/" rel="noopener">Slides da CSE 373</a> da Universidade de Washington</figcaption></figure><p>A definição formal é útil quando precisamos realizar uma prova matemática. Por exemplo, a complexidade de tempo para a ordenação por seleção pode ser definida pela função f(n) = n²/2-n/2, como mostramos na seção anterior.</p><p>Se nossa função g(n) for representada por n², encontramos uma constante c = 1 e um N₀ = 0. Enquanto N &gt; N₀, N² será sempre maior que N²/2-N/2. Podemos provar isso facilmente subtraindo N²/2 de ambas as funções, quando veremos facilmente que N²/2 &gt; -N/2 é verdadeiro quando N &gt; 0. Portanto, podemos chegar à conclusão que f(n) = O(n²), na outra selection<em><em> sort</em>,<em> </em>é<em> </em>uma "<em>big O</em></em> quadrática".</p><p>Você pode ter percebido um truque aqui. Se você fizer g(n) crescer muito rápido, O(g(n)) sempre será suficientemente grande. Por exemplo, para qualquer função polinomial, você pode ter certeza ao dizer que são O(2ⁿ), pois 2ⁿ em algum momento ultrapassará qualquer polinômio.</p><p>Matematicamente, você está certo, mas quando falamos sobre Big O em geral, queremos saber o <strong>limite estrito</strong> da função. Você entenderá isso melhor ao ler a próxima seção.</p><p>Antes de passarmos a ela, vamos testar seu entendimento com a seguinte pergunta. A resposta será encontrada nas próximas seções, basta seguir lendo.</p><blockquote><strong>Pergunta<strong>:</strong></strong> uma imagem é representada por um array de pixels bidimensional. Se você usar um laço for aninhado para iterar por cada pixel (ou seja, se tiver um laço for para todas as colunas, e outro laço for &nbsp;interno para todas as linhas), qual será a complexidade de tempo do algoritmo quando a imagem é considerada como a entrada?</blockquote><h3 id="3-big-o-little-o-omega-e-theta"><strong>3. Big O, Little O, Omega e Theta</strong></h3><blockquote>Big O: "f(n) é O(g(n))" se e somente se, para algumas constantes c e N₀, f(N) ≤ cg(N) para todos N &gt; N₀<br><br>Omega: "f(n) é Ω(g(n))" se e somente se, para algumas constantes c e N₀, f(N) ≥ cg(N) para todos N &gt; N₀<br><br>Theta: "f(n) é Θ(g(n))" se e somente se f(n) for O(g(n)) e f(n) for Ω(g(n))<br><br>Little O: "f(n) é o(g(n))" se e somente se f(n) for O(g(n)) e f(n) não for Θ(g(n))<br><br>—Definição formal de Big O, Omega, Theta e Little O</blockquote><p>Simplificando:</p><ul><li><strong><strong>Big O (O())</strong></strong> descreve o <strong>limite superior</strong> da complexidade.</li><li><strong><strong>Omega (Ω())</strong></strong> descreve o <strong><strong>l</strong>imite inferior</strong> da complexidade.</li><li><strong><strong>Theta (Θ())</strong></strong> descreve o <strong>limite exato</strong> da complexidade.</li><li><strong><strong>Little O (o())</strong></strong> descreve o <strong>limite superior<strong> exclu</strong>indo o limite exato</strong>.</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_O-dcXbYXojkAPEnDuVZMvA.png" class="kg-image" alt="1_O-dcXbYXojkAPEnDuVZMvA" width="594" height="441" loading="lazy"><figcaption>Relações entre Big O, Little O, Omega e Theta ilustradas</figcaption></figure><p>Por exemplo, a função g(n) = n² + 3n é O(n³), o(n⁴), Θ(n²) e Ω(n). Mas você estaria correto se dissesse que é Ω(n²) ou O(n²).</p><p>Em geral, quando falamos de Big O, o que se está falando de fato é de Theta. Não faz sentido dar um limite superior que é muito maior que o escopo da análise. Seria semelhante a resolver inequações colocando ∞ no lado maior, o que quase sempre faz com que você esteja certo.</p><p>Mas como determinamos quais funções são mais complexas que as outras? Na próxima seção que você lerá, aprenderemos isso em detalhes.</p><h3 id="4-compara-o-de-complexidade-entre-big-os-t-picas"><strong>4. Comparação de complexidade entre Big Os típicas</strong></h3><p>Quando tentamos descobrir a Big O para uma função g(n) específica, nos preocupamos apenas com o <strong>termo d<strong>ominant</strong>e</strong> da função. O termo dominante é o termo que cresce mais rápido.</p><p>Por exemplo, n² cresce mais rápido que n. Assim, se tivermos algo como g(n) = n² + 5n + 6, teremos uma big O(n²). Se você já fez cálculo no passado, isso é muito semelhante a achar o atalho para encontrar limites para polinômios fracionários, onde você só se importa com o termo dominante para numeradores e denominadores no fim.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_MPwgKd4lgXACfuNt.png" class="kg-image" alt="0_MPwgKd4lgXACfuNt" width="498" height="298" loading="lazy"><figcaption>Outra maneira de vermos a Big O, imagem do <a href="https://stackoverflow.com/questions/1364444/difference-between-big-o-and-little-o-notation" rel="noopener">Stack Overflow</a></figcaption></figure><p>Mas qual função cresce mais rápido do que as outras? Existem, de fato, algumas regras.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_KfZYFUT2OKfjekJlCeYvuQ.jpeg" class="kg-image" alt="1_KfZYFUT2OKfjekJlCeYvuQ" width="800" height="556" loading="lazy"><figcaption>Crescimento da complexidade, ilustração de <a href="http://bigocheatsheet.com/" rel="noopener">Big O Cheatsheet</a></figcaption></figure><h4 id="1-o-1-tem-a-menor-complexidade"><strong>1. O(1) tem a menor complexidade</strong></h4><p>Geralmente chamado de <strong><em>"tempo constante"</em></strong>, se você pode criar um algoritmo para resolver o problema em O(1), isso é normalmente o melhor que você pode conseguir. Em alguns cenários, a complexidade pode passar de O(1), então podemos analisá-la encontrando sua contrapartida O(1/g(n)). Por exemplo, O(1/n) é mais complexo do que O(1/n²).</p><h4 id="2-o-log-n-mais-complexo-do-que-o-1-mas-menos-complexo-do-que-polin-mios"><strong>2. O(log(n)) é mais complexo do que O(1), mas menos complexo do que polinômios</strong></h4><p>Como a complexidade geralmente está associada a algoritmos de dividir e conquistar, O(log(n)) costuma ser uma complexidade boa que você pode alcançar em algoritmos de ordenação. O(log(n)) é menos complexo que O(√n), pois a função da raiz quadrada pode ser considerada um polinômio, onde o expoente é 0,5.</p><h4 id="3-a-complexidade-dos-polin-mios-aumenta-de-acordo-com-o-aumento-do-expoente"><strong>3. A complexidade dos polinômios aumenta de acordo com o aumento do expoente</strong></h4><p>Por exemplo, O(n⁵) é mais complexo que O(n⁴). Devido à simplicidade disso, passamos por vários exemplos de polinômios nas seções anteriores.</p><h4 id="4-exponenciais-t-m-maior-complexidade-do-que-polin-mios-contanto-que-os-coeficientes-sejam-m-ltiplos-positivos-de-n"><strong>4. Exponenciais têm maior complexidade do que polinômios, contanto que os coeficientes sejam múltiplos positivos de n</strong></h4><p>O(2ⁿ) é mais complexo que O(n⁹⁹), mas O(2ⁿ) é, de fato, menos complexo que O(1). Geralmente usamos 2 como a base para exponenciais e logaritmos porque as coisas tendem a ser binárias em Ciência da Computação, mas os expoentes podem ser <a href="https://www.decodedscience.org/how-to-convert-the-base-of-an-exponent-with-logarithms/18524" rel="noopener">alterados</a> mudando-se os coeficientes. Se não estiver especificada, assume-se que a base para os logaritmos seja 2.</p><h4 id="5-fatoriais-t-m-complexidade-maior-do-que-exponenciais"><strong>5. Fatoriais têm complexidade maior do que exponenciais</strong></h4><p>Se tiver interesse no motivo para isso, consulte a <strong><a href="https://pt.wikipedia.org/wiki/Fun%C3%A7%C3%A3o_gama">função Gama</a></strong>, que é uma <strong><a href="https://pt.wikipedia.org/wiki/Extens%C3%A3o_anal%C3%ADtica">extensão analítica</a></strong> de um fatorial. Uma pequena prova disso é que fatoriais e exponenciais têm o mesmo número de multiplicações, mas os números que são multiplicados crescem para os fatoriais, mas permanecem constantes para as exponenciais.</p><h4 id="6-termos-multiplicadores"><strong>6. Termos multiplicadores</strong></h4><p>Ao multiplicar, a complexidade será maior que a original, mas não mais que a equivalência de multiplicar algo que é mais complexo. Por exemplo, O(n * log(n)) é mais complexo que O(n), mas menos complexo do que O(n²), pois O(n²) = O(n * n) e n é mais complexo do que log(n).</p><p>Para testar sua compreensão, tente classificar as funções a seguir da mais complexa para a menos complexa. As soluções com explicações detalhadas podem ser encontradas em uma seção posterior quando você chegar lá. Algumas delas tendem a ser traiçoeiras e podem exigir uma compreensão maior da matemática. Ao chegar à solução, você as entenderá melhor.</p><blockquote><strong>Pergunta<strong>:</strong></strong> classifique as funções abaixo, da mais complexa para a menos complexa.</blockquote><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_69bzUpQxBwZFLBimaMe7kQ.png" class="kg-image" alt="1_69bzUpQxBwZFLBimaMe7kQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_69bzUpQxBwZFLBimaMe7kQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_69bzUpQxBwZFLBimaMe7kQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="282" loading="lazy"><figcaption>Exemplos extraídos do site <a href="https://www.chegg.com/homework-help/questions-and-answers/problem-ask-refresh-knowledge-asymptotic-notations-rank-following-functions-order-growth-f-q23698273" rel="noopener">Textbook Problems</a></figcaption></figure><blockquote><strong><strong>Solu</strong>ção para a pergunta da seção 2<strong>:</strong></strong><br><br>Era para ser de fato uma pergunta traiçoeira para testar seu entendimento. A questão tenta fazer com que você responda O(n²), pois há um laço for aninhado. Porém, n deve ser o tamanho da entrada. Como o array da imagem é a entrada, e como cada pixel foi iterado apenas uma vez, a resposta de fato é O(n). Na próxima seção, você verá mais exemplos como esse.</blockquote><h3 id="5-complexidade-de-espa-o-e-de-tempo"><strong>5. Complexidade de espaço e de tempo</strong></h3><p>Até o momento, só discutimos a complexidade de tempo dos algoritmos. Ou seja, só nos preocupamos com o tempo que leva para o programa completar a tarefa. O que também importa é o espaço que o programa leva para completar a tarefa. A complexidade de espaço é relacionada com o quanto de memória o programa usará e, portanto, também é um fator importante a ser analisado.</p><p>A complexidade de espaço funciona de modo semelhante à complexidade de tempo. Por exemplo, a selection sort tem uma complexidade de espaço de O(1), porque ela somente armazena um valor mínimo e seu índice para comparação, o espaço máximo usado não aumenta com o tamanho da entrada.</p><p>Alguns algoritmos, como a bucket sort, tem uma complexidade de espaço de O(n), mas pode reduzir a complexidade de tempo para O(1). A bucket sort ordena o array criando uma lista ordenada de todos os elementos possíveis no array, depois incrementa o contador sempre que um elemento é encontrado. No fim, o array ordenado serão os elementos da lista ordenada repetidos por suas contagens.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_GfLWx2TXS55unwqZ5-X26w.png" class="kg-image" alt="1_GfLWx2TXS55unwqZ5-X26w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_GfLWx2TXS55unwqZ5-X26w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_GfLWx2TXS55unwqZ5-X26w.png 761w" sizes="(min-width: 720px) 720px" width="761" height="502" loading="lazy"><figcaption>Visualização da Bucket Sort</figcaption></figure><h3 id="6-complexidade-ideal-m-dia-de-pior-caso-e-esperada"><strong>6. </strong>Complexidade ideal, média, de pior caso e esperada</h3><p>A complexidade também será analisada como a ideal, de pior caso, média e esperada.</p><p>Vejamos a <strong><strong>insertion sort,</strong></strong> por exemplo. A insertion sort itera por todos os elementos da lista. Se o elemento for menor que o elemento anterior, ela insere o elemento antes do outro elemento até que ele seja maior que o elemento anterior.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_C9ork5K0ay7_CLBv.gif" class="kg-image" alt="0_C9ork5K0ay7_CLBv" width="300" height="180" loading="lazy"><figcaption>Insertion Sort ilustrada, imagem da <a href="https://en.wikipedia.org/wiki/Insertion_sort" rel="noopener">Wikipédia</a></figcaption></figure><p>Se o array já estiver ordenado inicialmente, não haverá trocas. O algoritmo vai iterar pelo array apenas uma vez, o que resulta em uma complexidade de O(n). Portanto, diríamos que a complexidade de tempo de <strong>melhor caso </strong>da insertion sort é O(n). Uma complexidade de O(n) também é conhecida normalmente como <strong>complexidade l<strong>inear</strong></strong>.</p><p>Algumas vezes, o algoritmo simplesmente tem má sorte. A quick sort, por exemplo, terá de percorrer a lista no tempo O(n) se os elementos forem ordenados na ordem oposta, mas, na média, ele ordena o array no tempo O(n * log(n)). Em geral, quando avaliamos a complexidade de tempo de um algoritmo, vemos o seu desempenho no <strong>pior dos casos</strong>. Mais sobre isso e sobre a quick sort será discutido na próxima seção quando você chegar lá.</p><p>A complexidade média descreve o desempenho esperado do algoritmo. Algumas vezes, isso envolve calcular a probabilidade de cada cenário. Pode ser complicado entrar em detalhes e, por isso, não discutimos essa questão neste artigo. Abaixo temos uma ficha informativa da complexidade de tempo e de espaço dos algoritmos típicos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_XZsrnwao98R3dGTB.png" class="kg-image" alt="0_XZsrnwao98R3dGTB" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/0_XZsrnwao98R3dGTB.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/0_XZsrnwao98R3dGTB.png 800w" sizes="(min-width: 720px) 720px" width="800" height="563" loading="lazy"><figcaption><a href="http://bigocheatsheet.com/" rel="noopener">Ficha informativa de Big O</a> para algoritmos comuns</figcaption></figure><blockquote><strong><strong>Solu</strong>ção para a pergunta da seção<strong> 4</strong>:</strong></blockquote><p>Ao inspecionar as funções, poderemos classificar imediatamente os seguintes polinômios do mais complexo para o menos complexo com a regra 3. Nela, a raiz quadrada de n é simplesmente n na potência 0,5.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_RKlbisO36urUbi237TjyrQ.png" class="kg-image" alt="1_RKlbisO36urUbi237TjyrQ" width="800" height="91" loading="lazy"></figure><p>Então, ao aplicar as regras 2 e 6, temos o seguinte. O log de base 3 pode ser convertido na base 2 com a <strong><a href="http://home.windstream.net/okrebs/page57.html">mudança de base dos logaritmos</a></strong>. O log de base 3 ainda cresce um pouco mais lentamente do que os logs de base 2, vindo, desse modo, classificado depois.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_6R1jrWMGXpKxBqtEre9q8Q.png" class="kg-image" alt="1_6R1jrWMGXpKxBqtEre9q8Q" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_6R1jrWMGXpKxBqtEre9q8Q.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_6R1jrWMGXpKxBqtEre9q8Q.png 800w" sizes="(min-width: 720px) 720px" width="800" height="52" loading="lazy"></figure><p>O resto pode parecer um pouco mais difícil, mas vamos tentar desvendar os mistérios e ver onde podemos colocá-los.</p><p>Primeiro, 2 na potência 2 na potência n é maior do que 2 na potência n. O +1 dá um tempero ainda maior.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_eGLwpHDUJtr6CuALrpcQ2w.png" class="kg-image" alt="1_eGLwpHDUJtr6CuALrpcQ2w" width="434" height="220" loading="lazy"></figure><p>E já que sabemos que 2 na potência log(n) com base 2 é igual a n, podemos converter o seguinte. O log com 0.001 como expoente cresce um pouco mais do que as constantes, mas menos do que qualquer outra coisa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_4yo7najRBY_OaTnDpT3cIg.png" class="kg-image" alt="1_4yo7najRBY_OaTnDpT3cIg" width="800" height="338" loading="lazy"></figure><p>Aquele termo com n na potência log(log(n)) é de fato uma variação do tempo <strong><a href="https://pt.wikipedia.org/wiki/Complexidade_de_Tempo#Tabela_de_tempos_de_complexidade_comuns"><strong>quasi-pol</strong>inomial</a></strong>, que é maior do que o polinômio, mas menor que a exponencial. Como log(n) cresce mais lento do que n, a complexidade dele é um pouco menor. Aquele termo com o log invertido converge para constante, pois 1/log(n) diverge para o infinito.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_ZYUCFuiSbOibqdSfmuwdvA.png" class="kg-image" alt="1_ZYUCFuiSbOibqdSfmuwdvA" width="434" height="148" loading="lazy"></figure><p>Os fatoriais podem ser representados por multiplicações, podendo ser convertidos para adições fora da função logarítmica. "n seleção de 2" pode ser convertido em um polinômio com um termo cúbico sendo o maior.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_cbrjlMGsWYCs36u831pLTA.png" class="kg-image" alt="1_cbrjlMGsWYCs36u831pLTA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_cbrjlMGsWYCs36u831pLTA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_cbrjlMGsWYCs36u831pLTA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="242" loading="lazy"></figure><p>Finalmente, podemos classificar as funções da mais complexa para a menos complexa.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_NHVggTVMGjGOe7SxtSgIpQ.png" class="kg-image" alt="1_NHVggTVMGjGOe7SxtSgIpQ" width="704" height="1096" loading="lazy"></figure><h3 id="por-que-a-big-o-n-o-importa"><strong>Por que a Big O não importa</strong></h3><blockquote><strong><strong>!!! — </strong>AVISO<strong> — !!!</strong></strong><br><br>O conteúdo discutido aqui geralmente <strong><strong>n</strong>ã<strong>o</strong> é<strong> ac</strong>eito</strong> pela maioria dos programadores do mundo. Discuta o assunto <strong>por sua conta e risco</strong> em uma entrevista. Já houve quem publicasse em um blog sobre como <strong>não tiveram sucesso</strong> em entrevistas para a Google por terem questionado a autoridade, como ocorre aqui.<br><br><strong><strong>!!! — </strong>AVISO<strong> — !!!</strong></strong></blockquote><p>Como aprendemos anteriormente que a complexidade de tempo de pior caso para a quick sort é de O(n²), mas de O(n * log(n)) para a merge sort, esta última deve ser mais rápida, certo? Você provavelmente deve ter adivinhado que a resposta é falsa. Os algoritmos simplesmente foram construídos de um modo que torna a quick sort... &nbsp;<em>"rápida"</em>.</p><p>Para demonstrar, confira este <a href="https://trinket.io/python/87a3166026" rel="noopener">trinket.io</a> que eu fiz. Ele compara o tempo para a quick sort e a merge sort. Eu só consegui testar isso em arrays de comprimento menor ou igual a 10000, mas, como você pode ver até o momento, o tempo da merge sort cresce mais rápido do que o da quick sort. Embora a quick sort tenha uma complexidade de O(n²) no pior caso, a probabilidade de ele acontecer é realmente muito baixa. Quando se trata do aumento de velocidade que a quick sort tem com relação à merge sort, limitada pela complexidade O(n * log(n)) , a quick sort acaba tendo um desempenho melhor, em média.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_UvDTlLjNnQurODtnCWjEJg.png" class="kg-image" alt="1_UvDTlLjNnQurODtnCWjEJg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2021/12/1_UvDTlLjNnQurODtnCWjEJg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_UvDTlLjNnQurODtnCWjEJg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="579" loading="lazy"><figcaption>Comparação de tempo entre a Quick Sort e a Merge Sort</figcaption></figure><p>Eu também fiz o gráfico abaixo para comparar a proporção entre o tempo que elas levam, já que é difícil vê-las em valores mais baixos. Como você pode ver, a porcentagem de tempo necessário para a quick sort está em ordem descendente.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2021/12/1_Zdm_8c-uU5941r7zJd4FPQ.png" class="kg-image" alt="1_Zdm_8c-uU5941r7zJd4FPQ" width="800" height="600" loading="lazy"><figcaption>Proporção de tempo entre a Quick Sort e a Merge Sort</figcaption></figure><p>A moral da história é que a notação Big O é apenas uma análise matemática para fornecer uma referência com relação aos recursos consumidos por um algoritmo. Na prática, os resultados podem ser diferentes. É, no entanto, uma boa prática tentar reduzir ao máximo a complexidade dos nossos algoritmos, até chegarmos a um caso em que sabemos o que estamos fazendo.</p><h3 id="no-fim-das-contas-"><strong>No fim das contas…</strong></h3><p>Eu gosto de programar, de aprender coisas novas e de compartilhá-las com a comunidade. Se há algo que interessa você em especial, mande-me uma mensagem. Eu geralmente escrevo sobre design para a web, arquitetura de software, matemática e ciência de dados. Você pode encontrar alguns arquivos ótimos que escrevi no passado se estiver interessado em qualquer um dos tópicos acima.</p><p>Espero que você aproveite ao máximo o aprendizado em Ciência da Computação!!!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
