<?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: Mateus Costa</title>
    <description>The latest articles on DEV Community by Mateus Costa (@costamateus7).</description>
    <link>https://dev.to/costamateus7</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%2F956008%2F2cb196f2-2ded-4c35-bdb6-d5b252c29a1d.jpeg</url>
      <title>DEV Community: Mateus Costa</title>
      <link>https://dev.to/costamateus7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/costamateus7"/>
    <language>en</language>
    <item>
      <title>Um resumo sobre: grafos.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Wed, 15 Mar 2023 20:52:27 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-grafos-jic</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-grafos-jic</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Introdução:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Embora os grafos tenham nós conectados por arestas, eles são diferentes das árvores, uma vez que os grafos não possuem uma estrutura hierárquica como a árvore que possui raiz, pais e filhos. Além disso, os grafos podem ter ciclos e possuem arestas direcionadas e não direcionadas, enquanto a árvore não tem ciclos e suas arestas não são direcionadas. &lt;br&gt;
A primeira figura é uma árvore, enquanto a segunda é um grafo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NiQXYr7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ab43sq8kjqbety8ezuh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NiQXYr7F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ab43sq8kjqbety8ezuh3.png" alt="Image description" width="528" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Conceitos Básicos:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora irei abordar alguns conceitos básicos sobre os grafos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adjacência: Quando um nó é conectado ao outro por uma única aresta. Exemplo: o 5 é adjacente do: 6, 9, 4.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--coKaKcZd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/66h3piy0bvggflzqr1ib.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--coKaKcZd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/66h3piy0bvggflzqr1ib.png" alt="Image description" width="554" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caminhos: sequência de arestas;&lt;/li&gt;
&lt;li&gt;Grafos conectados e não conectados:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Totu303--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oo7mkj3p2ff9p94y5l5c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Totu303--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oo7mkj3p2ff9p94y5l5c.png" alt="Image description" width="258" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grafos orientados: quando há uma orientação quanto a direção. Exemplo: o 7 vai até o 11, mas o 11 não vai até o 7.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CEa6WHnR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fs7b0vvvtfxtmt8jkhl1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CEa6WHnR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fs7b0vvvtfxtmt8jkhl1.png" alt="Image description" width="304" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grafos ponderados: Cada aresta tem um peso ou valor associados a ela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g3-ecvA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skj5kallsmlhhqc0qtv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g3-ecvA_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/skj5kallsmlhhqc0qtv8.png" alt="Image description" width="245" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logo abaixo está um exemplo de um grafo orientado e ponderado:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ajGjijL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4471pqltr6140w2u8av1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ajGjijL---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4471pqltr6140w2u8av1.png" alt="Image description" width="352" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nós e arestas: Um nó pode representar um objeto da vida real (uma cidade, por exemplo) e uma aresta é o caminho até este nó.&lt;/li&gt;
&lt;li&gt;Representação: Matriz de adjacência e lista de adjacência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EXyfohWu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eckrwg7zrinspzujq6d6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EXyfohWu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eckrwg7zrinspzujq6d6.png" alt="Image description" width="418" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Algoritmos de Busca:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca em profundidade:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A busca em profundidade (DFS, do inglês Depth-First Search) é um algoritmo de busca utilizado em grafos que percorre o grafo explorando o máximo possível em profundidade antes de retroceder para explorar outros ramos do grafo.&lt;br&gt;
O algoritmo funciona da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Começa-se a partir de um vértice inicial, marcando-o como visitado e empilhando-o em uma pilha.&lt;/li&gt;
&lt;li&gt;O algoritmo escolhe um vértice da pilha e verifica se ele possui vértices adjacentes ainda não visitados. Se existirem, um deles é escolhido e marcado como visitado, empilhado na pilha e o passo 2 é repetido a partir deste vértice.&lt;/li&gt;
&lt;li&gt;Se todos os vértices adjacentes já tiverem sido visitados, o algoritmo desempilha o vértice atual e continua no vértice anterior.&lt;/li&gt;
&lt;li&gt;O algoritmo continua este processo até que a pilha esteja vazia.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A busca em profundidade visita todos os vértices e arestas do grafo que são alcançáveis a partir do vértice inicial. É possível modificar o algoritmo para encontrar caminhos específicos ou para percorrer o grafo de outras formas, por exemplo, visitando os vértices em ordem lexicográfica.&lt;br&gt;
O tempo de execução do algoritmo de busca em profundidade depende do tamanho do grafo e da estrutura de dados utilizada para armazená-lo. Em geral, o tempo de execução é proporcional ao número de vértices e arestas do grafo, ou seja, O(V + E).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca em Largura:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A busca em largura (BFS, do inglês Breadth-First Search) é outro algoritmo de busca utilizado em grafos que percorre o grafo em largura, ou seja, visita todos os vértices em uma mesma profundidade antes de avançar para a próxima profundidade.&lt;br&gt;
O algoritmo funciona da seguinte forma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Começa-se a partir de um vértice inicial, marcando-o como visitado e inseri-lo em uma fila.&lt;/li&gt;
&lt;li&gt;O algoritmo retira um vértice da fila e verifica se ele possui vértices adjacentes ainda não visitados. Se existirem, um deles é escolhido e marcado como visitado, inserido na fila e o passo 2 é repetido a partir deste vértice.&lt;/li&gt;
&lt;li&gt;O algoritmo continua a retirar vértices da fila e adicionar seus vizinhos na fila até que a fila esteja vazia.
A busca em largura visita todos os vértices e arestas do grafo que são alcançáveis a partir do vértice inicial em ordem crescente de profundidade. O algoritmo também pode ser utilizado para encontrar caminhos mais curtos entre dois vértices.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Busca Gulosa:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A busca gulosa (também conhecida como busca heurística) é um algoritmo de busca em grafos que utiliza uma heurística para escolher o próximo nó a ser explorado. A heurística é uma função de avaliação que estima o quão promissor é um determinado nó em relação ao objetivo final da busca.&lt;br&gt;
Em cada passo, a busca gulosa escolhe o nó com a melhor estimativa heurística e explora seus vizinhos. O objetivo é chegar ao nó objetivo com a menor quantidade de passos possível.&lt;br&gt;
No entanto, a busca gulosa pode levar a soluções subótimas, já que a escolha do próximo nó a ser explorado é baseada apenas na heurística e não leva em consideração o caminho percorrido até o momento.&lt;br&gt;
Por exemplo, imagine que um caminho longo pareça promissor com base na heurística, mas um caminho mais curto seria mais eficiente. A busca gulosa pode escolher o caminho longo e, portanto, não encontrar a solução mais otimizada.&lt;br&gt;
Apesar dessa limitação, a busca gulosa pode ser uma boa opção para grafos muito grandes ou para problemas onde a solução ótima não é crucial. É importante, no entanto, escolher uma boa heurística para maximizar a eficiência do algoritmo.&lt;/p&gt;

&lt;p&gt;O tempo de execução do algoritmo de busca em largura também depende do tamanho do grafo e da estrutura de dados utilizada para armazená-lo. Em geral, o tempo de execução é proporcional ao número de vértices e arestas do grafo, ou seja, O(V + E). No entanto, a busca em largura geralmente é mais lenta que a busca em profundidade em grafos densos, já que requer a criação de uma fila para armazenar todos os vértices a serem visitados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Busca A *:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A busca A* (A-star) é um algoritmo de busca heurística que também é usado para encontrar o caminho mais curto entre um nó de partida e um nó de destino em um grafo ponderado. É semelhante à busca gulosa em que utiliza uma heurística para estimar a distância do nó atual até o nó de destino, mas também leva em consideração o custo do caminho percorrido até o momento.&lt;br&gt;
O algoritmo A* usa uma função de avaliação que combina a heurística e o custo do caminho até o nó atual. A função de avaliação é definida como f(n) = g(n) + h(n), onde g(n) é o custo do caminho do nó inicial até o nó atual e h(n) é a estimativa heurística da distância do nó atual até o nó de destino. O objetivo da busca é encontrar o caminho com o menor valor de f(n).&lt;br&gt;
A busca A* é considerada uma das melhores técnicas para encontrar o caminho mais curto em um grafo ponderado porque é completa (encontra uma solução se ela existe) e ótima (encontra a solução com o menor custo possível). No entanto, ela pode ser mais lenta do que a busca gulosa, dependendo da heurística escolhida e da complexidade do grafo.&lt;/p&gt;

&lt;p&gt;Nestas duas imagens veremos a diferença entre a busca gulosa (imagem 1) e a busca A*:&lt;/p&gt;

&lt;p&gt;Estas imagens representam um caminho entre uma cidade e outra, para montar um algoritmo eficiente para traçar um caminho entre as duas cidades, nós podemos utilizar a busca gulosa e a busca A*. Na busca gulosa foi levada em consideração somente a heurística, em que as cidades que seriam percorridas seriam a com menor distância entre o destino. Já na busca A*, além desse parâmetro, foi utilizado também o ‘peso’ do vetor, que seria a distância entre as cidades adjacentes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XweX8Ppb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbz2s7lubsqz4i0dpfy9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XweX8Ppb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbz2s7lubsqz4i0dpfy9.png" alt="Image description" width="435" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YFhI1U4o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r0fchoq6y0768tyczano.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YFhI1U4o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r0fchoq6y0768tyczano.png" alt="Image description" width="423" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algoritmo de Dijkstra:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O algoritmo de Dijkstra é um método utilizado para encontrar o caminho mais curto em um grafo com arestas não negativas, partindo de um vértice de origem. Ele seleciona os vértices com as menores distâncias da origem e atualiza as distâncias dos vértices adjacentes caso seja possível encontrar um caminho mais curto. Esse processo continua até que todas as distâncias tenham sido determinadas. No final, o algoritmo retorna a distância mais curta de cada vértice para a origem e o caminho mais curto correspondente.&lt;/p&gt;

