/*
* quantili.h
* sort_quantili
*
* Created by Claudio Sartori on Thu May 20 2004.
* Copyright (c) 2004 __University of Bologna__. All rights reserved.
*
*/
void quantili(coppia *c, // array di coppie <modalita,valore> ordinato per modalita'
int n, // numero di coppie
int NQ, // numero di quantili prodotto
int *e // etichette di quantili
);
/*
* quantili.c
* sort_quantili
*
* Created by Claudio Sartori on Thu May 20 2004.
* Copyright (c) 2004 __MyCompanyName__. All rights reserved.
*
* A partire da un array ordinato di n coppie <modalita,valore> produce un array
* di n etichette specificando per ogni coppia il relativo quantile
* devono essere definiti esternamente:
* coppia - struttura dati della coppia di valori, contenente l'attributo numerico "valore"
* NMAX - numero massimo di coppie
*
* Algoritmo:
* - calcola la frequenza relativa cumulata frc per ogni coppia, interpretando i valori come
* frequenze assolute
* - calcola l'ampiezza q di ciascun quantile
* - inizializza etichetta a 1
* - ripeti per ogni coppia i
* - finche' frc[i] e' maggiore del prodotto etichetta*q
* - incrementa etichetta (cambio quantile, ripetuto piu' volte nel caso di quantili vuoti)
* - attribuisci etichetta corrente alla coppia i
*
*/
#include "sort_quantili.h"
void quantili(coppia *c, // array di coppie <modalita,valore> ordinato per modalita'
int n, // numero di coppie
int NQ, // numero di quantili prodotto
int *e // etichette di quantili
){
double frc[NMAX], // frequenze relative cumulate
q, // ampiezza quantile
tot; // ausiliare per freq cumulata
int etichetta, i;
tot=0;
for (i=0;i<n;i++)
tot+=c[i].valore; // calcola totale rilevazioni
frc[0]=c[0].valore/tot;
for (i=1;i<n;i++)
frc[i]=frc[i-1]+c[i].valore/tot; // calcola cumulate
q=(double)1/NQ;
etichetta=1;
for (i=0;i<n;i++){
while (frc[i]>etichetta*q)
etichetta++;
e[i]=etichetta;
} // for
} // quantili - fine *************************************************************