Média x Mediana

Média x MedianaCódigo ExemploDetalhes do códigoDiferença entre os cálculosMétodos de OrdenaçãoFunção qsortBubble Sort no ArduinoSobrecarga ComputacionalAnálise de complexidadeComparaçãoEstimativa da maior diferençaExemplo práticoOtimizaçãoImplementado QuicksortUsos


A diferença entre o valor médio (ou média) e a mediana está no modo como eles resumem um conjunto de dados:

Código Exemplo

Segue um exemplo de programa em C que gera números aleatórios, calcula a média e a mediana de um conjunto de dados:

Detalhes do código

  1. Geração de valores aleatórios: O programa usa a função rand() para gerar números entre 0 e 100.
  2. Média: A função calcular_media() soma todos os elementos e divide pelo número total de valores.
  3. Mediana: A função calcular_mediana() ordena os valores com qsort() e, dependendo se o tamanho do array é ímpar ou par, calcula o valor central.
  4. Saída: O programa imprime os valores gerados, a média e a mediana.

Diferença entre os cálculos

Métodos de Ordenação

Função qsort

A função qsort ("Quick Sort") já faz parte da biblioteca padrão do C (stdlib.h), então não é necessário implementar o código de ordenação manualmente. A função qsort() pode ser usada diretamente para ordenar arrays de maneira eficiente.

qsort:

No código anterior, foir importada a biblioteca stdlib.h, que contém a função qsort(). A função de comparação compare() já está escrita e fornecida no código. Essa função compara dois inteiros para que qsort() saiba como ordenar os elementos.

Outros métodos de ordenação podem ser usados como Método da Bolha ("Buble Sort") ou Método da Inserção.

Bubble Sort no Arduino

Se você está programando em C para Arduino, onde a função qsort() da biblioteca padrão não está disponível, será necessário implementar sua própria função de ordenação. A seguir, é apresentado um código que implementa as funções calcular_media e calcular_mediana, além de uma simples função de ordenação (bubble sort) necessário para calcular a mediana.

Aqui está o código modificado para Arduino:

Detalhes do código:

  1. Função calcular_media: Soma todos os valores do array e divide pelo número de elementos, retornando a média.

  2. Função calcular_mediana:

    • Usa o algoritmo bubble sort para ordenar os elementos do array. Este algoritmo é simples e fácil de implementar, embora não seja o mais eficiente.

    • Após a ordenação, verifica se o tamanho do array é par ou ímpar:

      • Se for par, calcula a média dos dois elementos centrais.
      • Se for ímpar, retorna o valor central.
  3. Geração de números aleatórios: A função randomSeed(analogRead(0)) usa a leitura de um pino analógico para inicializar a semente do gerador de números aleatórios. Os valores são gerados com random(0, 101) e variam de 0 a 100.

  4. Saída: O programa imprime os valores gerados, a média e a mediana no monitor serial.

Esse código pode ser carregado diretamente no Arduino usando a IDE. No loop principal (loop()), não há necessidade de ação contínua, pois todo o trabalho é feito no setup().

Sobrecarga Computacional

Calcular a mediana geralmente envolve uma sobrecarga computacional maior que calcular a média, principalmente porque a mediana exige que os dados sejam ordenados, enquanto a média pode ser calculada diretamente com uma única passagem pelos dados.

Análise de complexidade

  1. Calcular a média:

    • Para calcular a média, você percorre o array uma única vez, somando os elementos.
    • Complexidade: , onde é o número de elementos. Ou seja, a operação é linear no tamanho do array.
  2. Calcular a mediana:

    • O cálculo da mediana requer que os dados sejam ordenados. No caso do bubble sort que implementamos, a ordenação tem complexidade .
    • Após ordenar, a mediana é obtida diretamente no valor central, o que é uma operação .
    • Complexidade total: com o algoritmo de ordenação escolhido (bubble sort).

Acompanhe no gráfico abaixo:

complexidade_media_mediana.png

Comparação

Estimativa da maior diferença

Para estimar a maior diferença possível, consideremos o tempo de execução em função do número de elementos .

Se usarmos uma proporção entre as duas complexidades, podemos dizer que para grandes valores de , o tempo necessário para calcular a mediana será aproximadamente proporcional ao quadrado do tempo para calcular a média.

Exemplo prático

Em termos de fator de diferença:

Portanto, a maior diferença possível entre o tempo de cálculo da mediana e da média será proporcional ao número de elementos (n). Isso significa que se você tem 1000 elementos, o cálculo da mediana pode ser até 1000 vezes mais lento do que o cálculo da média, dependendo do algoritmo de ordenação usado.

Otimização

Caso a sobrecarga computacional para o cálculo da mediana seja uma preocupação, você pode usar algoritmos de ordenação mais eficientes, como o quicksort ou o heapsort, que têm complexidade , reduzindo o fator de diferença para algo entre O e . Isso ainda será mais lento que a média, mas muito mais eficiente que o bubble sort.

tempo_processamento_media_buble_quick_sort.png

Implementado Quicksort

O método quicksort é um algoritmo de ordenação eficiente que usa a técnica de divisão para conquistar ("divide to conquer"). Aqui está um exemplo de implementação do quicksort em C, que pode ser utilizado para ordenar um array de inteiros:

Detalhes do código:

  1. Função troca: Troca dois elementos usando ponteiros.

  2. Função particionar:

    • Escolhe o último elemento do array como pivô.
    • Percorre o array, movendo elementos menores ou iguais ao pivô para a esquerda.
    • Coloca o pivô em sua posição correta e retorna seu índice.
  3. Função quicksort:

    • Chama recursivamente o quicksort nas duas metades do array, separadas pelo índice do pivô.
  4. Função imprimirArray: Imprime os elementos do array.

  5. Função main:

    • Define um array de inteiros, calcula seu tamanho e imprime o array original.
    • Chama a função quicksort para ordenar o array.
    • Imprime o array ordenado.

Usos

Você pode compilar e executar esse código em qualquer ambiente C. O quicksort é geralmente mais eficiente do que o bubble sort e tem um desempenho médio de , tornando-o uma escolha adequada para ordenar dados de maneira eficiente. Se precisar de mais alguma informação ou ajuda, é só avisar!

 


🌊 Fernando Passold 📬 ,