&lt;p&gt;Veja na imagem que ele foi de A até F e escolheu o menor caminho vendo o todo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cITtIlsC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/li2ohejc7kpa939qpkvk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cITtIlsC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/li2ohejc7kpa939qpkvk.png" alt="Image description" width="467" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
    </item>
    <item>
      <title>Um resumo sobre: árvore binária de busca.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Sun, 12 Mar 2023 23:46:39 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-arvores-binarias-de-busca-pae</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-arvores-binarias-de-busca-pae</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Introdução:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uma árvore binária combina as vantagens de duas estruturas: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um vetor ordenado e uma lista encadeada. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vantagens:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Busca rápida como um vetor ordenado;&lt;/li&gt;
&lt;li&gt;Inserção e exclusão é rápida como uma lista encadeada;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Olhe a representação de duas árvores, a primeira é a árvore do sistema operacional Linux e a segunda é uma árvore do HTML:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--B_COU9VB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/013yirfhjuq5b70k5tdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--B_COU9VB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/013yirfhjuq5b70k5tdk.png" alt="Image description" width="880" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos falar agora mais especificamente sobre a árvore binária:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ela consiste em nós conectados por arestas;&lt;/li&gt;
&lt;li&gt;Esse tipo de árvores tem no máximo dois filhos (um filho à esquerda e outra à direita);&lt;/li&gt;
&lt;li&gt;Mas também pode ter um ou nenhum filho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repare na imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3c44Z_FG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lo2ql45kh4x4vxkc5mfx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3c44Z_FG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lo2ql45kh4x4vxkc5mfx.png" alt="Image description" width="444" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existem algumas terminologias que também precisamos saber:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caminho: que liga um nó até o outro. Lembre-se que a aresta é a conexão direta entre dois nós adjacentes e o caminho é uma sequência de arestas que conectam dois nós diferentes em uma árvore;&lt;/li&gt;
&lt;li&gt;Raiz: é o nó na parte superior, no caso da figura acima, a raiz é o número 2. Lembrando que há apenas uma raiz em uma árvore e deve haver somente um caminho da raiz até qualquer outro nó. Olhe esse exemplo de um grafo, que não é uma árvore:&lt;/li&gt;
&lt;li&gt;Pai: qualquer nó, exceto a raiz, tem uma aresta acima dele que sobe para outro nó. Esse nó de cima é chamado de pai do nó;&lt;/li&gt;
&lt;li&gt;Filho: o nó pode ter um ou dois nós ligados diretamente abaixo dele, esses nós que estão abaixo, são os filhos do nó de cima;&lt;/li&gt;
&lt;li&gt;Folha: é um nó que não tem filhos;&lt;/li&gt;
&lt;li&gt;Subárvore: qualquer nó pode ser considerado a raiz de uma subárvore, que consiste em seus filhos(na imagem acima podemos considerar uma subárvore em que a raiz é o 7, ou outra subárvore que a raiz é o nó número 5);&lt;/li&gt;
&lt;li&gt;Visitando: um nó é visitado quando o controle do programa chega ao nó, em geral para a finalidade de executar alguma operação no nó;&lt;/li&gt;
&lt;li&gt;Percorrendo: visitar todos os nós em alguma ordem específica;&lt;/li&gt;
&lt;li&gt;Níveis: refere-se quantas gerações o nó está da raiz;&lt;/li&gt;
&lt;li&gt;Chaves: valor utilizado para buscar um item. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6bO62AF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65l3k1hrbiz44iu2due7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6bO62AF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65l3k1hrbiz44iu2due7.png" alt="Image description" width="453" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro da árvore binária, existe um tipo específico, que é a árvore binária de busca:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O filho à esquerda do pai, tem que ter uma chave menor que o pai e o filho à direita de um nó tem que ter uma chave maior ou igual ao seu pai;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wsySfZKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13adc8yikwdskiqnuqub.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wsySfZKU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13adc8yikwdskiqnuqub.png" alt="Image description" width="531" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos analisar a partir de agora como funciona a inserção, a pesquisa e a exclusão neste tipo de estrutura.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Inserção:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O local para inserir deve ser encontrado;&lt;/li&gt;
&lt;li&gt;Segue-se o caminho da raiz até o devido nó, que será o pai do novo nó; &lt;/li&gt;
&lt;li&gt;Quando o pai for localizado, o novo nó será conectado como seu filho à direita ou à esquerda(dependendo da chave do novo nó ser maior ou menor que o pai);&lt;/li&gt;
&lt;li&gt;Para um melhor visualização, crie sua árvore acessando &lt;a href="https://visualgo.net/en/bst"&gt;este link&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Em relação ao Big-O, para a inserção é O(log n) para caso médio e O(n) para o pior caso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Veja na imagem um algoritmo de inserção em uma árvore binária feito em python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EB5g9bS8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4badw9tcrw26mykfqrpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EB5g9bS8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4badw9tcrw26mykfqrpa.png" alt="Image description" width="335" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Pesquisa:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Para realizarmos a pesquisa em uma árvore binária, nós iremos procurar nas sub árvores direita e esquerda. É possível ter uma melhor visualização acessando &lt;a href="https://visualgo.net/en/bst"&gt;este link&lt;/a&gt;. Já em termos do Big-O, teremos O(log n) em casos médios e O(n) no pior caso. &lt;/p&gt;

&lt;p&gt;Aqui está um algoritmo de pesquisa feito em python para a pesquisa de um nó em uma árvore binária:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dlZm85IY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkw38zhj11qnjuqb8oe5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dlZm85IY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkw38zhj11qnjuqb8oe5.png" alt="Image description" width="201" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Existem três principais ordens para visitar uma árvore binária:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pré-ordem (Pre-order): Começando pela raiz da árvore, visite cada nó primeiro antes de visitar seus filhos. Em outras palavras, a visita começa pelo nó raiz, depois visita o filho esquerdo e, em seguida, visita o filho direito. A ordem de visita é: raiz, filho esquerdo, filho direito.&lt;/li&gt;
&lt;li&gt;Em-ordem (In-order): Visite o filho esquerdo, depois a raiz e, em seguida, o filho direito. A ordem de visita é: filho esquerdo, raiz, filho direito. Essa ordem é especialmente útil quando a árvore binária representa uma expressão matemática, onde a ordem de precedência dos operadores é levada em consideração. &lt;strong&gt;Retorna os números em ordem crescente&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pós-ordem (Post-order): Visite cada filho antes de visitar a raiz. Em outras palavras, a visita começa pelo filho esquerdo, depois visita o filho direito e, em seguida, visita a raiz. A ordem de visita é: filho esquerdo, filho direito, raiz.
Essas ordens de visita podem ser usadas para resolver problemas específicos, dependendo das necessidades da aplicação.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Algoritmo em python representando a pré-ordem, ordem e pós-ordem, respectivamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zKKnXvjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38l1o8a1mjmxvtjsntyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zKKnXvjb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38l1o8a1mjmxvtjsntyu.png" alt="Image description" width="201" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lGzQJ2iP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5cwyfjvd10a6pveivvs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lGzQJ2iP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m5cwyfjvd10a6pveivvs.png" alt="Image description" width="201" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--42tBBbL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o9j5cyyslvk039xz44zq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--42tBBbL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o9j5cyyslvk039xz44zq.png" alt="Image description" width="201" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Exclusão:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Para excluir um dado em uma árvore binária de busca, existem alguns cenários: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O nó a ser apagado é uma folha (maneira mais simples);&lt;/li&gt;
&lt;li&gt;O nó a ser apagado tem um filho; &lt;/li&gt;
&lt;li&gt;O nó a ser apagado tem dois filhos (maneira mais difícil)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dessa maneira, para o processo de exclusão, precisamos primeiro &lt;strong&gt;&lt;u&gt;pesquisar&lt;/u&gt;&lt;/strong&gt; o elemento que queremos apagar e depois identificar em qual dos três casos ele se encaixa. Aqui um algoritmos que representa a parte da pesquisa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qhby-Tyy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnn16z44kwr00xp5d4wa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qhby-Tyy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jnn16z44kwr00xp5d4wa.png" alt="Image description" width="265" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A segunda parte, caso o nó a ser apagado fosse uma folha:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nKUd8dBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/td6wsibvy9w0zsykd2nw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nKUd8dBY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/td6wsibvy9w0zsykd2nw.png" alt="Image description" width="351" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A segunda parte caso o nó a ser apagado tiver somente um filho:&lt;br&gt;
Neste caso, nós iremos cortá-lo e conectar o filho dele com o pai. Além disso, iremos verificar se ele não possui filho à direita ou à esquerda. &lt;br&gt;
Para uma melhor visualização acesse &lt;a href="https://visualgo.net/en/bst"&gt;este link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s7ZkwIp_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqclm0try3isrmbo6tv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s7ZkwIp_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cqclm0try3isrmbo6tv3.png" alt="Image description" width="348" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A segunda parte caso o nó a ser apagado possuir dois filhos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele deve ser substituído pelo seu sucessor em ordem (direita esquerda). Para melhor visualização, lembre de utilizar o link anterior.&lt;/li&gt;
&lt;li&gt;Neste exemplo, se excluirmos o número 66, o que irá entrar no lugar dele será o sucessor em ordem, que é o 73. O próximo, maior que ele.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tWeIGCQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cyj704q2t7i27dmwezrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tWeIGCQp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cyj704q2t7i27dmwezrd.png" alt="Image description" width="600" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Primeiro passo que iremos fazer neste processo é encontrar o sucessor, com isso iremos fazer uma função para encontrar o sucessor de um número. O função será esta: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eBcs-SiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llscqd61xdhnmho5g0wg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eBcs-SiL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/llscqd61xdhnmho5g0wg.png" alt="Image description" width="294" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pqhLBQyt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9vy3yqdb4yhiuber6os.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pqhLBQyt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n9vy3yqdb4yhiuber6os.png" alt="Image description" width="738" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E para realizar o processo de exclusão é só localizar o sucessor e realizar as devidas trocas, dessa maneira: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eoCbSzk1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ogeyegv06fxzh7i1whbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eoCbSzk1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ogeyegv06fxzh7i1whbt.png" alt="Image description" width="294" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código completo para exclusão, inserção e pesquisa, está &lt;a href="https://colab.research.google.com/drive/1vIqgazfAZmjlh77yY1Djub6cta75ijNx?usp=sharing"&gt;neste link&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Um resumo sobre: algoritmos de ordenação.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Tue, 07 Mar 2023 01:04:15 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-algoritmos-de-ordenacao-1kc1</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-algoritmos-de-ordenacao-1kc1</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Introdução.&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Após a construção de uma base de dados, pode ser necessário a ordenação dessas informações. Essa ordenação pode ser nomes em ordem alfabética, endereço pelo cep, vendas por preço, cidades em ordem crescente de população e etc. Ter esses dados ordenados faz com que tenhamos performance na pesquisa de dados, por exemplo, escolhendo a pesquisa binária O(log n), no lugar da linear O(n). Você pode saber mais sobre pesquisa linear e binária com &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-ordenados-e-pesquisa-linear-e-binaria-49ch"&gt;este link&lt;/a&gt; e notação Big-O, para entender sobre a comparação da complexidade de algoritmos pela entrada que ele recebe, &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;neste link&lt;/a&gt;. &lt;br&gt;
Sempre bom termos em mente, quando pensamos em dados, é pensar na &lt;strong&gt;inserção, exclusão e pesquisa dos dados&lt;/strong&gt;. Se por um lado a pesquisa de dados em vetores ordenados é mais performática que em vetores não ordenados, pela possibilidade que realizar a pesquisa binária, por outro lado, em vetores ordenados, a performance para &lt;strong&gt;inserção&lt;/strong&gt; de dados pode não ser tão boa quanto em vetores não ordenados, uma vez que para inserir em um vetor ordenado, iremos precisar pesquisar onde o dados irá ser inserido e deslocar os demais dados para que o elemento em questão ocupe a sua devida posição. &lt;br&gt;
Aí entra a estrutura de ordenação de dados, para inserirmos com a agilidade dos vetores não ordenados e pesquisarmos com a rapidez dos vetores ordenados. Para entendermos como funcionam esses algoritmos de ordenação, iremos ver: bubble sort (bolha), selection sort (seleção), insertion sort(inserção), shell sort, merge sort e quick sort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Bubble Sort (bolha).&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
O mais lento e simples de todos os algoritmos de ordenação. &lt;br&gt;
Ele funciona da seguinte maneira: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compara dois números, se o da esquerda for maior, os elementos devem ser trocados, sendo que o menor se desloca uma posição à esquerda. &lt;/li&gt;
&lt;li&gt;À medida que o algoritmo avança, os itens maiores “surgem como uma bolha” na extremidade superior do vetor. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com &lt;a href="https://visualgo.net/en/sorting"&gt;este link&lt;/a&gt;  podemos ter uma excelente noção de como funciona esta estrutura de ordenação com o passo a passo (é muito importante acessarem o último link para ver o algoritmo em funcionamento). Em uma visão geral, caso tenhamos um vetor com 10 elementos, o algoritmo fará 9 comparações na primeira rodada, 8 na segunda, 7 na terceira e assim por diante. Neste caso, ele fará 45 comparações. O Big-O dele será quadrático O(n²), sendo assim, o algoritmo irá comparar, &lt;strong&gt;aproximadamente&lt;/strong&gt;, (n² / 2) comparações. Nós dividimos por 2, pois é uma média. No caso de 10 elementos, dará aproximadamente 50 passos. Nesse caso, foram exatamente 45 passos, pois o valor é aproximado. Em 99% das vezes temos mais comparação do que trocas de fato dos valores, uma vez que os valores só serão trocados quando houver necessidade.&lt;/p&gt;

