Mulder90
19-05-2011, 22:05
Ciao a tutti!!! Sto scrivendo il progettino di "Algoritmi e strutture dati" e naturalmente i dubbi non mancano :D
Il progetto consiste nell'implementazione di un albero generico. Deve essere rappresentato tramite due strutture sequenziali: una memorizza i nodi dell'albero e un'altra invece memorizza i padri dei nodi.
Se il nodo occupa la posizione i-esima nella prima struttura, il padre deve occupare la posizione i-esima della seconda struttura.
Ad esempio: NODI = {a,c,h,b,x,g}, PADRI = {null, a,a,c,h,a}. a è la radice e non ha padre quindi nella seconda struttura il valore è null, c è figlio di a, ecc....
Devo assumere che l'inserimento avvenga in fondo alla struttura, i nodi siano tutti diversi e con informazione dello stesso tipo.
Dopo aver implementato la struttura dovrò implementare vari metodi per svariate operazioni.
Intanto posto il codice che ho scritto fin'ora e poi vi dico i miei dubbi ;)
P.S: sia chiaro che non voglio la soluzione!!!
Nodo.java:
import java.util.LinkedList;
public class NodoVP<T> {
private T info;
private NodoVP<T> padre;
private LinkedList<NodoVP<T>> figli;
public NodoVP(T data) {
info = data;
padre = null;
figli = new LinkedList<NodoVP<T>>();
}
public T getInfo() {
return info;
}
public void setInfo(T data) {
info = data;
}
public NodoVP<T> getPadre() {
return padre;
}
public void setPadre(NodoVP<T> u) {
padre = u;
}
public LinkedList<NodoVP<T>> getFigli() {
return figli;
}
public void setFiglio(NodoVP<T> x) {
figli.addLast(x);
}
}
Albero.java:
import java.util.ArrayList;
import java.util.Iterator;
public class AlberoVP<T> {
private ArrayList<NodoVP<T>> nodiAlbero;
private ArrayList<NodoVP<T>> padriNodi;
private int numNodi;
private NodoVP<T> radice;
public AlberoVP() {
radice = null;
numNodi = 0;
nodiAlbero = new ArrayList<NodoVP<T>>();
padriNodi = new ArrayList<NodoVP<T>>();
}
public NodoVP<T> setRadice(T data) throws Exception {
if (radice != null)
throw new Exception("Radice già presente");
else {
radice = new NodoVP<T>(data);
numNodi++;
getNodiAlbero().add(radice);
getPadriNodi().add(null);
return radice;
}
}
public NodoVP<T> inserisciNodo(T data, T valorePadre) {
int position = trovaNodo(valorePadre);
NodoVP<T> nodo = new NodoVP<T>(data);
nodo.setPadre(getNodiAlbero().get(position));
getNodiAlbero().get(position).setFiglio(nodo);
numNodi++;
getNodiAlbero().add(nodo);
getPadriNodi().add(nodo.getPadre());
return nodo;
}
private int trovaNodo(T valorePadre) {
int position = 0;
int i = 0;
while (i < getNodiAlbero().size()) {
if (getNodiAlbero().get(i).getInfo() == valorePadre) {
position = i;
return position;
} else
i++;
}
if (i == getNodiAlbero().size()) {
System.out.println("Il padre non esiste");
return -1;
}
return position;
}
public ArrayList<NodoVP<T>> getNodiAlbero() {
return nodiAlbero;
}
public ArrayList<NodoVP<T>> getPadriNodi() {
return padriNodi;
}
public NodoVP<T> getRadice() {
return radice;
}
public int getNumNodi() {
return numNodi;
}
public void stampaNodiAlbero() {
System.out.print("Nodi dell'albero: ");
Iterator<NodoVP<T>> it = nodiAlbero.iterator();
while (it.hasNext())
System.out.print(it.next().getInfo() + " ");
}
public void stampaPadriNodi() {
System.out.print("Padri dei nodi: ");
for (NodoVP<T> i : padriNodi) {
if (i != null)
System.out.print(i.getInfo() + " ");
else
System.out.print("null ");
}
}
public T getDataOfNodo(NodoVP<T> n) {
return n.getInfo();
}
public void setDataOfNodo(NodoVP<T> n, T data) {
n.setInfo(data);
}
}
Nel main costruisco un albero in questa maniera:
AlberoVP<Integer> albero = new AlberoVP<Integer>();
Setto la radice e inserisco i nodi in questa maniera:
albero.setRadice(19);
albero.inserisciNodo(12, 19);
albero.inserisciNodo(16, 19);
albero.inserisciNodo(23, 12);
albero.inserisciNodo(52, 16);
albero.inserisciNodo(2,16);
albero.inserisciNodo(31, 2);
Passiamo alle domande che mi "turbano":
1)La struttura di base è solida?
Questo dubbio mi viene poichè per inserire un nodo come figlio di un altro viene richiesto di sapere l'informazione e il nodo padre.
Invece l'unico modo in cui sono riuscito a fare l'inserimento di un figlio è stato quello di passare al metodo inserisciNodo l'informazione e il valore del nodo padre.
In questo modo posso inserire un nodo in questa maniera:
albero.inserisciNodo(12, 19);
dove 12 è l'informazione e 19 il valore del padre.
2) Per fare l'inserimento devo fare ogni volta una ricerca della posizione del padre nella struttura sequenziale(nel mio caso ArrayList). Tutto questo ha un costo particolarmente alto? Come potrei migliorare?
Per ora basta visto che ho fatto un post di 1 km!!! :D
Ringrazio anticipatamente quelli che avranno la voglia di leggere tutto!!!
P.S: il codice è scritto di fretta...se ci sono "orrori" mi scuso in anticipo...naturalmente non è la versione finale!
Il progetto consiste nell'implementazione di un albero generico. Deve essere rappresentato tramite due strutture sequenziali: una memorizza i nodi dell'albero e un'altra invece memorizza i padri dei nodi.
Se il nodo occupa la posizione i-esima nella prima struttura, il padre deve occupare la posizione i-esima della seconda struttura.
Ad esempio: NODI = {a,c,h,b,x,g}, PADRI = {null, a,a,c,h,a}. a è la radice e non ha padre quindi nella seconda struttura il valore è null, c è figlio di a, ecc....
Devo assumere che l'inserimento avvenga in fondo alla struttura, i nodi siano tutti diversi e con informazione dello stesso tipo.
Dopo aver implementato la struttura dovrò implementare vari metodi per svariate operazioni.
Intanto posto il codice che ho scritto fin'ora e poi vi dico i miei dubbi ;)
P.S: sia chiaro che non voglio la soluzione!!!
Nodo.java:
import java.util.LinkedList;
public class NodoVP<T> {
private T info;
private NodoVP<T> padre;
private LinkedList<NodoVP<T>> figli;
public NodoVP(T data) {
info = data;
padre = null;
figli = new LinkedList<NodoVP<T>>();
}
public T getInfo() {
return info;
}
public void setInfo(T data) {
info = data;
}
public NodoVP<T> getPadre() {
return padre;
}
public void setPadre(NodoVP<T> u) {
padre = u;
}
public LinkedList<NodoVP<T>> getFigli() {
return figli;
}
public void setFiglio(NodoVP<T> x) {
figli.addLast(x);
}
}
Albero.java:
import java.util.ArrayList;
import java.util.Iterator;
public class AlberoVP<T> {
private ArrayList<NodoVP<T>> nodiAlbero;
private ArrayList<NodoVP<T>> padriNodi;
private int numNodi;
private NodoVP<T> radice;
public AlberoVP() {
radice = null;
numNodi = 0;
nodiAlbero = new ArrayList<NodoVP<T>>();
padriNodi = new ArrayList<NodoVP<T>>();
}
public NodoVP<T> setRadice(T data) throws Exception {
if (radice != null)
throw new Exception("Radice già presente");
else {
radice = new NodoVP<T>(data);
numNodi++;
getNodiAlbero().add(radice);
getPadriNodi().add(null);
return radice;
}
}
public NodoVP<T> inserisciNodo(T data, T valorePadre) {
int position = trovaNodo(valorePadre);
NodoVP<T> nodo = new NodoVP<T>(data);
nodo.setPadre(getNodiAlbero().get(position));
getNodiAlbero().get(position).setFiglio(nodo);
numNodi++;
getNodiAlbero().add(nodo);
getPadriNodi().add(nodo.getPadre());
return nodo;
}
private int trovaNodo(T valorePadre) {
int position = 0;
int i = 0;
while (i < getNodiAlbero().size()) {
if (getNodiAlbero().get(i).getInfo() == valorePadre) {
position = i;
return position;
} else
i++;
}
if (i == getNodiAlbero().size()) {
System.out.println("Il padre non esiste");
return -1;
}
return position;
}
public ArrayList<NodoVP<T>> getNodiAlbero() {
return nodiAlbero;
}
public ArrayList<NodoVP<T>> getPadriNodi() {
return padriNodi;
}
public NodoVP<T> getRadice() {
return radice;
}
public int getNumNodi() {
return numNodi;
}
public void stampaNodiAlbero() {
System.out.print("Nodi dell'albero: ");
Iterator<NodoVP<T>> it = nodiAlbero.iterator();
while (it.hasNext())
System.out.print(it.next().getInfo() + " ");
}
public void stampaPadriNodi() {
System.out.print("Padri dei nodi: ");
for (NodoVP<T> i : padriNodi) {
if (i != null)
System.out.print(i.getInfo() + " ");
else
System.out.print("null ");
}
}
public T getDataOfNodo(NodoVP<T> n) {
return n.getInfo();
}
public void setDataOfNodo(NodoVP<T> n, T data) {
n.setInfo(data);
}
}
Nel main costruisco un albero in questa maniera:
AlberoVP<Integer> albero = new AlberoVP<Integer>();
Setto la radice e inserisco i nodi in questa maniera:
albero.setRadice(19);
albero.inserisciNodo(12, 19);
albero.inserisciNodo(16, 19);
albero.inserisciNodo(23, 12);
albero.inserisciNodo(52, 16);
albero.inserisciNodo(2,16);
albero.inserisciNodo(31, 2);
Passiamo alle domande che mi "turbano":
1)La struttura di base è solida?
Questo dubbio mi viene poichè per inserire un nodo come figlio di un altro viene richiesto di sapere l'informazione e il nodo padre.
Invece l'unico modo in cui sono riuscito a fare l'inserimento di un figlio è stato quello di passare al metodo inserisciNodo l'informazione e il valore del nodo padre.
In questo modo posso inserire un nodo in questa maniera:
albero.inserisciNodo(12, 19);
dove 12 è l'informazione e 19 il valore del padre.
2) Per fare l'inserimento devo fare ogni volta una ricerca della posizione del padre nella struttura sequenziale(nel mio caso ArrayList). Tutto questo ha un costo particolarmente alto? Come potrei migliorare?
Per ora basta visto che ho fatto un post di 1 km!!! :D
Ringrazio anticipatamente quelli che avranno la voglia di leggere tutto!!!
P.S: il codice è scritto di fretta...se ci sono "orrori" mi scuso in anticipo...naturalmente non è la versione finale!