题目
给定一个整数序列,存放在数组xs中,长度为n,请计算该序列的熵。熵的计算方法:对于一个长度为n的序列xs,它包含m+1种不同的取值,s0,s1,…,sm,这些取值对应的出现概率分别为p0,p1,…,pm,则这个序列的熵为H(X)=-(p0log2(p0) + p1log2(p1) + … + pm*log2(pm)),其中,某个取值出现的概率p的计算方法为:这个取值出现的次数/长度n。
double entropy(int[] xs) {
//遍历xs数组,把数值作为key,重复次数作为value,实例一个map
Map<Integer, Double> map=new LinkedHashMap<Integer, Double>();
int n = xs.length;
Double Sum = 0.00;
Double prob;
//计算每个数字出现的次数,Map长度是m+1
for (int i=0;i<n;i++){
//如果map中包含这个key,则key的值+1
if (map.containsKey(xs[i])){
map.put(xs[i],map.get(xs[i])+1);
}else{
map.put(xs[i],1.00);
}
}
//拿到map中所有key的集合,用于取值
Object[] keys = map.keySet().toArray();
//求熵
for (int p=0;p < map.size();p++ ){
//求P0 ~ Pm 每项概率
prob = map.get(keys[p])/n;
//做累加求熵
Sum += prob * Math.log(prob)/Math.log(2);
}
return Sum*-1;
}