&lt;p&gt;Aqui está um algoritmo feito em python utilizando a ideia de bubble sort:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LeMvlcyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qe9gvbrk2wbcw3wc0v6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LeMvlcyF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qe9gvbrk2wbcw3wc0v6j.png" alt="Image description" width="880" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Selection Sort (seleção):&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Melhora a ordenação do método da bolha, uma vez que a selection sort reduz o número de trocas necessárias, reduzindo de N² para N. Entretanto, o número de comparações permanece N².&lt;br&gt;
Esta estrutura funciona da seguinte maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Percorre todos o elementos e seleciona o menor; &lt;/li&gt;
&lt;li&gt;O menor elemento é trocado com o elemento da extremidade esquerda do vetor(posições iniciais);&lt;/li&gt;
&lt;li&gt;Os elementos se organizam à esquerda, diferente da bolha que organiza seus elementos à direita. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://visualgo.net/en/sorting"&gt;Neste link&lt;/a&gt;, você selecione o selection sort e assista calmamente como ocorre o processo. Repare que o algoritmo faz a varredura e marca o menor valor com a cor vermelha. Ao final do processo, o menor se deslocará para o início. &lt;br&gt;
Em uma visão geral, caso tenhamos um vetor com 10 elementos, funcionará da mesma maneira que o bubble sort na &lt;strong&gt;&lt;u&gt;COMPARAÇÃO&lt;/u&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O algoritmo fará 9 comparações na primeira rodada, 8 na segunda, 7 na terceira e assim por diante. Neste caso, ele fará 45 comparações. O Big-O dele será quadrático O(n²), sendo assim, o algoritmo irá comparar, aproximadamente, (n² / 2) comparações. Nós dividimos por 2, pois é uma média. No caso de 10 elementos dará aproximadamente, 50 passos. Nesse caso, foram exatamente 45 passos, pois o valor é aproximado. 
Aqui está a grande diferença entre o bubble sort e o selection sort: enquanto o bubble sort precisará de 3 passos vezes o número de trocas sendo que no pior dos casos no &lt;strong&gt;&lt;u&gt;selection&lt;/u&gt;&lt;/strong&gt;, nós iremos realizar 10 passos. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um algoritmo feito em python utilizando a ideia de Selection Sort:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j8pHvsYD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0zv1mqezrr94bsmp7tu4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j8pHvsYD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0zv1mqezrr94bsmp7tu4.png" alt="Image description" width="880" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Insertion Sort:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Essa é a ordenação por inserção, sendo duas vezes mais rápida do que a bubble sort e um pouco mais ágil que a selection sort. Em questão de funcionamento, ela age da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Há um marcador no meio do vetor;&lt;/li&gt;
&lt;li&gt;Os elementos à esquerda estão parcialmente ordenados (ordenados entre eles, porém não estão na posição final);&lt;/li&gt;
&lt;li&gt;Os elementos à direita do marcador não estão ordenados;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repare que o vermelho é a posição marcada do vetor. Ele irá procurar a posição que ele irá ocupar à direita:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yBxKWT2F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kez0jwd7ibmp21ydxp3m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yBxKWT2F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kez0jwd7ibmp21ydxp3m.png" alt="Image description" width="731" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que o elemento vermelho foi inserido e agora o elemento marcado é o verde:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ttdRrOqB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r63pgrm1hhjk6oioxuz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ttdRrOqB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7r63pgrm1hhjk6oioxuz.png" alt="Image description" width="731" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com &lt;a href="https://visualgo.net/en/sorting"&gt;este link&lt;/a&gt; você clica em insertion sort e veja como funciona este algoritmo de ordenação. &lt;br&gt;
Para esta estrutura, faremos as seguintes análises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para dados que já estão parcialmente ordenados, esta estrutura de ordenação pode ser mais eficiente que as outras apresentadas até aqui;&lt;/li&gt;
&lt;li&gt;Se os dados estiverem em ordem inversa, esse método é mais lento que o método da bolha; &lt;/li&gt;
&lt;li&gt;Em termos de comparação dos dados, este tem uma média de metade dos passos das ordenações bubble e selection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aqui está um algoritmo feito em python utilizando a ideia de Insertion Sort:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jwTtB8gQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmvq53a98oeik33cpve9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jwTtB8gQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zmvq53a98oeik33cpve9.png" alt="Image description" width="530" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Shell Sort (Shell -&amp;gt; pesquisador que inventou esse de algoritmo)&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Este algoritmo melhora a ordenação do insertion sort, assim, podemos dizer que é uma versão melhorada do insertion.&lt;/p&gt;

&lt;p&gt;Ele funciona da seguinte maneira: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O vetor original é quebrado em subvetores;&lt;/li&gt;
&lt;li&gt;Cada subvetor é ordenado comprando e trocando os valores;&lt;/li&gt;
&lt;li&gt;No final da rodada esse subvetor é quebrado em mais um subvetor.
Observe nesta imagem: &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HbV1oZeE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6uxe2w5dtwm10g5se66h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HbV1oZeE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6uxe2w5dtwm10g5se66h.png" alt="Image description" width="294" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O vetor é dividido no meio. Pegou a posição 0, pulou duas posições e pegou a posição 3. Ele compara os valores e joga o menor para a esquerda e o maior para a direita. Em seguida, pula uma casa, o que estava no 0 vai para o 1 e o que estava no 3 vai para o 4, em seguida faz novamente a comparação. Esse procedimento segue até terminar. Após isso, ele é quebrado novamente no meio. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html"&gt;Neste link&lt;/a&gt; você terá uma melhor noção de como funciona este algoritmo de ordenação.&lt;/p&gt;

