<?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[ Estruturas de dados - 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[ Estruturas de dados - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 17 May 2026 08:32:04 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/estruturas-de-dados/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Uma introdução à complexidade temporal dos algoritmos ]]>
                </title>
                <description>
                    <![CDATA[ Na ciência da computação, análise de algoritmos é uma parte fundamental. É importante encontrar o algoritmo mais eficiente para a resolução de um problema. É possível que muitos algoritmos sejam capazes de resolver um problema, mas o desafio, aqui, é escolher o mais eficiente.  O ponto agora é: como ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/uma-introducao-a-complexidade-temporal-dos-algoritmos/</link>
                <guid isPermaLink="false">64808ade3aab28058e381429</guid>
                
                    <category>
                        <![CDATA[ Estruturas de dados ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Gustavo Goulart Baptista ]]>
                </dc:creator>
                <pubDate>Tue, 25 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/aron-visuals-322314-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/time-complexity-of-algorithms/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">An Introduction to the Time Complexity of Algorithms</a>
      </p><p>Na ciência da computação, análise de algoritmos é uma parte fundamental. É importante encontrar o algoritmo mais eficiente para a resolução de um problema. É possível que muitos algoritmos sejam capazes de resolver um problema, mas o desafio, aqui, é escolher o mais eficiente. </p><p>O ponto agora é: como vamos reconhecer o mais eficiente se temos um grupo com diversos algoritmos? Aqui, o conceito de complexidade de tempo e de espaço dos algoritmos ganha vida. A complexidade de tempo e a de espaço agem como uma medida escalonável para algoritmos. Comparamos os algoritmos com base na sua complexidade de espaço (total de memória) e de tempo (número de operações).</p><p>O valor total de memória do computador usada por um algoritmo quando executado é a complexidade de espaço daquele algoritmo. Para deixar este artigo um pouco menor, não discutiremos esse tipo de complexidade aqui. </p><h2 id="complexidade-de-tempo"><strong>Complexidade de tempo</strong></h2><p>Complexidade de tempo é o numero de operações que um algoritmo necessita para completar seu objetivo (considerando que cada operação leva o mesmo tanto de tempo). O algoritmo que executa a tarefa no menor número de operações possível é considerado o mais eficiente em termos de complexidade de tempo. Entretanto, as complexidades de tempo e de espaço também são afetadas por fatores como seu sistema operacional e hardware, mas não incluiremos isso nessa discussão.</p><p>Agora, para entender a complexidade de tempo, veremos um exemplo em que comparamos dois algoritmos diferentes que foram usados para resolver um problema específico. </p><p>O problema é a busca. Temos que buscar por um elemento em um array (nesse problema, assumiremos que o array está ordenado em ordem ascendente). Para resolver esse problema, temos dois algoritmos:</p><p>1. <a href="https://www.hackerearth.com/practice/algorithms/searching/linear-search/tutorial/">a busca linear (em inglês, </a><a href="https://www.hackerearth.com/practice/algorithms/searching/linear-search/tutorial/" rel="nofollow noopener"><em>linear search</em>)</a></p><p>2. <a href="https://www.hackerearth.com/practice/algorithms/searching/binary-search/tutorial/">a busca binária (em inglês, <em>b</em></a><em><a href="https://www.hackerearth.com/practice/algorithms/searching/binary-search/tutorial/" rel="nofollow noopener">inary search</a></em><a href="https://www.hackerearth.com/practice/algorithms/searching/binary-search/tutorial/" rel="nofollow noopener">)</a></p><p>Vamos assumir que o array contém dez elementos e temos que encontrar o número <code>10</code> no array.</p><pre><code class="language-javascript">const array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const buscar_elemento = 10;</code></pre><p>O algoritmo de busca linear compara cada elemento no array com a variável <strong>buscar_elemento</strong>. Quando o encontra dentro do array, retorna <strong><strong><strong><strong>true</strong></strong></strong></strong>.</p><p>Agora, vamos contar o número de operações necessárias. Aqui, a resposta é 10 (visto que compara cada elemento do array). Então, a busca linear usa dez operações para encontrar o elemento desejado (este é o número máximo de operações para esse array; no caso da busca linear, também é considerado o <a href="https://www.geeksforgeeks.org/analysis-of-algorithms-set-2-asymptotic-analysis/" rel="nofollow noopener">pior caso</a> para um algoritmo).</p><p>Em geral, a busca linear necessitará de um número <strong><strong><strong><strong>n</strong></strong></strong> </strong>de operações no seu pior caso (onde n é o tamanho do array).</p><p>Vamos examinar o algoritmo de <strong>busca binária</strong> para esse caso.</p><p>A busca binária pode ser facilmente entendida nesse exemplo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/binarySearch.png" class="kg-image" alt="binarySearch" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/binarySearch.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/binarySearch.png 816w" sizes="(min-width: 720px) 720px" width="816" height="283" loading="lazy"><figcaption>Fonte: <a href="https://www.learneroo.com/modules/71/nodes/399">Learneroo</a></figcaption></figure><p>Se estivermos tentando aplicar essa lógica no nosso problema, primeiro comparamos <strong>buscar_elemento</strong> com o elemento do meio do array, que é 5. Agora visto que 5 é menor que 10, começaremos a procurar por <strong>buscar_elemento </strong>no array de elementos maiores do que 5, e continuaremos assim até encontrar o desejado elemento – que, neste caso, é 10.</p><p>Agora, tente contar o número de operações de busca binária necessários para encontrar o elemento desejado. Levou, aproximadamente, quatro operações. Esse foi o pior caso para a busca binária. Isso mostra que existe uma relação <a href="https://www.khanacademy.org/math/algebra2/exponential-and-logarithmic-functions/introduction-to-logarithms/a/intro-to-logarithms" rel="nofollow noopener">logarítmica</a> entre o número de operações necessárias e o tamanho total do array.</p><p>número de operações = log(10) = 4 na base 2 (aproximadamente)</p><p>Podemos generalizar esse resultado para a busca binária:</p><blockquote>Para um array de tamanho <strong><strong><strong><strong>n</strong></strong></strong></strong>, o número de operações executadas pela busca binária é <strong><strong><strong><strong>log(n)</strong></strong></strong></strong></blockquote><h2 id="nota-o-big-o"><strong>Notação <strong>Big O</strong></strong></h2><p>Nas declarações acima, vimos que, para um array de tamanho <strong><strong><strong><strong>n</strong></strong></strong></strong>, a busca linear executará <strong><strong><strong><strong>n</strong></strong></strong></strong> operações para completar a busca. Em contrapartida, a busca binária executou <strong><strong><strong><strong>log(n)</strong></strong></strong></strong> operações. Para isso, consideramos os respectivos piores casos. Podemos representar isso através de um gráfico (onde o <strong>eixo x</strong> é o número de elementos do array e o<strong><strong><strong><strong> </strong></strong></strong>eixo <strong><strong><strong>y</strong></strong></strong></strong> é o número de operações).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/linearSearch-vs-binary-search-diagram_0.jpg" class="kg-image" alt="linearSearch-vs-binary-search-diagram_0" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/linearSearch-vs-binary-search-diagram_0.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/linearSearch-vs-binary-search-diagram_0.jpg 758w" sizes="(min-width: 720px) 720px" width="758" height="461" loading="lazy"><figcaption>Fonte: <a href="https://www.techtud.com/computer-science-and-information-technology/algorithms/searching/binary-search">Techtud</a></figcaption></figure><p>É bem claro pela figura que a taxa na qual a complexidade aumenta para a busca linear é muito mais alta que para a busca binária.</p><p>Quando analisamos um algoritmo, usamos uma notação para representar sua complexidade de tempo – essa notação se chama Big O.</p><p>Por exemplo: a complexidade de tempo para a busca linear pode ser representada como <strong><strong><strong><strong>O(n)</strong></strong></strong></strong>.<strong> </strong>Para a busca binária, temos <strong><strong><strong><strong>O(log n)</strong></strong></strong></strong>. Consideraremos que <strong><strong><strong><strong>n</strong></strong></strong></strong> e <strong><strong><strong><strong>log(n)</strong></strong></strong></strong> são o número de operações para cada tipo de busca.</p><p>A complexidade de tempo (ou notação Big O) para alguns dos algoritmos populares está listada abaixo:</p><ol><li>Busca binária: O(log n)</li><li>Busca linear: O(n)</li><li>Ordenamento rápido (em inglês, <em>Quick Sort</em>): O(n * log n)</li><li>Ordenação por seleção (em inglês, <em>Selection Sort</em>): O(n * n)</li><li>Algoritmo do caixeiro viajante (em inglês, <em>Travelling salesperson</em>): O(n!)</li></ol><h2 id="conclus-o"><strong><strong>Conclus</strong>ão</strong></h2><p>Parabéns se você chegou até este ponto do artigo. Agora, você pode estar se perguntando: porque a complexidade de tempo é tão importante de entender?</p><p>Sabemos que, para um número pequeno de elementos (digamos que 10), a diferença entre o número de operações realizadas pela busca binária e pela busca linear não é tão grande, No mundo real, porém, na maioria das vezes, lidamos com problemas que tem um grande volume de dados. </p><p>Por exemplo, se tivermos 4 bilhões de elementos usando a busca linear, então, no pior dos casos faremos 4 bilhões de operações para completar a tarefa. A busca binária completará a tarefa em apenas 32 operações. É uma diferença enorme! Agora, vamos assumir que, se uma operação leva 1 ms para completar, a busca binária levará apenas 32 ms enquanto a busca linear levará 4 bilhões de milissegundos (aproximadamente, 46 dias). É uma diferença realmente significativa.</p><p>Esse é o motivo pelo qual o estudo da complexidade de tempo se torna importante quando falamos de um grande volume de dados.</p><h2 id="recursos-em-ingl-s-"><strong><strong>Re</strong>cursos (em inglês)</strong></h2><p><a href="https://www.amazon.com.br/Grokking-Algorithms-illustrated-programmers-curious/dp/1617292230/">Grokking Algorithms – escrito por Aditya Y Bhargava</a></p><p><a href="https://youtu.be/D6xkbGLQesk">Introduction to Big O notation and Time Complexity – vídeo do CS Dojo</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
