View Single Post
Old 18-03-2004, 14:47   #4
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Mi sono messo nei tuoi panni e ho cercato una soluzione al problema. Non che non esistano fior fior di algoritmi per fare quello che ti hanno chiesto (pare sia un grande classico dell'informatica, con i suoi Bubble Sort, Quick sort ecc.) ma il problema è per chi, come me, di studi scientifici ne ha fatti ben pochi. Un conto è leggere l'algoritmo e tradurlo in codice, un altro è farlo su due piedi.

Da feticista, mi sono cronometrato. In 1 ora e 16 minuti ho prodotto un algoritmo non ricorsivo di rara inefficenza, che però ha il pregio di essere un parto dei due o tre neuroni che ancora rimangono attivi.

Il primo problema che ho affrontato è quello di trovare in un vettore di numeri il numero minore.

in pseudo-pseudo codice, la faccenda l'ho risolta così:

Codice:
intero X = vettore.primoElemento;
intero INDICE = 0;

ciclo:
  per ogni numero N nel vettore, a partire dal secondo:
  
    se X è maggiore di N  ->  INDICE = indice_di_N
fine ciclo.
dopo il ciclo, INDICE è diventato l'indice del numero più piccolo all'interno del vettore.

Con grande stupore di me stesso, ho scoperto che a questo punto i giochi erano già fatti.

Bastava rimuovere dal vettore originale il numero più piccolo ed infilarlo in coda ad un secondo vettore, che contenesse i numeri "ordinati": a questo punto infatti il vettore originale, avendo perso l'elemento più piccolo tra quelli contenuti, sarebbe stato già pronto per un nuovo passaggio alla ricerca del numero minore.

quindi, se N è il numero di elementi del vettore originale, l'algoritmo completo diventa

Codice:
vettore
cache

ciclo esterno da 0 a N:
  intero X = vettore(0);
  intero indice = 0;

  ciclo interno da J = 1 a J = vettore.dimensione:
    intero Y = vettore(J);
    se (X > Y) -> indice = J; X = Y;
  fine ciclo interno
  
  vettore.rimuovi(elemento_indice);
  cache.aggiungi(elemento_eliminato);
fine ciclo esterno.
In Java la cosa assume la seguente forma:

Codice:
Vector<Integer> vettore = //vettore con i numeri
Vector<Integer> cache = new Vector<Integer>();
int numLoops = vettore.size();
for(int loop = 0; loop < numLoops; loop++) {
	int size = vettore.size();
	int valore = vettore.get(0);
	int indiceMinore = 0;

	for(int i = 1; i < size; i++) {
		int valore2 = vettore.get(i);
		if(valore > valore2) {
			valore = valore2;
			indiceMinore = i;
		}
	}
	cache.add(vettore.remove(indiceMinore));
}
In VBasic sono certo che i vettori abbiano un comportamento analogo: in Java "get(int)" restituisce (ma non rimuove) il valore dell'elemento di indice "int", "remove(int)" restituisce e rimuove l'elemento di indice "int", "add(valore)" aggiunge in coda al vettore "valore".

Se cerchi in rete per "Bubble Sort" o "Quick Sort" trovi la soluzione "reale" al problema.

Ciao.
PGI è offline   Rispondi citando il messaggio o parte di esso