&lt;p&gt;A complexidade deste algoritmo dependerá dos intervalos escolhidos, sendo que o pior caso será O(n²) e o melhor caso O(n * log n). Lembrando que o melhor caso do selection sort é O(n²) e do bubble sort é O(n²) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wiYUlFI2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ni12orc99eh98sdofgj4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wiYUlFI2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ni12orc99eh98sdofgj4.png" alt="Image description" width="491" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Merge Sort(juntar):&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Um dos algoritmos de ordenação mais populares, o merge sort funciona da seguinte maneira:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele segue a premissa de dividir para conquistar, com isso, ele divide a lista diversas vezes até ter um único elemento;&lt;/li&gt;
&lt;li&gt;Após dividir ao máximo, ele vai juntando(merge) e ordenando.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Veja o fluxograma para uma melhor visualização:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u2yzecYW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ssykiivo0d32c7bofv3f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u2yzecYW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ssykiivo0d32c7bofv3f.png" alt="Image description" width="413" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em relação a notação Big-O, no pior e no melhor caso são O(n* log n). Em comparação com o bubble sort e o selection sort, o merge sort é melhor, uma vezes que os outros são O(n²) e o shellsort, no pior caso é O(n²) e no melhor é O(n*log n).&lt;/p&gt;

&lt;p&gt;Esse algoritmo feito em python exemplifica o modelo merge sort:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WOoYhMZA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qxze7echdocpo7bwcqhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WOoYhMZA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qxze7echdocpo7bwcqhe.png" alt="Image description" width="546" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Quick Sort:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
É um algoritmo rápido e eficiente criado em 1960, sendo que seu funcionamento consiste da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O vetor é dividido em sub vetores e é chamado recursivamente para ordenar os elementos;&lt;/li&gt;
&lt;li&gt;Utiliza a estratégia da divisão e conquista.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esse algoritmo possui um conceito de elemento pivô, sendo que a cada rodada ele compara esse elemento com os demais da lista. O elemento que inicia como pivô é o da posição 0. Na comparação, os elementos menores são dispostos do lado esquerdo e os maiores do lado direito, após a comparação o pivô toma a posição do meio, sendo que os maiores ficarão à direita e os menores à esquerda. &lt;/p&gt;

&lt;p&gt;Repare que neste vetor, o pivô é o número 27 e os elementos verdes são menores e os roxos estão à direita:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vcFVrFrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/au7dtkxuphi2tmsj0402.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vcFVrFrs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/au7dtkxuphi2tmsj0402.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora o 27 toma a posição do meio, trocando com o 16 que está na última posição entre os menores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--muw1p6zI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wc8t74fkk8f12h20yeb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--muw1p6zI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wc8t74fkk8f12h20yeb4.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora o 27 é o final da lista e o 16 será o pivô, repare que agora todos os números maiores que o da posição 6 são maiores que o 16 e lembre-se que ele irá medir até o 27, porque os acima são obrigatoriamente maiores:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WeWTFfQl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0ip19vh90e8k00cvusv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WeWTFfQl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p0ip19vh90e8k00cvusv.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora o 16 irá trocar com o 6 e o 16 passará a ser o final e o 6 passará a ser o pivô:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Zfkmohjt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lyrx2qi4dx06cxiva8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Zfkmohjt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7lyrx2qi4dx06cxiva8c.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de realizar as comparações, o 6 irá trocar de lugar com o 3 e do 3 até o 15 já está ordenado e o 25 passará a ser o pivô:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JvWIbOYG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/netj2l7wkfpj27ecg4qu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JvWIbOYG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/netj2l7wkfpj27ecg4qu.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois do reajuste do 25, terminamos a parte da esquerda. Agora iniciamos a parte da direita com o pivô como 32 e assim ficará depois das comparações:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jQMUg-Z0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d3uvintozbqialydtuu1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jQMUg-Z0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d3uvintozbqialydtuu1.png" alt="Image description" width="427" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Assim irá até o final. Para uma melhor visualização, &lt;a href="https://visualgo.net/en/sorting"&gt;acesse este link&lt;/a&gt; e clique no botão quick sort.&lt;/p&gt;

&lt;p&gt;O pior caso dessa ordenação será O(n²) e o melhor caso O(n * log n).&lt;/p&gt;

&lt;p&gt;Aqui está um algoritmo de ordenação quick sort feito em python:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SfaG1OQA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70fwuvhavdla65gj5b2c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SfaG1OQA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/70fwuvhavdla65gj5b2c.png" alt="Image description" width="346" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>algorithms</category>
    </item>
    <item>
      <title>Um resumo sobre: recursão.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Tue, 28 Feb 2023 19:55:55 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-recursao-2pdn</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-recursao-2pdn</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;Introdução:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Neste resumo irei dar uma breve explicação sobre recursão e mostrar a diferença entre ela e o laço de repetição. Sendo assim, aqui irei abordar os seguintes tópicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceito geral sobre recursão;&lt;/li&gt;
&lt;li&gt;Diferenças entre recursão e laço de repetição; &lt;/li&gt;
&lt;li&gt;Quando utilizar laço e quando utilizar recursão.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Conceito geral sobre recursão:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiyjcx2tc9vvq4jvrre2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdiyjcx2tc9vvq4jvrre2.png" alt=" " width="280" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Muito utilizada em estruturas mais complexas, &lt;strong&gt;a recursão ocorre quando uma função chama ela mesma até a sua resolução&lt;/strong&gt;. Dessa maneira, é utilizada quando é necessário fazer uma repetição de tarefas, mas que um laço de repetição não é adequado. Essa imagem do Bob Esponja, representa muito bem a ideia de recursão e em que tipo de estrutura devemos utilizá-la. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Diferenças entre recursão e laço de repetição:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de partirmos para exemplos práticos, vamos pensar em problemas do dia a dia da programação. Vamos supor que você precisa contar a quantidade de comentários de uma postagem, entretanto cada comentário permite a inserção de outro comentário e esse comentário do comentário, pode ter um outro comentário nele e assim por diante. Problemas assim que a recursão pode ser uma mão na roda. Além desses, problemas básicos como fatorial ou exponenciação também podem ser resolvidos com recursão. &lt;/p&gt;

&lt;p&gt;Veremos alguns exemplos práticos:&lt;/p&gt;

&lt;p&gt;Utilizando laço de repetição:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focspzis6w3c8z0b2sjog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Focspzis6w3c8z0b2sjog.png" alt=" " width="163" height="151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizando a técnica de recursão para a mesma solução:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft81ypz8p1nuey2cqb8pn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft81ypz8p1nuey2cqb8pn.png" alt=" " width="200" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repare que na recursão precisamos ter uma variável que irá controlar a quantidade de chamadas, uma vez que se não houver, a recursão será infinita. &lt;br&gt;
Lembrando que quando nós fazemos essas chamadas da função no retorno, essas funções vão entrando na pilha de processamento. Quando terminar essas chamadas, as funções irão desempilhando(FILO - first in last out) uma a uma.&lt;/p&gt;

&lt;p&gt;Repare agora outro exemplo da diferença entre um laço de repetição e uma função recursiva:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3zaa5d9or50hbxamwo2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft3zaa5d9or50hbxamwo2.png" alt=" " width="218" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora olhe que interessante quando comparamos a performance das estruturas utilizando o &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk#:~:text=No%20python%2C%20h%C3%A1%20uma%20biblioteca%20chamada%20timeit%2C%20uma%20das%20funcionalidades%20dela%20%C3%A9%20calcular%20o%20tempo%20de%20execu%C3%A7%C3%A3o%20de%20um%20algoritmo"&gt;TimeIt&lt;/a&gt; do python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7qp45nfmlipu8iqkhkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz7qp45nfmlipu8iqkhkq.png" alt=" " width="633" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A recursão neste caso é menos performática do que o laço, sendo quase o dobro do tempo do laço. Isso, pode se dar ao fato da recursão empilhar as chamadas e desempilhá-las após o término das chamadas e também do laço agir de forma linear sem o empilhamento da estrutura.&lt;/p&gt;

&lt;p&gt;Portanto, uma função recursiva ela: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chama ela mesma;&lt;/li&gt;
&lt;li&gt;Precisa ser controlada para não gerar um looping.&lt;/li&gt;
&lt;li&gt;A cada chamada ela se aproxima do fim;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentro da recursão podemos ter a recursão direta (quando uma função chama ela mesma), recursão indireta (quando ela chama outra função e essa outra função chama ela novamente), função recursiva em cauda (quando a chamada da recursividade é a última a ser executada) e por último temos a função non-tail recursive (função sem cauda).&lt;/p&gt;

&lt;p&gt;Deixarei mais dois algoritmos utilizando recursão em Python. O primeiro calcula o fatorial e o segundo calcula o exponencial:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hgokke7hy0dk9yf72gi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hgokke7hy0dk9yf72gi.png" alt=" " width="404" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Quando utilizar laço e quando utilizar recursão:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Por fim, utilizamos recursão quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O problema pode ser dividido em subproblemas menores e idênticos ao problema original.&lt;/li&gt;
&lt;li&gt;A solução do problema original depende da solução dos subproblemas menores.&lt;/li&gt;
&lt;li&gt;A estrutura de dados subjacente ao problema é naturalmente recursiva, como árvores ou grafos.&lt;/li&gt;
&lt;li&gt;A recursão torna a solução mais fácil de entender e manter
.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utilizamos laço quando: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O problema não pode ser facilmente dividido em subproblemas menores.&lt;/li&gt;
&lt;li&gt;A solução do problema não depende da solução de subproblemas menores.&lt;/li&gt;
&lt;li&gt;A estrutura de dados subjacente ao problema é linear, como uma lista ou matriz.&lt;/li&gt;
&lt;li&gt;O desempenho é uma consideração importante, já que a recursão pode ser mais lenta do que o loop devido ao overhead (custo adicional) da pilha de chamadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/" rel="noopener noreferrer"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>backend</category>
      <category>oauth</category>
      <category>bug</category>
    </item>
    <item>
      <title>Um resumo sobre: listas duplamente encadeadas.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Mon, 27 Feb 2023 20:33:07 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-listas-duplamente-encadeadas-21n7</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-listas-duplamente-encadeadas-21n7</guid>
      <description>&lt;p&gt;Para um melhor entendimento deste resumo, leia sobre &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-simples-3lo6"&gt;lista encadeada simples&lt;/a&gt;, pois lá faço uma boa introdução sobre as listas encadeadas. &lt;br&gt;
