Atividades em Análise de Algoritmos e C

1. Qual é o menor valor inteiro de n tal que um algoritmo cujo tempo de execução é 100n2 funciona mais rápido que um algoritmo cujo tempo de execução é 2n na mesma máquina? Implemente um algoritmo que imprima na tela a resposta correta.

#include 
#include 

int main(){
    int n;
    for(n = 1; n < 20; n++){
        if( (100 * n * n) < pow(2, n) ){
            printf("%s %d\n", "100*n^2 funciona mais rapido apartir de: ", n);
            break;
        }
    }
    return 0;
}

2. Supondo que estamos comparando implementações de ordenação por inserção e por intercalação na mesma máquina. Para entradas de tamanho n, a ordenação por inserção é executada em \(8n^2\) etapas, enquanto a ordenação por intercalação é executada em \(64n log_2 n\) etapas. A partir de qual valor inteiro de n a ordenação por intercalação supera a ordenação por inserção. Implemente um algoritmo que imprima a resposta correta na tela.

#include 
#include 

int main(){
    int n = 1;
    float a = 0, b = 1;
    while(n<50){ a = 8 * n * n; b = 64 * n * log2(n); printf("%f %f \n", a, b ); if(a>b&&n>1){
            printf("O algoritmo de itercalação vale a pena a partir de n = %d", n);
            break;
        }
        n++;
    }
    return 0;
}

How to fix permissions on globally installing npm packages on linux

Is common have packages that works globally, they make the work more easy in some ways, provide functionalities, et al..

The difference in npm packages that are installed globally and locally is that you will setup a package like a program avaliable by a CLI(Command Line Interface)¹, this require permissions to write in some directories that the npm normally don’t has.

When you try install some globally package(using the -g):

npm install -g <package>

You can face errors and warnings like this:

npm WARN checkPermissions Missing write access to /usr/lib/node_modules
npm ERR! path /usr/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/lib/node_modules'
npm ERR!  { [Error: EACCES: permission denied, access '/usr/lib/node_modules']
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, access \'/usr/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:

Continue lendo “How to fix permissions on globally installing npm packages on linux”

Exercício adivinhar um número com busca binária

Implementar um jogo “adivinha-número” utilizando busca binária:
Deve ser solicitado ao usuário que pense em um número entre 1 e 10000

O programa deve dar o primeiro palpite
– Se estiver errado, deve ser perguntado se o número é maior ou menor que um certo número
– O programa apresenta um novo palpite e assim por diante até que adivinha o número certo.
– O programa deve contar quantos palpites foram necessários para acertar o número

 

#include <stdio.h>
#include <math.h>

int guess(int i, int j){
    char r1, r2;
    int g = abs((i+j) / 2);
    printf("E o numero: %d ?(Y = Sim, N = Nao)\n", g);
    scanf(" %c", &r1);
    if(r1 == 'Y'){
        return g;
    }
    else{
        printf("O numero eh maior ou menor que %d ?(M = Maior, N = Menor)\n", g);
        scanf(" %c", &r2);
        if(r2 == 'M'){
            guess(g,j);
        }
        else{
            guess(i,g);
        }
    }
}
int main(){
    printf("Pense em um numero entre 1 e 10000.\n");
    guess(1,10001);
}

 

Challenge: Binary search(Khan Academy)

Solução para o problema de busca binária no Khan Academy:

/* Returns either the index of the location in the array,
  or -1 if the array did not contain the targetValue */
var doSearch = function(array, targetValue) {
    var min = 0;
    var max = array.length - 1;
    var guess, count = 0;
    while(min <= max){
        guess = Math.floor((min+max)/2);
        println(guess);
        count++;
        if(array[guess] === targetValue){ 
            println(count);
            return guess; 
        }
        else if(array[guess]<targetValue){
            min=guess+1;
        }
        else{ 
            max = guess-1;
        }
    }
    return -1;
};

var primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 
		41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97];

var result = doSearch(primes, 970);
println("Found prime at index " + result);
Program.assertEqual(doSearch(primes, 73), 20);
Program.assertEqual(doSearch(primes, 2), 0);
Program.assertEqual(doSearch(primes, 97), 24);

Definições/Glossário em Computação

Algoritmo:
Sequência finita de instruções, bem definidas que são “entendíveis” por um computador.

Análise assintótica:
Disciplina que busca o balanceamento entre corretude e eficiência em algoritmos.

Busca binária:
Algoritmo de busca eficiente para encontrar um elemento em um conjunto ordenado.

Corretude:

Complexidade:

Eficiência:
O quão eficiente o algoritmo resolve um problema, são critérios: tempo e recursos computacionais gastos(memória, processamento, etc).

Instância de um problema:
Subconjunto de um universo finito ou infinito de possibilidades de entrada para um algoritmo.
Em ordenação – Uma entrada de [A1..An] de um algoritmo de ordenação.

Pseudocódigo:
É uma solução intermediária para representar um algoritmo ele é usado porque: especificar um algoritmo em linguagem humana pode ser muito ou pouco verboroso, ambíguo e representar o algoritmo em linguagens de programação gera muitas instruções impostas pela linguagem utilizada, dessa forma existe um consenso para o uso na literatura.

Informações de um algoritmo:
Pior caso – Entrada n que gera maior esforço computacional;
Caso médio – Esforço gerado baseado na probabilidade de ocorrer problemas com a média de esforço de [A1..An] entradas;
Melhor caso – Entrada n que gera o menor esforço possível.

Medida empírica:

“Portugol”: Nome dado para um pseudocódigo escrito em português.

RSA:
Algoritmo de criptografia utilizado para sistemas de chaves assimétricas.

Instalando Julia 1.0.0 no Ubuntu 18.04

  1. Baixe os arquivos binários da Julia no site: https://julialang.org/downloads/ (Generic Linux Binaries for x86).
  2. Extraia o diretório do arquivo julia-1.0.0-linux-x86_XX.tar.gz baixado por exemplo:
    tar -vzxf julia-1.0.0-linux-x86_64.tar.gz
  3. Mova a pasta para algum diretório, eu recomendo /opt:
    sudo mv ~/Dowloads/julia-1.0.0 /opt
    sudo mv /opt/julia-1.0.0 /opt/julia
  4. Crie um link simbólico em alguma pasta presente em $PATH
    sudo ln -s /opt/julia/bin/julia /usr/local/bin/julia
    
  5. Abra um novo terminal e teste:
    julia -v
    julia