<?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: Caio Vidal</title>
    <description>The latest articles on DEV Community by Caio Vidal (@caioavidal).</description>
    <link>https://dev.to/caioavidal</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%2F322219%2F31b06db4-56c4-41e9-80e0-c58e23117364.jpg</url>
      <title>DEV Community: Caio Vidal</title>
      <link>https://dev.to/caioavidal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/caioavidal"/>
    <language>en</language>
    <item>
      <title>Codility GenomicRangeQuery (Resolvido)</title>
      <dc:creator>Caio Vidal</dc:creator>
      <pubDate>Thu, 07 May 2020 20:08:31 +0000</pubDate>
      <link>https://dev.to/caioavidal/codility-genomicrangequery-resolvido-2k90</link>
      <guid>https://dev.to/caioavidal/codility-genomicrangequery-resolvido-2k90</guid>
      <description>&lt;p&gt;Depois de um tempo pensando na solução performática para o desafio do codility GenomicRangeQuery. Consegui resolve-lo com O(n+m).&lt;/p&gt;

&lt;p&gt;O desafio é esse: &lt;a href="https://app.codility.com/programmers/lessons/5-prefix_sums/genomic_range_query/"&gt;https://app.codility.com/programmers/lessons/5-prefix_sums/genomic_range_query/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lendo a questão, a primeira solução que me veio a cabeça, de cara, era muito lenta resultando time complexity de O(n*m), dando timeout em alguns cenários.&lt;/p&gt;

&lt;p&gt;Então comecei a pensar em outra possibilidade e cheguei a seguinte solução:&lt;/p&gt;