Aqui irei abordar sobre as listas duplamente encadeadas.&lt;/p&gt;

&lt;p&gt;Fechando o tema de listas encadeadas, vou para este último tópico:&lt;/p&gt;

&lt;p&gt;As listas encadeadas simples, possuem algumas limitações, por exemplo, quando percorremos este tipo de estrutura, ao avançarmos, nós não poderemos retroceder, pois o caminho delas são da esquerda para a direita, mas não percorrem da direita para a esquerda. As listas duplamente encadeadas, resolvem este problemas, uma vez que os nós apontam para o valor anterior e o próximo. Perceba a diferença entre elas.&lt;br&gt;
&lt;strong&gt;Listas encadeadas com extremidades duplas:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vhqa7enzb1275t17222.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4vhqa7enzb1275t17222.png" alt=" " width="457" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listas duplamente encadeadas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bf16mc2nki5j2f3lwvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4bf16mc2nki5j2f3lwvn.png" alt=" " width="650" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;&lt;u&gt;inserir um elemento&lt;/u&gt;&lt;/strong&gt; no início, nós iremos:&lt;br&gt;
1- Criar um nó com o anterior igual a none;&lt;br&gt;
2- Colocar o “próximo” do novo elemento vai apontar para o primeiro elemento (que será o segundo);&lt;br&gt;
3- O antigo primeiro elemento, não aponta mais o “anterior” para o nulo, mas, sim, para o que será o primeiro elemento;&lt;br&gt;
4- A cabeça da lista agora apontará para o novo elemento e não para o antigo.&lt;br&gt;
&lt;strong&gt;Com essa imagem ficará mais claro:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fet25ft7s691gngr4ac30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fet25ft7s691gngr4ac30.png" alt=" " width="650" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos também &lt;strong&gt;&lt;u&gt;inserir um elemento&lt;/u&gt;&lt;/strong&gt; no final da lista: &lt;br&gt;
1- Criar um nó que o “próximo” aponta para nulo;&lt;br&gt;
2- Apontar o anterior do novo para o elemento que era o último e agora será o penúltimo;&lt;br&gt;
3- Cortamos a ligação do posterior do atual penúltimo com o nulo e ligamos ao atual último;&lt;br&gt;
4- Retiramos o link que aponta o antigo último e colocamos ele apontando para o novo elemento.&lt;br&gt;
&lt;strong&gt;Com a imagem ficará mais fácil a visualização:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dq4sfqf32826muidrna.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5dq4sfqf32826muidrna.png" alt=" " width="650" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;&lt;u&gt;excluir no início&lt;/u&gt;&lt;/strong&gt;:&lt;br&gt;
1- Colocamos o anterior da segunda posição apontando para o nulo,&lt;br&gt;
2- Colocamos a referência “cabeça de lista” apontando para o segundo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yov8pnynw070sqqtom7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8yov8pnynw070sqqtom7.png" alt=" " width="650" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;&lt;u&gt;excluir no final&lt;/u&gt;&lt;/strong&gt; da lista:&lt;br&gt;
1- Apontar o “próximo” do penúltimo ao valor nulo;&lt;br&gt;
2- Apontamos a referência do último ao nó penúltimo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftaifom87hom3ke32zzwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftaifom87hom3ke32zzwy.png" alt=" " width="650" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Excluir na posição&lt;/u&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;1- Fazer pesquisa para saber qual elemento apagar (pode ser da direita para a esquerda ou da esquerda para a direita),&lt;br&gt;
2- Apontar o próximo do anterior do atual para o próximo do atual,&lt;br&gt;
3- Apontar o anterior do próximo do atual para o anterior do atual,&lt;br&gt;
4- Lembrando que nenhum elemento é apagado em si, ele apenas desfaz as ligações que faz com que ele faça parte da lista. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu81pxsc7gf9yvd9bcy89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu81pxsc7gf9yvd9bcy89.png" alt=" " width="650" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://colab.research.google.com/drive/1E_T3Lf9XF1bgKsf8gdxNE6pqG97hUM4u?usp=sharing" rel="noopener noreferrer"&gt;Aqui está&lt;/a&gt; um algoritmo feito em python com a ideia de listas duplamente encadeadas, com inserção no início e no final, exclusão no início, no final e numa posição específica.&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/" rel="noopener noreferrer"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>monorepo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Um resumo sobre: listas encadeadas com extremidades duplas.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Mon, 27 Feb 2023 14:34:48 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-com-extremidades-duplas-50jp</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-com-extremidades-duplas-50jp</guid>
      <description>&lt;p&gt;Para um melhor entendimento deste resumo, leia sobre &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-simples-3lo6"&gt;lista encadeada simples&lt;/a&gt;, pois lá faço uma boa introdução sobre as listas encadeadas. &lt;br&gt;
Aqui irei abordar sobre as listas encadeadas com extremidades duplas.&lt;/p&gt;

&lt;p&gt;Enquanto a lista simples com uma única extremidade possui uma referência para o primeiro nó, a lista com extremidades duplas, referencia o primeiro e o último nó. Dessa maneira, nós podemos ter acesso tanto ao primeiro elemento da lista, quanto ao último, sendo que o último podemos inserir também dados no final. Entretanto, nós não excluímos elemento diretamente do final, somente pesquisando elemento por elemento, até chegar no último, como nas listas encadeadas com extremidade única. Isso ocorre, porque só podemos percorrer a lista da esquerda para a direita, sendo assim, se excluirmos o último, não conseguimos ter acesso ao anterior para indicar que o anterior será o último.  Repare na imagem que as setas vão em uma única direção (esquerda para direita):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy92tjtb9h380gr9185zr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy92tjtb9h380gr9185zr.png" alt=" " width="457" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para inserir um item na última posição:&lt;br&gt;
1- Criamos um novo nó;&lt;br&gt;
2- O objeto que era o último não aponta mais para Null e passa a apontar para o novo objeto;&lt;br&gt;
3-  O novo objeto irá apontar para null; &lt;br&gt;
4- Por fim, nós tiramos o link do cabeça da lista apontando para o que era o último e apontamos para o que agora é o último.&lt;/p&gt;

&lt;p&gt;A imagem irá facilitar a visualização:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7iqiz9hu4703dovzvf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo7iqiz9hu4703dovzvf3.png" alt=" " width="596" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para acessar as outras operações acesse &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-simples-3lo6"&gt;este link&lt;/a&gt; sobre as filas encadeadas com extremidade única, pois é a mesma ideia. &lt;/p&gt;

&lt;p&gt;Quanto ao Big-O dessas operações, ficam da seguinte maneira:&lt;/p&gt;

&lt;p&gt;Na inserção e exclusão do início e do final, será O(1) - constante. (Excelente performance).&lt;br&gt;
Pesquisar, inserir e excluir um item específico, requer buscar os itens, o que resulta em uma notação O(n) - linear. Entretanto, na exclusão, não é necessário o remanejamento dos itens, como nos vetores. &lt;br&gt;
Por fim, essa estrutura utiliza somente a memória que necessitar, podendo ser expandida de acordo com o aumento da lista, como nas listas simples com extremidades únicas.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://colab.research.google.com/drive/1CxHcLP9EMEOyYblc7w2KjEJ3tJP6m8mx?usp=sharing" rel="noopener noreferrer"&gt;Aqui está&lt;/a&gt; um algoritmo feito em python com a ideia de listas encadeadas com extremidades duplas.&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/" rel="noopener noreferrer"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>watercooler</category>
    </item>
    <item>
      <title>Um resumo sobre: listas encadeadas simples.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Sat, 25 Feb 2023 03:19:53 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-simples-3lo6</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-listas-encadeadas-simples-3lo6</guid>
      <description>&lt;p&gt;Neste resumo irei abordar dois tópicos principais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diferença entre vetores e listas encadeadas;&lt;/li&gt;
