-
Notifications
You must be signed in to change notification settings - Fork 0
/
shannon.c
40 lines (36 loc) · 1.2 KB
/
shannon.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "shannon.h"
/*!
* \brief Recebe uma string e a base do logaritmo para devolver um real que corresponde à Entropia de Shannon dessa string.
* \param char * StringEntrada : Uma string de tamanho e conteúdo variável.
* \param int Base : Um inteiro positivo que servirá como base do logaritmo para o cálculo da Entropia de Shannon da string.
* \return long double Soma: Um long double que representa a Entropia de Shannon da string de parâmetro.
*/
long double ep3CalculaEntropiaShannon(char * StringEntrada, int Base){
// Declaração de variáveis
long double * Freq; // Vetor contador das frequências de cada caracter ASCII
Freq = (long double *) malloc (128*sizeof(long double));
long double Tam = strlen(StringEntrada);
long double Soma = 0;
long double Prob = 0;
// Laço da contagem de frequências
for(int i = 0; i < Tam; i++){
unsigned char Valor = StringEntrada[i];
Freq[Valor]++;
}
// Cálculo da Entropia
for(int j = 0; j < 128; j++){
if( Freq[j] > 0 ){
Prob = Freq[j]/Tam;
Soma = Soma + Prob * (log(Prob) / log(Base));
}
}
if( Soma == 0){
return Soma;
}
Soma = - Soma;
return Soma;
}