Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 06-11-2006, 17:27   #1
aduri
Member
 
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
(JAVA) Raddoppio e dimezzamento array

Salve a tutti sto cercando di analizzare questo codice sulla gestione degli array circolari.
Nel caso in cui isFull() e' true cioe' l'array e' pieno si raddoppia la dimensione dell'array e viceversa se
gli elementi dell'array si riducono oltre la meta' della dimensione originale si deve dimezzare.
Non mi e' chiara l'implementazione di quest'ultimo metodo.

In particolare:
if (( elem<size/4) && (elem>=s_size/4))

Purtroppo non ho modo (lavorando) di avere chiarimenti dal prof e mercoledi' ho l'esame qualcuno, cortesemente, puo' darmi una dritta?
allego gli stralci di codice dalle dispense:

Grazie.


Codice:
public void enqueue(Object el) {
if (isFull())
doubleQueue();
protected void doubleQueue(){
Object[] newdata = new Object[2*size];
for(int i=first, j=0; j<size; j++, i++,i=i%size){
newdata[j] = data[i];
}
first=0;
last=size-1;
size=2*size;
data=newdata;
}


public Object dequeue() {
int elem;
if (first<=last)
elem=last-first+1;
else
elem=size-first+last+1;
if (( elem<size/4) && (elem>=s_size/4))
halfQueue(elem);
…

protected void halfQueue(int elem){
Object[] newdata = new Object[size/2];
for(int i=first, j=0; j<elem; j++,
i++,i=i%size ){
newdata[j] = data[i];
}
first=0;
last=elem-1;
size=size/2;
data=newdata;
}
aduri è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2006, 18:45   #2
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
dove è definito s_size?
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD
ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2006, 18:55   #3
aduri
Member
 
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
Nella dispensa il prof dice che il nuovo campo s_size memorizza la dimensione iniziale della coda, quindi e' inizializzato nel costruttore.
aduri è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2006, 21:56   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Non ho certo l'autorevolezza e probabilmente neppure la competenza per criticare quel codice ma non mi stupisce che si possano avere delle difficoltà a comprendere perchè funzioni. Se il Lombroso fosse stato programmatore avrebbe certamente detto che questo:

for(int i=first, j=0; j<size; j++, i++,i=i%size)

è il segnale di una recondita pericolosità sociale. Non riesco francamente a capire il perchè di quel /4. Ci vuole anche parecchia fantasia a capire cosa sia elem.

Posso darti una versione che a me appare più comprensibile della faccenda coda, realizzata con un array, trattato come un anello per garantire una complessità costante all'inserimento e all'estrazione. E' possibile che questo ti aiuti a comprendere il significato del codice che hai.

Codice:
public class ArrayQueue {
	/* Array degli elementi */
	private Object[] array;
	
	/* Dimensione originale dell'array */
	private int dimensioneOriginale;
	
	/* Numero totale di elementi nella coda, può essere minore
	del numero totale di spazi disponibili nell'array */
	private int numeroTotaleElementi;
	
	/* Se il numero totale di elementi nella coda è maggiore di
	zero allora il componente array[indiceDiEstrazione] è quello
	che deve essere restituito come risposta ad una richiesta
	dequeue() */
	private int indiceDiEstrazione;
	
	/* L'elemento accodato con l'invocazione di enqueue(e) finisce
	nell'array in posizione indiceDiInserimento (array[indiceDiInserimento]) */
	private int indiceDiInserimento;
	
	/** Crea un ArrayQueue con un numero iniziale di celle
	disponibili pari a dimensioneIniziale. */
	public ArrayQueue(int dimensioneIniziale) {
		array = new Object[dimensioneIniziale];
		dimensioneOriginale = dimensioneIniziale;
	}
	
	/** Accoda l'oggetto o */
	public void enqueue(Object o) {
		
		/* poichè indiceDiInserimento tiene traccia della
		posizione in cui deve essere inserito un nuovo
		elemento, l'assegnamento seguente coincide con
		l'accodamento */
		array[indiceDiInserimento] = o;
		
		/* dopo aver accodato l'elemento, ArrayQueue
		aumenta di uno il numero dei componenti che
		contiene (è stato aggiunto un elemento) e
		"sposta avanti di uno" l'indice della cella in
		cui dovrà essere inserito un nuovo elemento... */
		incrementaDimensioneECalcolaIndiceDiInserimento();
	}
	
	/* Estrae un valore dalla coda o null se la coda sia vuota */
	public Object dequeue() {
		Object valore = null;
		
		/* Se la coda ha almento un elemento... altrimenti non
		c'è un bel null da restituire */
		if(numeroTotaleElementi > 0) {
			
			/* Be', avendo stabilito che se la coda non è vuota
			indiceDiEstrazione punta sempre alla cella che contiene
			l'elemento da estrarre, valore è chiaramente... */
			valore = array[indiceDiEstrazione];
			
			/* Questo è superfluo e si può togliere ma aiuta
			a visualizzare il contenuto della coda che si modifica
			quando si usi il metodo dump() */
			array[indiceDiEstrazione] = null;
			
			/* Ha tolto un elemento dalla coda: a questo punto
			deve stabilire quale sia il prossimo elemento da
			restituire, nel caso di un nuovo dequeue(). Certamente
			la coda ha un elmento in meno (decrementaDimensioneE...) */
			decrementaDimensioneECalcolaIndiceDiEstrazione();
		}
		return valore;
	}
	
	/** true se la coda è zeppa */
	private boolean èPiena() {
		
		/* la coda è piena se il numero totale di elementi, che è
		aumentato o diminuito ad ogni inserimento o estrazione, è
		pari al numero di componenti dell'array */
		return numeroTotaleElementi == array.length;
	}
	
	/** Stampa su System.out il contenuto delle celle dell'array
	su cui si basa questa coda, l'indice di inserimento (la cella
	che sarà occupata in caso di nuovo enqueue), l'indice di
	estrazione (la cella che sarà svuotata in caso di nuovo dequeue)
	e il numero totale di elementi contenuti nella coda */
	public void dump() {
		System.out.println("Indice di estrazione: " + indiceDiEstrazione);
		System.out.println("IndiceDiInserimento: " + indiceDiInserimento);
		System.out.println("Numero totale di elementi: " + numeroTotaleElementi);
		for(int i = 0; i < array.length; i++) {
			System.out.println(i+": "+array[i]);
		}
	}
	
	/** E' stato tolto un elemento dalla coda. Questo metodo diminuisce di uno
	il numero di elementi contenuti nella coda e calcola il prossimo indice
	di estrazione per un futuro dequeue */
	private void decrementaDimensioneECalcolaIndiceDiEstrazione() {
		
		/* Nella coda c'è un elemento in meno */
		numeroTotaleElementi--;
		
		/* Gli elementi vengono estratti a partire dalla testa. L'indice
		del prossimo elemento da rimuovere è quello della cella che succede
		al vecchio indice di estrazione (si va dalla testa alla coda) */
		indiceDiEstrazione++;
		
		/* Se l'indice di estrazione così calcolato risulta essere pari
		al numero di componente dell'array allora questo indice è un po'
		troppo in là. Poichè trattiamo l'array come un anello, il prossimo
		indice di estrazione diventa zero (abbia fatto un giro) */
		if(indiceDiEstrazione == array.length) {
			indiceDiEstrazione = 0;
		}
		
		/* Abbiamo tolto un elementi. Il numero di elementi rimasti è abbastanza
		basso da giustificare un dimezzamento delle dimensioni dell'array? Si se:
		il numero totale di elementi è meno della metà delle dimensioni dell'array.
		Commentata c'è una condizione ulteriore il cui scopo ideale sarebbe quello
		non dimezzare la coda a meno della dimensione originariamente imposta. Senza
		quella condizione, nel caso di estrazione, l'array è ridotto fino ad assumere
		una dimensione pari a uno nel caso in cui non ci siano elementi nella coda */
		if(numeroTotaleElementi < array.length / 2 /*&& array.length > dimensioneOriginale*/) {
			dimezzaArray();
		}
	}
	
	/* Riduce le dimensione dell'array a metà di quelle attuali */
	private void dimezzaArray() {
		
		/* Crea un array di dimensioni pari alla metà di quello
		corrente */
		Object[] arrayDimezzato = new Object[array.length / 2];
		
		/* copia il contenuto della coda in arrayDimezzato */
		copiaContenutoCoda(arrayDimezzato);
		
		/* arrayDimezzato sostituisce il vecchio array */
		array = arrayDimezzato;
		
		/* poichè il contenuto della coda è stato infilato in
		arrayDimezzato a partire dall'indice zero, il nuovo
		indice del primo elemento della coda è zero. */
		indiceDiEstrazione = 0;
		
		/* L'indice	della prima cella libera è pari a 
		numeroTotaleElementi perchè il numero di elementi copiati
		in arrayDimezzato è numeroTotaleElementi - 1 */
		indiceDiInserimento =  numeroTotaleElementi;
	}
	
	/** Aumenta di uno il numero totale di elementi contenuti nella
	coda e sposta avanti di una cella il punto in cui dovrà essere
	accodato un nuovo elemento */
	private void incrementaDimensioneECalcolaIndiceDiInserimento() {
		
		/* nella coda c'è un elemento in più...*/
		numeroTotaleElementi++;
		
		/* prima dell'invocazione di questo metodo è stato
		inserito un nuovo elemento. Il vecchio indice di inserimento
		non è più valido (c'è stato buttato dentro un elemento):
		incrementa l'indice di inserimento in modo tale che un
		nuovo accodamento avvenga nella cella successiva a quella
		appena riempita */
		indiceDiInserimento++;
		
		/* se l'array è pieno allora lo raddoppia */
		if(èPiena()) {
			raddoppiaArray();
		}
		
		/* se l'indice di inserimento è uguale al numero di componenti
		che possono essere infilati nell'array, allora, trattando
		l'array come un anello, l'indice della prossima cella
		libera è zero */
		if(indiceDiInserimento == array.length) {
			indiceDiInserimento = 0;
		}
	}
	
	/* Raddoppia le dimensioni di array */
	private void raddoppiaArray() {
		
		/* Crea un array che possa ricevere il doppio di componenti
		di quello attualmente usato */
		Object[] arrayRaddoppiato = new Object[array.length * 2];
		
		/* copia il contenuto della coda in arrayRaddoppiato */
		copiaContenutoCoda(arrayRaddoppiato);
		
		/* il "vecchio array" diventa il "nuovo e più grosso" arrayRaddoppiato */
		array = arrayRaddoppiato;
		
		/* Avendo copiato in arrayRaddoppiato tutti gli elementi della coda,
		destinandoli in successione dalla cella zero alla cella numeroTotaleElementi - 1,
		l'indice di estrazione, cioè il primo elemento della coda, è zero...*/
		indiceDiEstrazione = 0;
		
		/* e la prima posizione libera è pari al numeroTotaleElementi che, per
		il vecchio array, era anche il primo indice che sforava la dimensione
		massima ma, per il nuovo, è un indice perfettamente valido */
		indiceDiInserimento = numeroTotaleElementi;
	}
	
	/* Copia in destinazione il contenuto della coda. L'array
	destinazione è riempito a partire dalla cella zero fino
	a quante celle è necessario siano riempite (numeroTotaleElementi - 1)
	con gli elementi della coda, dal primo (indiceDiEstrazione)
	all'ultimo (indiceDiInserimento - 1) */
	private void copiaContenutoCoda(Object[] destinazione) {
		
		/* La copia riempie le celle di destinazione da zero a
		numeroTotaleElementi - 1. I valori da copiare partono da
		indiceDiEstrazione (primo elemento della coda) e
		arrivano... fin dove arrivano. Tanto sappiamo quanti
		sono. */
		int indiceDiCopia = indiceDiEstrazione;
		
		/* Copia da array ad destinazione un numero di elementi
		pari al numero di elementi contenuti nella coda */
		for(int i = 0; i < numeroTotaleElementi; i++) {
			destinazione[i] = array[indiceDiCopia];
			indiceDiCopia++; //il prossimo elemento nella coda
			if(indiceDiCopia == array.length) {
				
				/* Se risulta che il prossimo elemento va oltre
				la capacità di array allora, trattando array come
				un anello, il prossimo elemento è quello in posizione
				zero */
				indiceDiCopia = 0;
			}
		}
	}
}
Un "Main espresso" per "vedere le cose in funzione":

Codice:
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) {
		ArrayQueue q;
		try {
			q = new ArrayQueue(Integer.parseInt(args[0]));
		} catch(Throwable t) {
			System.out.println("Uso: java Main numeroIntero");
			System.out.println("Il numero intero indica la dimensione iniziale della coda");
			System.out.println("Esempio: java Main 10");
			return;
		}
		System.out.println("e = enqueue(new Date())");
		System.out.println("d = dequeue()");
		System.out.println("p = dump()");
		System.out.println("quit = exit");
		System.out.println("Esempio: eep, due enqueue seguiti da un dump");
		System.out.println("Esempio: dpep, un dequeue, un dump, un enqueue, un dump");
		System.out.println("Buon divertimento (quit e invio per uscire)");
		Scanner in = new Scanner(System.in);
		String line;
		while(!(line = in.nextLine()).equals("quit")) {
			for(int i = 0; i < line.length(); i++) {
				char c = line.charAt(i);
				if(c == 'e') {
					q.enqueue(new Date());
				} else if(c == 'd') {
					q.dequeue();
				} else if(c == 'p') {
					System.out.println();
					q.dump();
					System.out.println();
				}
			}
		}
	}
}
In bocca al lupo.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2006, 21:59   #5
leox@mitoalfaromeo
Senior Member
 