&lt;li&gt;Processo de pesquisa, exclusão e inserção de dados em listas encadeadas simples.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Diferença entre vetores e listas encadeadas:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Vetores:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em um vetor não ordenado a busca é lenta;&lt;/li&gt;
&lt;li&gt;Vetor ordenado a inserção é lenta;&lt;/li&gt;
&lt;li&gt;Em ambos a remoção é lenta;&lt;/li&gt;
&lt;li&gt;O tamanho do vetor não pode ser alterado depois de criado;&lt;/li&gt;
&lt;li&gt;Mesmo vazios ocupam espaço na memória;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Lista encadeada:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cada item de dado é incorporado em um nó, sendo que cada nó possui referência para o próximo nó da lista;&lt;/li&gt;
&lt;li&gt;A lista possui cabeça e cauda que é apontada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em um vetor nós trabalhamos com posição, já em uma lista, nós trabalhamos com relacionamento. No vetor, nós trabalhamos com o item em uma certa posição e nós acessamos esses elementos por meio do índice que esses itens ocupam.&lt;br&gt;
Com as listas nós trabalhamos com relacionamento e a posição do elemento é no endereço da memória. Dessa maneira, nós teremos acesso ao primeiro da lista e para chegarmos ao último, precisamos acessar todos até encontrá-lo. Os dados não podem ser acessados diretamente. Cada elemento da lista é armazenado em um objeto, sendo que esse elemento referencia o próximo e é alocado dinamicamente conforme a necessidade. Lembrando que o vetor é pré criado, o que ocupa mais lugar na memória. Imagina que estivéssemos em um ambiente que cabe mil pessoas e quando forem surgindo pessoas, nós inserimos ela dentro desse ambiente. Agora termos uma segunda situação, nós inserimos uma pessoa e ela fica em um ambiente suficiente para ela e conforme for entrando, o espaço é aumentado. O primeiro é o vetor e neste último caso é uma lista, que aumenta conforme a necessidade. Para referenciar o primeiro elemento, é utilizado o elemento cabeça da lista. Sabemos que a lista chegou ao final, quando o próximo elemento for nulo.&lt;br&gt;
Nessas duas imagens você terá uma comparação entre vetores de listas:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vetores:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HjD1F3hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fu3zjnocl2rxtk4nva6i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HjD1F3hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fu3zjnocl2rxtk4nva6i.png" alt="Image description" width="190" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Listas:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mNzwx64Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6zsoedk1x2qt6nl3w3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mNzwx64Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6zsoedk1x2qt6nl3w3t.png" alt="Image description" width="464" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois dessa visão geral sobre a comparação entre as  listas e os vetores, vamos falar um pouco sobre as listas simples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Listas Simples:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nessa estrutura, nós podemos realizar 5 operações: &lt;strong&gt;Inserir no início, excluir no início, mostrar lista, pesquisar e excluir da posição.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Inserir no início:&lt;/u&gt;&lt;/strong&gt; Este é o local mais fácil de inserir um item. Quando inserimos o novo nó (elemento), o que era o primeiro passa a ser o segundo da lista e o novo dado terá um ponteiro indicando que ele é a cabeça da lista. Na próxima imagem nós iremos ver 3 operações básicas. &lt;br&gt;
1- Criar o novo nó &lt;br&gt;
2- Apontar o novo nó para o nó que antes era o primeiro &lt;br&gt;
3- Apontar a cabeça da lista para o primeiro elemento. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cfBQVzHs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvetim6p0lcw91dtf1kw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cfBQVzHs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvetim6p0lcw91dtf1kw.png" alt="Image description" width="536" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Excluir no início:&lt;/u&gt;&lt;/strong&gt; É inverso do inserir no início. Iremos sobrescrever o ponteiro que indicava a cabeça da lista que agora irá indicar que o primeiro nó é o que era o segundo. O segundo nó é encontrado por meio do ‘próximo’ do primeiro nó. Observe na imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GkdMENbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/641tu1j7ak9tjw02kha3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GkdMENbr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/641tu1j7ak9tjw02kha3.png" alt="Image description" width="464" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Mostrar lista e pesquisar:&lt;/u&gt;&lt;/strong&gt; Para essas duas operações, irá funcionar de forma parecida. O programa irá iniciar no primeiro nó e irá percorrer de nó em nó, até chegar em um nó que irá apontar para o ‘próximo’ que será nulo. Se quisermos mostrar a lista toda, ele percorrerá todo nó, se quisermos encontrar um elemento, ele segue do início de nó em nó até encontrar e caso não exista o elemento ele irá percorrer toda a lista e não achará. Muito parecido com a pesquisa linear que vimos nos vetores. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Excluir na posição: &lt;/u&gt;&lt;/strong&gt;Por fim, essa operação é realizada quando queremos excluir um nó específico da lista. Iremos basicamente realizar uma pesquisa até encontrar o elemento desejado e então faremos com que o nó anterior a ele aponte o ‘Próximo’ para o que está posterior ao nó excluído. Observe na imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r7H3hQ5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1aexk15hmb96mdli80kk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r7H3hQ5s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1aexk15hmb96mdli80kk.png" alt="Image description" width="580" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
    </item>
    <item>
      <title>Um resumo sobre: deque.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Thu, 23 Feb 2023 19:46:14 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-deque-45hc</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-deque-45hc</guid>
      <description>&lt;p&gt;Deque é uma abreviação de Double Ended Queue (fila de duas pontas), ele pode ser utilizado para implementar estrutura do tipo &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-fila-25b1"&gt;fila(FIFO)&lt;/a&gt; e &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-fila-25b1"&gt;pilha(FILO)&lt;/a&gt;. Caso não saibam o funcionamento dessas duas estruturas de dados, sugiro que leiam. Entretanto, vou abordar algumas características de ambas, a fim de comparar com o deque. Na fila de modo geral, nós adicionamos os elementos na cauda e tiramos na cabeça. A inserção dos dados é do tipo constante, o que agiliza o processo, entretanto, quando tratamos da exclusão dos dados, o &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;Big-O&lt;/a&gt; passa a ser O(n) - linear, porque precisamos remanejar todos os dados para que a primeira posição não fique vazia. Enquanto isso, o deque adiciona e remove itens em qualquer direção com o desempenho aproximado O(1), segundo o &lt;a href="https://docs.python.org/pt-br/3.9/library/collections.html#collections.deque:~:text=Deques%20s%C3%A3o%20uma,em%20qualquer%20dire%C3%A7%C3%A3o."&gt;python collections&lt;/a&gt;. Sendo assim, quando comparamos a inserção e remoção de elementos, o deque ganha em questão de performance. O deque pode se comportar como fila(até mesmo as filas de prioridade) ou pilha, com isso, nós podemos excluir e adicionar elementos tanto no início, quanto no final da estruturas.&lt;br&gt;
Veja esta imagem que mostra a diferença entre as três:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mokcE80i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efzuyhqlrx3zycbuhb39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mokcE80i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/efzuyhqlrx3zycbuhb39.png" alt="Image description" width="381" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A implementação de exclusão e inserção de dados nos deques podem ser realizadas de forma estática ou circular. A forma circular é muito parecida com a da fila que vimos nos resumos passados. Basicamente, a implementação deste tipo é formado por um ponteiro indicando o início e o final da fila, sendo que esta é a forma mais indicada para este tipo de estrutura de dados. Já a forma estática, não é tão indicada por ter sua notação linear O(n), devido ao reajuste das casas para inserção e exclusão de itens do início do vetor. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://colab.research.google.com/drive/1aUox84-6ZnU9ic4lMVBIGVjahPKfyWRf?usp=sharing"&gt;Aqui está um algoritmo em python com a ideia de deque. &lt;br&gt;
&lt;/a&gt;&lt;br&gt;
Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;Este resumo é baseado no curso: &lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt;Estruturas de dados e algoritmos em python&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>python</category>
    </item>
    <item>
      <title>Um resumo sobre: filas.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Wed, 22 Feb 2023 21:20:31 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-fila-25b1</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-fila-25b1</guid>
      <description>&lt;p&gt;Neste resumo irei abordar os seguintes tópicos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Introdução:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conceito geral de fila&lt;/li&gt;
&lt;li&gt;Fila circular&lt;/li&gt;
&lt;li&gt;Fila de prioridade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Conceito Geral:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Hoje irei abordar sobre a fila. Essa estrutura de dados é muito parecida com a fila que temos na vida real. Em uma fila, o primeiro a chegar é o primeiro a ser atendido e o último a chegar, será o último a sair. Com isso, temos o principal conceito de uma fila &lt;strong&gt;FIFO(first-in-first-out)&lt;/strong&gt;, ou seja, o primeiro elemento a ser inserido, será o primeiro elemento a ser removido. &lt;br&gt;
Para &lt;strong&gt;&lt;u&gt;inserir&lt;/u&gt;&lt;/strong&gt; um item nessa estrutura, nós iremos enfileirar, o que significa que iremos adicionar o dado no final da fila. Para &lt;strong&gt;&lt;u&gt;remover&lt;/u&gt;&lt;/strong&gt;, iremos desenfileirar, assim, retiramos o elemento do início do vetor. Por fim, para &lt;strong&gt;&lt;u&gt;visualizarmos&lt;/u&gt;&lt;/strong&gt; um elemento, nós iremos ver o primeiro da fila.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Fila Circular:&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Irei abordar um conceito muito importante nessa estrutura que é a &lt;strong&gt;fila circular&lt;/strong&gt;. Como vimos em &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-ordenados-e-pesquisa-linear-e-binaria-49ch"&gt;vetores ordenados&lt;/a&gt; e &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-nao-ordenados-fod"&gt;vetores não ordenados&lt;/a&gt;, se excluirmos um dado no início ou no meio do vetor, nós iremos remanejar todos os itens posteriores para que não haja nenhuma casa vazia, com essa imagem ficará fácil de visualizar: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fifGtwf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4tcvgay1t9i1p8mit4is.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fifGtwf1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4tcvgay1t9i1p8mit4is.png" alt="Image description" width="487" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa abordagem aumenta um número n de passos de acordo com o tamanho de dados do vetor. A fila circular faz com que esse remanejamento não aconteça, melhorando, dessa maneira, a performance da aplicação. Ela funciona da seguinte forma: existem dois ponteiros, um que representa o início da fila e outro que representa o final, quando entra um elemento novo, o ponteiro do final da fila muda de posição e quando sai um elemento, o ponteiro de início da fila também muda de posição. Imagina uma fila de banco, só que quando você entra na sua posição da fila você não pode mais se mover, somente se for para sair. Vamos supor que tem uma fila montada e que ninguém foi atendido e assim que você chega a pessoa que era última te entrega a placa que identifica que agora você é o último. A primeira pessoa quando for atendida ninguém sai do lugar, mas ela passa a plaquinha para o segundo da fila para informar que o segundo agora é o primeiro. Quando chegar uma próxima pessoa, ela vai para o lugar vazio, que é onde estava o primeiro, assim, você entrega a placa de último lugar para ela. &lt;br&gt;
Observe na imagem para facilitar a visualização:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0ciYn4jd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phiw7utqshod3kmf7yd8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0ciYn4jd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phiw7utqshod3kmf7yd8.png" alt="Image description" width="730" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O número 6 é o primeiro da fila e o 5 é o último. Após isso chega o número 7 que recebe a plaquinha do último da fila, o número 6 sai da fila e quando chegar o número 1, este ocupa a casa que o 6 deixou, mas recebe a placa de último da fila e os dados irão &lt;strong&gt;circulando&lt;/strong&gt; entre as posições.&lt;br&gt;
Quando utilizamos as filas normais, o &lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;Big-O&lt;/a&gt; será linear O(n), mas quando utilizamos as &lt;strong&gt;filas circulares&lt;/strong&gt; o Big-O será constante. Isso faz com que as filas circulares tenham um excelente desempenho, quando comparamos com as demais estruturas.&lt;br&gt;
Irei contextualizar com Javascript e Python: &lt;br&gt;
Com JS, &lt;strong&gt;inserimos&lt;/strong&gt; os dados em um array com o &lt;strong&gt;push( )&lt;/strong&gt;, pois ele sempre será inserido no final da fila. Para &lt;strong&gt;excluirmos&lt;/strong&gt; um dado, utilizamos o método de array &lt;strong&gt;shift( )&lt;/strong&gt;. E para a &lt;strong&gt;pesquisa&lt;/strong&gt; é só pegar o primeiro item, &lt;strong&gt;array[0]&lt;/strong&gt;. Lembrando que essa ideia de fila que estou passando é uma fila comum e não circular. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--skfPFuqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1lke922y7cwrvenjnj8i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--skfPFuqD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1lke922y7cwrvenjnj8i.png" alt="Image description" width="715" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para realizarmos algoritmos com filas circulares, podemos fazer por meio de classes ou funções. Segue um exemplo de um algoritmo circular feito em python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--92rPTmHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5frkwhsl5u3wadcnlm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--92rPTmHU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n5frkwhsl5u3wadcnlm1.png" alt="Image description" width="322" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Fila de prioridade&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Neste tipo de estrutura, os itens são ordenados por valor-chave, em que os elementos com o valor alto ou baixo (depende de como será definido), terão prioridade na fila. Vamos supor que quanto menor o número da chave, mais será a prioridade. Dessa maneira, se temos um array com valores [1,5,10,15,24,30] e entrar o item com chave número 3, ele ficará na segunda posição [1, 3, 5, 10, 15, 24, 30]. Pensa nos grupos prioritários em uma fila de mercado, banco e etc. &lt;br&gt;
Veja este outro exemplo para ficar mais claro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IxS16BKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2mpuuw6sb1d81olc7g6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IxS16BKL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n2mpuuw6sb1d81olc7g6.png" alt="Image description" width="880" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deixarei um algoritmo feito em python que representa uma fila de prioridade:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TeGcw7kq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4qsuvgfpstyzwv6tzxdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TeGcw7kq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4qsuvgfpstyzwv6tzxdy.png" alt="Image description" width="354" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;br&gt;
Este resumo é baseados no curso:&lt;a href="https://www.udemy.com/course/estrutura-de-dados-e-algoritmos-python-guia-completo/"&gt; Estruturas de dados e algoritmos em python&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-pilha-16on"&gt;Veja sobre pilhas!&lt;/a&gt;&lt;/p&gt;

