cdere
08-05-2010, 15:13
Salve a tutti :)
Ho questo problemino... ho questo algoritmo di quicksort (che funziona e anche bene) perchè ordini un array di "tuple" (sostanzialmente una matrice) in base al nome della "colonna" (cioè in base ai valori che sono in 'attributo' che è la colonna di questa matrice non in base a tutti i valori)
vi posto la "matrice" (in realtà un'array di classe Tupla) e l'algoritmo:
data = new Tuple[14];
/* D1 */ data[0] = new Tuple( "Sunny","Hot","High","Weak","No" );
in corrispondenza di ogni valore di tupla chiaramente c'è un attributo, io con tale algoritmo ordino l'array in base all'attributo che voglio
void sort(Attribute attribute, int beginExampleIndex, int endExampleIndex){
quicksort(attribute, beginExampleIndex, endExampleIndex);
}
// scambio esempio i con esempio j
private void swap(int i,int j){
Object temp;
for (int k=0; k<getNumberOfExplanatoryAttributes()+1; k++){
temp = data[i].getValue(k);
data[i].setValue(k, data[j].getValue(k) );
data[j].setValue(k, temp);
}
}
/*
* Partiziona il vettore rispetto all'elemento x e restiutisce il punto di separazione
*/
private int partition(DiscreteAttribute attribute, int inf, int sup){
int i, j;
i=inf;
j=sup;
int med = (inf+sup)/2;
String x = (String)getExplanatoryValue(med, attribute.getIndex());
swap(inf, med);
while (true){
while(i<=sup && ((String)getExplanatoryValue(i, attribute.getIndex())).compareTo(x)<=0)
i++;
while(((String)getExplanatoryValue(j, attribute.getIndex())).compareTo(x)>0)
j--;
if(i<j)
swap(i,j);
else break;
}
swap(inf,j);
return j;
}
/*
* Algoritmo quicksort per l'ordinamento di un array di interi A
* usando come relazione d'ordine totale "<="
* @param A
*/
private void quicksort(Attribute attribute, int inf, int sup){
if(sup >= inf){
int pos;
pos = partition((DiscreteAttribute)attribute, inf, sup);
if ((pos-inf) < (sup-pos+1)) {
quicksort(attribute, inf, pos-1);
quicksort(attribute, pos+1, sup);
}
else
{
quicksort(attribute, pos+1, sup);
quicksort(attribute, inf, pos-1);
}
}
}
ok.. ora però mi sembra un po inutile reimplementare un algoritmo di sort.. quindi avevo pensato di utilizzare Arrays.sort (e implementare una delle 2 interfacce comparator o comparable)... solo che solo che... come faccio a "passargli" anche il nome dell'attributo per il quale deve ordinare i valori?
Grazie mille ragazzi!
siete grandi :)
Ho questo problemino... ho questo algoritmo di quicksort (che funziona e anche bene) perchè ordini un array di "tuple" (sostanzialmente una matrice) in base al nome della "colonna" (cioè in base ai valori che sono in 'attributo' che è la colonna di questa matrice non in base a tutti i valori)
vi posto la "matrice" (in realtà un'array di classe Tupla) e l'algoritmo:
data = new Tuple[14];
/* D1 */ data[0] = new Tuple( "Sunny","Hot","High","Weak","No" );
in corrispondenza di ogni valore di tupla chiaramente c'è un attributo, io con tale algoritmo ordino l'array in base all'attributo che voglio
void sort(Attribute attribute, int beginExampleIndex, int endExampleIndex){
quicksort(attribute, beginExampleIndex, endExampleIndex);
}
// scambio esempio i con esempio j
private void swap(int i,int j){
Object temp;
for (int k=0; k<getNumberOfExplanatoryAttributes()+1; k++){
temp = data[i].getValue(k);
data[i].setValue(k, data[j].getValue(k) );
data[j].setValue(k, temp);
}
}
/*
* Partiziona il vettore rispetto all'elemento x e restiutisce il punto di separazione
*/
private int partition(DiscreteAttribute attribute, int inf, int sup){
int i, j;
i=inf;
j=sup;
int med = (inf+sup)/2;
String x = (String)getExplanatoryValue(med, attribute.getIndex());
swap(inf, med);
while (true){
while(i<=sup && ((String)getExplanatoryValue(i, attribute.getIndex())).compareTo(x)<=0)
i++;
while(((String)getExplanatoryValue(j, attribute.getIndex())).compareTo(x)>0)
j--;
if(i<j)
swap(i,j);
else break;
}
swap(inf,j);
return j;
}
/*
* Algoritmo quicksort per l'ordinamento di un array di interi A
* usando come relazione d'ordine totale "<="
* @param A
*/
private void quicksort(Attribute attribute, int inf, int sup){
if(sup >= inf){
int pos;
pos = partition((DiscreteAttribute)attribute, inf, sup);
if ((pos-inf) < (sup-pos+1)) {
quicksort(attribute, inf, pos-1);
quicksort(attribute, pos+1, sup);
}
else
{
quicksort(attribute, pos+1, sup);
quicksort(attribute, inf, pos-1);
}
}
}
ok.. ora però mi sembra un po inutile reimplementare un algoritmo di sort.. quindi avevo pensato di utilizzare Arrays.sort (e implementare una delle 2 interfacce comparator o comparable)... solo che solo che... come faccio a "passargli" anche il nome dell'attributo per il quale deve ordinare i valori?
Grazie mille ragazzi!
siete grandi :)