/* * 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 *************************************************************