L'Avatar di leox@mitoalfaromeo
 
Iscritto dal: Dec 2005
Città: Ahimè..Bs ----------------------------------- Messaggi tot: 1000+
Messaggi: 772
boh: controlla che siano meno di size/4 perchè in tal modo saranno meno della metà del nuovo vettore creato.
contemporaneamente devono essere più di un quarto del vettore originale...
forse è un modo per evitare di dividere a metà più di una volta la dimensione del vett originale...

@pgi elem è il numero di elementi attuali. in un vettore circolare o sono compresi tra il primo e l'ultimo o sono da 0 a last e da first a .length(), da cui quelle formulette..
__________________
11/2006-Inspiron6400 -t7200|2GB@533MHz|S-ATA 80gb@7200rpm|Ati X1400|9cell Battery||garanzia 3 anni On-Site NBD
ex: Toshiba M30-154 (PERCHE' NON COMPRARE TOSHIBA..LEGGI QUI) + P4 2.8@3,2GHz 1MB L2, Gigabyte 915p-duo,1GB DDR400 DualCh, gF 6600gt 128MB GDDR3 + Canon Ixus50 + Creative Muvo^2 1.5GB

Ultima modifica di leox@mitoalfaromeo : 06-11-2006 alle 22:01.
leox@mitoalfaromeo è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2006, 22:02   #6
aduri
Member
 
Iscritto dal: Nov 2005
Città: Genova
Messaggi: 75
Grazie e.... crepi il lupo.
aduri è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Avio si prepara ai test del Dimostratore...
Space Pioneer ha annunciato le cause del...
Anthropic avrebbe nuovi antibiotici cont...
Scoperto un 'moltiplicatore nascosto' ne...
DREO: a IFA 2026 4 novità fra cui...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
NVIDIA App aggiunge una delle funzioni p...
Come sarebbe il mondo se la luce viaggia...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:58.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v