</description>
      <category>algorithms</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>Um resumo sobre: pilha</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Wed, 22 Feb 2023 03:36:57 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-pilha-16on</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-pilha-16on</guid>
      <description>&lt;p&gt;Pilha é uma estrutura de dados que representa um elemento sobre o outro. Imagine uma pilha de papéis ou uma pilha de moedas, repare que quando pensamos em uma pilha de alguma coisa, pensamos em um elemento sobre o outro. Caso deseje retirar um elemento do meio desta pilha você terá uma certa dificuldade, assim, precisará tirar todos os elementos de cima, de um a um, até que o objeto que você deseja retirar seja o último da pilha. Aí está a primeira característica desta estrutura de dados, o primeiro elemento a entrar, será o último a sair &lt;strong&gt;&lt;u&gt;(LIFO - Last-in-First-out)&lt;/u&gt;&lt;/strong&gt;. Perceba bem que nesse tipo de estrutura nós teremos acesso ao último elemento da pilha (ou elemento do topo). &lt;br&gt;
Para &lt;strong&gt;&lt;u&gt;inserir&lt;/u&gt;&lt;/strong&gt; um dado nesse tipo de estrutura nós iremos empilhar, ou seja, colocar um elemento no topo da pilha. Para excluir, nós iremos &lt;strong&gt;&lt;u&gt;excluir&lt;/u&gt;&lt;/strong&gt; o dado que estará no topo da pilha. Podemos também &lt;strong&gt;&lt;u&gt;pesquisar&lt;/u&gt;&lt;/strong&gt; somente o topo da pilha. Só é possível pesquisar, inserir e excluir o item do topo da pilha, isso não pode ocorrer no meio dela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DlERDuNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xageefom9m9m0usywtuj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DlERDuNx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xageefom9m9m0usywtuj.png" alt="Image description" width="628" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para contextualizar com javascript, imagine um array que iremos &lt;strong&gt;inserir&lt;/strong&gt; dados, assim, o método &lt;strong&gt;push(elemento a ser inserido)&lt;/strong&gt; passa a ideia de inserção em uma pilha, ele sempre irá inserir no topo/final do vetor. Já o método &lt;strong&gt;pop( )&lt;/strong&gt;, funcionará como a &lt;strong&gt;exclusão&lt;/strong&gt; de elementos de uma pilha, pois ele irá tirar o último elemento do array. Por fim, se quisermos &lt;strong&gt;pesquisar&lt;/strong&gt; o último elemento, nós temos algumas formas, dentre elas temos o &lt;strong&gt;at(-1)&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Fiz um exemplo em que eu insiro em JS que insiro vários elementos e depois retiro o último e por fim eu imprimo o elemento do topo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4-i2P-hu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r675xi1cnpuwhrkev5ti.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4-i2P-hu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r675xi1cnpuwhrkev5ti.png" alt="Image description" width="489" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, segue um exemplo de um algoritmo que fiz em python que utiliza também a ideia de pilha: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RAmSxFc3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1drk1jbxusgl9fvrju7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RAmSxFc3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1drk1jbxusgl9fvrju7x.png" alt="Image description" width="511" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;Big-O&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-nao-ordenados-fod"&gt;Vetores não ordenados&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-ordenados-e-pesquisa-linear-e-binaria-49ch"&gt;Um resumo sobre: vetores ordenados e pesquisa linear e binária.&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Um resumo sobre: vetores ordenados e pesquisa linear e binária.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Tue, 21 Feb 2023 00:40:12 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-vetores-ordenados-e-pesquisa-linear-e-binaria-49ch</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-vetores-ordenados-e-pesquisa-linear-e-binaria-49ch</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;br&gt;
Nesse resumo irei abordar os seguintes temas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vetores ordenados: pesquisa, inserção e exclusão de dados;&lt;/li&gt;
&lt;li&gt;Pesquisa linear e binária&lt;/li&gt;
&lt;li&gt;Diferença de performance entre vetores ordenados e não ordenados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vetores Ordenados: pesquisa, inclusão e exclusão de dados&lt;/strong&gt;&lt;br&gt;
Os vetores ordenados, estão dispostos em ordem crescente, em que a menor chave está na posição 0 e a próxima posição terá a chave maior que a posição anterior. Ele pode agilizar bastante o tempo de &lt;strong&gt;&lt;u&gt;pesquisa&lt;/u&gt;&lt;/strong&gt;(tanto a linear, quanto a binária) quando comparamos com vetores não ordenados. Para a &lt;strong&gt;&lt;u&gt;inserção&lt;/u&gt;&lt;/strong&gt; de dados em vetores não ordenados (pense sempre nos vetores como array no javascript e dados ou chaves como os valores inseridos nele, sendo que esses valores podem ser números, strings e etc), é preciso somente inserir. Agora, quando tratamos de vetores ordenados, nós precisamos percorrer o vetor até encontrar um próximo número que seja maior que ele e, assim, mover os números posteriores para casa da frente para que o número ocupe sua devida posição. &lt;br&gt;
Observe na imagem quando inserimos o número 3:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Farorsjjbe0s2g22tp5vj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Farorsjjbe0s2g22tp5vj.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembrando que o Big-O será O(n). Embora a &lt;strong&gt;&lt;u&gt;pesquisa&lt;/u&gt;&lt;/strong&gt; seja linear (não estou falando da binária, que só é possível em vetores ordenados) em vetores ordenados e não ordenados, o número de passos será menor nos vetores ordenados, uma vez que, na maioria das vezes, o programa não precisará percorrer o vetor inteiro, pois achando o número ele para a execução. &lt;br&gt;
Para uma melhor visualização, você pode entrar &lt;a href="https://www.cs.usfca.edu/~galles/visualization/Search.html" rel="noopener noreferrer"&gt;nesse link&lt;/a&gt; e no canto superior esquerdo você insere um número para ser procurado e clique em pesquisar e ele vai mostrar os passos que o programa faz para achar o número digitado. Caso não tenha o número na lista, o retorno será -1 e se achar o programa retornará o index do array.&lt;br&gt;
Já para &lt;strong&gt;&lt;u&gt;excluir&lt;/u&gt;&lt;/strong&gt; um número desse vetor ordenado, não possui grandes diferenças entre os vetores não ordenados. A maior diferença é que o número de passos pode ser um pouco menor, uma vez que assim que ele encontrar o número, ele apaga e não precisa continuar percorrendo o vetor.&lt;br&gt;
Veja o processo de exclusão na imagem, retirei o número 4:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gjaabxngdjxjrepkmv5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gjaabxngdjxjrepkmv5.png" alt=" " width="676" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pesquisa binária:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Até o momento vimos sobre a pesquisa linear, em que ele executa passo a passo para encontrar um número. Por exemplo, se tivermos um array ordenado de números 1 a 101 e  precisarmos encontrar o número 60, o programa percorrerá a posição 0, 1, 2, 3, 4 e assim sucessivamente até encontrar a chave 60. &lt;br&gt;
Já a pesquisa binária resolveria assim:temos a posição do array de 0 até 100, então divido por dois que será a posição 50, assim, ele verifica o número da posição 50 se é maior, menor ou igual ao número 60, como neste caso é menor que 60, ele ficará entre a posição 51 a 101. Nisso, ele encontra a posição do meio entre essas duas, que é 76, ele verifica se o número dessa posição é maior do que 60, dessa maneira, ele sabe que está entre a posição 51 e a posição 76. Com isso, ele encontra o meio entre essas posições que dará aproximadamente 64 e faz a verificação e vê que é maior do que o que estamos procurando, agora ele observa entre a posição 51 e 64, que dá 57, como o número 60 está na posição 59 do array, ficará entre 57 e 64, a posição será a 60 aproximadamente, nisso ele verifica que é menor e procura a posição entre 57 e 60, que dá na a 59(valor aproximado) e encontra. Embora complexo à primeira vista, essa busca economiza muito o passo a passo para pesquisar as posições em listas ordenadas. Enquanto a pesquisa linear dá 60 passos, a pesquisa binária faz apenas 6 passos, ou seja, 10 vezes menos, nesse exemplo.&lt;br&gt;
&lt;a href="https://www.cs.usfca.edu/~galles/visualization/Search.html" rel="noopener noreferrer"&gt;Neste Link&lt;/a&gt; você pode comparar ambas. Basta colocar um número para fazer a pesquisa linear e depois a binária.&lt;br&gt;
Olhe este exemplo com menos quantidade de números: &lt;br&gt;
Para procurar o 9, o programa dividirá as posições por dois, verificar, dividir novamente e verificar. Esse ciclo ocorre até encontrar ou não encontrar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xsp8fgnju87gh4vr9ok.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7xsp8fgnju87gh4vr9ok.png" alt=" " width="611" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vai uma comparação entre a pesquisa linear e a binária:&lt;br&gt;
Lembrando que a comparação linear está O(n/2) pois é uma média dos passos que será dado, será n e no mais otimizado(caso o número seja o primeiro da lista), será O(1).&lt;br&gt;
Enquanto busca linear e O(n), a binária é O(log n), que se aproxima muito da constante que é a mais otimizada.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqhzhet5f7r649sm2o4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqhzhet5f7r649sm2o4o.png" alt=" " width="541" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com essa comparação nós podemos concluir que a &lt;strong&gt;&lt;u&gt;pesquisa &lt;/u&gt;&lt;/strong&gt;binária é absurdamente mais otimizada que a pesquisa linear. Aí está a grande importância de termos lista de dados ordenados. &lt;br&gt;
Este é um exemplo de um código que fiz para a realização de uma busca binária em Javascript:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffs2vb7i8ppk7uebsvkp8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffs2vb7i8ppk7uebsvkp8.png" alt=" " width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Passando a função binSearch(“array”, “começando na posição 0 à esquerda”, “vai até a última posição - o -1 é porque o array inicia em 0”, “por último é o número que queremos pesquisar”).&lt;/p&gt;