&lt;p&gt;Peguei todas as letras de S e montei a seguinte estrutura:&lt;br&gt;
Supondo o input: "CAGCCTA"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dna: {
   "C": [1,1,1,2,2,2,2],
   "A": [0,1,1,1,1,1,2],
   "G": [0,0,1,1,1,1,1],
   "T": [0,0,0,0,0,1,0]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como podemos ver, montei um array, somando a ocorrência em cada index, dessa forma temos uma linha do tempo e caso queiramos saber qual o menor valor entre dois intervalos, basta fazer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   for(let l = 0; l &amp;lt; letters.length; l++){
             let letter = letters[l];


             let startSumValue = start &amp;gt; 0 ? dnaMap[letter].sums[start - 1] : 0;
             if(startSumValue != dnaMap[letter].sums[end]){
                result.push(dnaMap[letter].value);
                break;
            }
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A solução final ficou assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function solution(S, P, Q) {

    var dnaMap = {
        'A': {value:1, last:0, sums:[] },
        'C': {value:2, last:0, sums:[] },
        'G': {value:3, last:0, sums:[] },
        'T': {value:4, last:0, sums:[] },
    }

    var letters = [..."ACGT"];

    var result = [];

    for(let i = 0; i &amp;lt; S.length; i++){
       let dna = S[i];


       letters.forEach((letter)=&amp;gt;{
            var lastValue = dnaMap[letter].last;

            if(S[i] == letter){
                lastValue++;
                dnaMap[letter].last += 1;
            }
            dnaMap[letter].sums.push(lastValue);
       })
    }


    for(let i = 0; i &amp;lt; P.length; i++){

        let start = P[i];
        let end = Q[i];

        if(start == end){
            result.push(dnaMap[S[start]].value);
            continue;
        }

        for(let l = 0; l &amp;lt; letters.length; l++){
             let letter = letters[l];


             let startSumValue = start &amp;gt; 0 ? dnaMap[letter].sums[start - 1] : 0;
             if(startSumValue != dnaMap[letter].sums[end]){
                result.push(dnaMap[letter].value);
                break;
            }
        }


    }

    return result;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>BinaryGap em duas linhas</title>
      <dc:creator>Caio Vidal</dc:creator>
      <pubDate>Thu, 06 Feb 2020 19:06:21 +0000</pubDate>
      <link>https://dev.to/caioavidal/binarygap-em-duas-linhas-c9l</link>
      <guid>https://dev.to/caioavidal/binarygap-em-duas-linhas-c9l</guid>
      <description>&lt;p&gt;Depois de solucionar o 1° desafio do codility: BinaryGap, resolvi postar aqui o algoritmo final que usei.&lt;/p&gt;

&lt;p&gt;A desafio é o seguinte: Dado um número N, deve-se transforma-lo em binário e retornar o tamanho do maior número de zeros entre 1's. &lt;br&gt;
Com exemplo fica mais fácil entender, olha só:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O número 152 em binário fica: 1 &lt;strong&gt;00&lt;/strong&gt; 11000 - Ele possui apenas 1 bloco com dois zeros, então o retorno seria 2.&lt;/li&gt;
&lt;li&gt;O número 15 em binário fica: 1111 - Ele não possui nenhum bloco de zeros, então o retorno seria 0.&lt;/li&gt;
&lt;li&gt;O número 3561 em binário fica: 11 &lt;strong&gt;0&lt;/strong&gt; 1111 &lt;strong&gt;0&lt;/strong&gt; 1 &lt;strong&gt;00&lt;/strong&gt; 1- Ele possui 2 blocos com um zero e um bloco com dois zeros, o retorno então seria 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dado o desafio, depois de um tempo tentando soluções com loop e contadores, cheguei a minha 1ª solução que achei aceitável:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function solution(N) {
    const n = "X" + N.toString(2) + "X";
    const list = n.split("1");

    let max = 0;

    list.forEach((i) =&amp;gt; {
        if (i.indexOf("X") == -1) {
            max = i.length &amp;gt; max ? i.length : max;
        }
    })

    return max;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois dessa solução, ficou fácil, bastou alterar o forEach para um map e um reduce, olha aí:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function solution(N) {
    const n = "X" + N.toString(2) + "X";

    return n.split("1").map((i) =&amp;gt; i.indexOf("X") == -1 ? i.length : 0)
        .reduce((a, b) =&amp;gt; Math.max(a, b))

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O map retorna o length de cada bloco e o reduce retorno o maior número do array.&lt;br&gt;
Lembrando que embora a solução final tenha ficado mais elegante, a solução mais performática é a 1ª pois existe apenas uma iteração.&lt;/p&gt;

&lt;p&gt;Um abraço e até a próxima.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Multiprogramming, Multiprocessing e multitasking</title>
      <dc:creator>Caio Vidal</dc:creator>
      <pubDate>Wed, 29 Jan 2020 17:25:49 +0000</pubDate>
      <link>https://dev.to/caioavidal/multiprogramming-multiprocessing-e-multitasking-33gg</link>
      <guid>https://dev.to/caioavidal/multiprogramming-multiprocessing-e-multitasking-33gg</guid>
      <description>&lt;p&gt;Comecei a estudar sobre o assunto e resolvi escrever um pouco sobre o entendimento que tive durante esse tempo. Então, tentarei explicar de maneira simples e clara sobre esses conceitos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Multiprogramming
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multiprogramming&lt;/strong&gt; é um dos aspectos mais importante nos sistemas operacionais modernos, ele funciona da seguinte forma:&lt;/p&gt;

&lt;p&gt;Sabemos que os sistemas operacionais atuais possuem múltiplos processos a serem executados, como a memória principal é muito pequena para armazenar todos eles, esses processos são inicialmente armazenados numa fila chamada &lt;em&gt;job pool&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;O CPU, então, seleciona um desses jobs (processos), armazena na memória principal e começa a executá-lo até que esse processo seja interrompido por algum fator externo ou inicie alguma tarefa de I/O.&lt;br&gt;
No momento da interrupção, o CPU então seleciona outro job no &lt;em&gt;job pool&lt;/em&gt; e executa até que o mesmo seja interrompido, fazendo assim uma espécie de rodízio. &lt;br&gt;
Dessa forma o CPU não fica ocioso aguardando os jobs executarem seus trabalhos de I/O (leitura e escrita no disco, comunicação em rede).&lt;/p&gt;

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

&lt;p&gt;Como podemos ver na imagem acima, em nenhum momento o processador ficou ocioso&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiprocessing
&lt;/h2&gt;

&lt;p&gt;Como vimos, com um CPU, apenas um processo executava por vez.&lt;br&gt;
Hoje em dia, a maioria dos computadores possuem processadores com múltiplos cores permitindo assim que vários processos sejam executados de forma paralela.&lt;/p&gt;

&lt;p&gt;Supondo um processador dual-core, dois processos serão executados simultaneamente. Um quad-core executaria 2x mais rápido que um dual-core e 4x mais rápido que um processador com um único core.&lt;/p&gt;

&lt;p&gt;Dessa forma podemos concluir que quando falamos de paralelismo, estamos tendo como referência o hardware. Em resumo é a capacidade do CPU executar mais de um processo de forma simultânea através dos múltiplos cores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multitasking
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multitasking&lt;/strong&gt; como o próprio nome já diz, seria a capacidade de executar múltiplas tarefas ao mesmo tempo. &lt;br&gt;
Multitasking é uma extensão lógica de multiprogramming. A maior diferença entre eles é que em multiprogramming havia uma mudança de contexto entre os processos através de uma interrupção, já multitasking é baseado em tempo de compartilhamento (&lt;em&gt;time slicing&lt;/em&gt; ou &lt;em&gt;time sharing&lt;/em&gt;)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Num modelo de compartilhamento de tempo, o CPU separa um &lt;em&gt;quantum&lt;/em&gt; de tempo para cada processo. Por exemplo, 4 processos (A, B, C e D) executam de forma alternada a cada 4 nanosegundos. &lt;/li&gt;
&lt;li&gt;Quando o tempo do processo expira, o CPU faz a troca de contexto para outro processo.&lt;/li&gt;
&lt;li&gt;Nesse modelo, a troca de contexto acontece de uma forma tão rápida que dá a ilusão que os processos estão sendo executados de forma paralela. Dessa forma o usuário consegue interagir com os processos de forma separada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podemos então concluir que os processos estão sendo executados de forma concorrente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concorrência vs Paralelismo
&lt;/h2&gt;

&lt;p&gt;Baseado nos conceitos apresentados, vamos então montar uma tabela comparativa entre os dois:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Concorrência&lt;/th&gt;
&lt;th&gt;Paralelismo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Definição&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execução de vários processos em um único core usando compartilhamento de tempo (time slicing)&lt;/td&gt;
&lt;td&gt;Execução de múltiplos processos de forma simultânea usando múltiplos cores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Objetivo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simular paralelismo usando menos recurso de hardware&lt;/td&gt;
&lt;td&gt;Paralelismo  real e mais performático&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perspectiva&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Software Design&lt;/td&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Bom, é isso. Espero que tenha conseguido explicar da melhor forma esses conceitos  tão usados no mundo da programação.&lt;/p&gt;

&lt;p&gt;Até a próxima&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