&lt;p&gt;Resumo geral entre performance de vetores ordenados e não ordenados para inserção e pesquisa de dados:&lt;/p&gt;

&lt;p&gt;Se precisarmos inserir um dado, vetores não ordenados são mais ágeis do que vetores ordenados, uma vez que nos vetores ordenados, os itens precisam ser movidos para abrir espaço. Vetor não ordenado: Big-O constante O(1) e Vetor ordenado: Big-O linear O(n);&lt;br&gt;
Se precisarmos pesquisar um dado, vetores não ordenados são muito mais devagar do que vetores ordenados, pelo fato de poder fazer a busca binária e também na busca linear o algoritmo não precisa passar por todo array. Vetor não ordenado: Big-O linear O(n) e Vetor ordenado: Big-O log de n O(log n);&lt;br&gt;
As remoções para os dois vetores são lentas, pois quando retiramos um dado, tem a necessidade de preencher o buraco, gerando o deslocamento dos dados posteriores, sendo os dois lineares O(n);&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vetores ordenados são úteis para pesquisas mais frequentes, entretanto os não ordenados são mais úteis para a inserção de dados.Dessa maneira, é necessário entender as maiores necessidades da aplicação para implementar a melhor estrutura de dados.&lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;Big-O&lt;/a&gt;&lt;br&gt;
&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-vetores-nao-ordenados-fod"&gt;Vetores não ordenados&lt;/a&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>developer</category>
    </item>
    <item>
      <title>Um resumo sobre: vetores não ordenados.</title>
      <dc:creator>Mateus Costa</dc:creator>
      <pubDate>Sun, 19 Feb 2023 20:24:51 +0000</pubDate>
      <link>https://dev.to/costamateus7/um-resumo-sobre-vetores-nao-ordenados-fod</link>
      <guid>https://dev.to/costamateus7/um-resumo-sobre-vetores-nao-ordenados-fod</guid>
      <description>&lt;p&gt;&lt;u&gt;&lt;strong&gt;Linhas gerais sobre inserção, pesquisa e exclusão de dados em um vetor não ordenado.&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;Para trabalharmos em um determinado sistema, as operações básicas que utilizamos são: inserção, pesquisa e remoção. Vamos para exemplos práticos: vamos supor que estamos em um treino de futebol, quando entra um jogador é como se entrasse um novo dado nessa estrutura de dados ou vetor, quando sai um jogador, quer dizer que excluímos um dado. &lt;br&gt;
Podemos ver o time como um array com 11 posições e os jogadores serão &lt;strong&gt;&lt;u&gt;inseridos&lt;/u&gt;&lt;/strong&gt; de forma aleatória (não ordenada) nesse array, vamos inserindo ocupando a posição 0, 1, 2, 3 e assim por diante. Se pensarmos no Big-O, para inserir um novo jogador nesse array é necessário um passo somente &lt;strong&gt;ArrayTime.push(Jogador)&lt;/strong&gt;. Assim, a notação big-o será constante O(1). &lt;br&gt;
Agora vamos supor que precisássemos &lt;strong&gt;&lt;u&gt;encontrar&lt;/u&gt;&lt;/strong&gt; um elemento(jogador) nesse Array Time. Em javascript, usamos a função find para percorrer o array e encontrar o jogador. Em notação Big-O será O(n), ou seja, quanto maior o array e quantidade de dados, maior a complexidade, sendo assim, linear. &lt;br&gt;
Se quisermos &lt;strong&gt;&lt;u&gt;excluir&lt;/u&gt;&lt;/strong&gt; um jogador, iremos percorrer o array em um número n de passos e tirá-lo da posição, após isso precisamos remanejar as posições para que a posição tirada não fique vazia. Para remanejar, precisamos dar mais uma quantidade n de passos, pois isso irá depender do número que tiramos e qual posição ele estava. Perceba na imagem:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg7lmxv19npwh11sc8ri.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg7lmxv19npwh11sc8ri.png" alt=" " width="487" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lembrando que como são vetores não ordenados, os números, logicamente, não estão ordenados nem em ordem crescente, nem decrescente, apenas de forma aleatória.&lt;br&gt;
Na imagem, retiramos o número 1. Com isso, foram necessários 5 passos. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passo 1 - verificar a posição zero.&lt;/li&gt;
&lt;li&gt;Passo 2 - verificar a posição um.&lt;/li&gt;
&lt;li&gt;Passo 3 - verificar a posição dois e tirar o número 1.&lt;/li&gt;
&lt;li&gt;Passo 4- Remanejar o número 8 para a segunda posição.&lt;/li&gt;
&lt;li&gt;Passo 5 - Remanejar o 5 para a terceira posição.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em Big-O, a notação ficaria assim: O(2n), como N é infinito, ficaria infinito mais infinito que ficaria O(n), ou seja, linear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Chaves únicas X Chaves duplicadas:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No exemplo anterior, não estávamos levando em consideração se as chaves eram duplicadas ou únicas, dei apenas uma visão bem simplificada. Entretanto, neste tópico irei abordar sobre a comparação entre chaves únicas e duplicadas na &lt;strong&gt;&lt;em&gt;&lt;u&gt;verificação, inserção e exclusão de dados&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;. No exemplo dos jogadores, não é permitido jogadores com o mesmo número na camisa, assim, não é permitido valores duplicados. Se a chave fosse pelo nome do jogador, aí seria permitida chaves duplicadas, pois em um time, jogadores podem ter o mesmo nome. Se uma estrutura permitir chaves duplicadas, na &lt;strong&gt;&lt;u&gt;pesquisa&lt;/u&gt;&lt;/strong&gt;, o programa ao invés de procurar a primeira chave até encontrar e após isso pausar, ele precisará percorrer todo o array. Em JS se as chaves não forem duplicadas, podemos passar o método find no array, mas se as chaves forem duplicadas, passaremos o método filter. Retornando para o exemplo do time de futebol, se as chaves forem o número da camisa, nós utilizamos o find, se forem os nomes, utilizamos o filter, pois terá a possibilidade de haver mais de um jogador com o mesmo nome. Para &lt;strong&gt;&lt;u&gt;inserção&lt;/u&gt;&lt;/strong&gt; de um jogador, se as chaves forem o nome, é só inserir na última posição e pronto, pois não precisamos preocupar se está repetida ou não. Se forem os números, teremos que percorrer todo o array para verificar se há algum número igual ao que vai entrar para não haver chaves duplicadas, logo após a verificação, é só inserir. Por último, a &lt;strong&gt;&lt;u&gt;exclusão&lt;/u&gt;&lt;/strong&gt;, caso a chave for única, iremos percorrer o array até encontrar o elemento para excluir e depois reorganizar as posições, aplicar o método find no array e depois o splice. Se a chave for duplicada o processo será: Procura e exclui, rearranja, procura e exclui e rearranja novamente, faz esse processo até chegar ao fim do array, precisaremos utilizar o método filter. &lt;br&gt;
Em todas as chaves, a notação big-o será linear, ou seja, quanto maior a entrada de dados, maior será o n, embora a quantidade de passos mudará consideravelmente para cada caso, como descrevi. &lt;/p&gt;

&lt;p&gt;Caso tenha alguma sugestão sobre o tema, mande mensagem. Será muito bom evoluir com sua ajuda! Obrigado por chegar até aqui e espero ter ajudado!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array" rel="noopener noreferrer"&gt;Caso tenha dúvidas sobre os métodos find, splice e filter do Javascript.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/costamateus7/um-resumo-sobre-big-o-2hpk"&gt;Leia sobre o artigo de Big-O para entender melhor o tema:&lt;/a&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
  </channel>
</rss>
