Il servizio che vi offriamo è gratuito tuttavia per noi ha un costo. Vi preghiamo di non bloccare le pubblicità presenti sulle nostre pagine, ci permettono di continuare ad esistere. Grazie.
  Iscriviti
Login 
Home F.A.Q. Staff Cerca Argomenti Attivi

Tutti gli orari sono UTC + 1 ora




New Topic Post Reply  [ 2 messaggi ] 
  Stampa pagina
Precedente | Successivo 
Autore Messaggio
Non connesso 
MessaggioInviato: 09 giu 2007 12:02 
Avatar utente
Paralizzato
Paralizzato

Iscritto il: 09 giu 2007 01:00
Messaggi: 1
Devo finire per l'8 luglio un progetto di dati e algoritmi 1 dell'università di Padova prof. Ferrari.
Devo implementare i metodi di un dizionario ordinato con un albero 234.
Ho già fatto quasi tutto mi manca di fare i metodi entries, findall, last, first, predecessor e successor che magari sono anche una cavolata ma non mi viene in mente niente su questi.
La classe di test, ora funziona non guardate quella del file è ancora vecchia.
Se qualcuno è così gentile da aiutarmi a finirla e a coreggerla dove è sbagliato, grazie.
La rappresentazone dell'albero deve essere parentetica identata cioè il metodo print deve mostrare l'albero con i suoi elementi dei nodi così, con spazi e parentesi.


Codice:

Classe tree234

import java.util.Iterator;
import java.util.Comparator;

public class Tree24<E extends OrderedDictionary,K,V extends Value> implements Tree<E>,Dictionary<K,V>{

 
 
  /**Costruttore principale*/
  public Tree24(){
     root=(Position24<E>)addRoot(null);
     size=0;   
  }
 
/** Restituisce il numero di elementi dell'albero
    @return int dimensione dell'albero*/
  public int size(){  return size;  }
 
  /** Informa se l'albero è vuoto
   @return true se l'labero è vuoto false altrimenti */
  public boolean isEmpty(){  return (size==0);  }
 
  /** Restituisce un iteratore di elementi immagazzinati nell'albero
   @return iteratore contenente gli elementi immagazzinati nell'albero */
  public Iterator<E> iterator(){ 
      PositionList<E> p=new NodePositionList<E>();
      iterator(root,p);   
     return p.iterator();   
  }
 
  private void iterator(Position24 v,PositionList<E> p){
        //caso base foglia
        if (v==null) return;
        //caso base nodo esterno
       E dict=(E)v.element();
        if(isExternal(v)){
          p.addLast(dict);
           return;
        }
        for(int i=0;i<dict.size();i++){
           Entry temp=dict.getEntry(i);
          iterator(dict.getChildAt(i),p);
       }
       p.addLast(dict);
  }
 
  /** Restituisce una collezzione iterabile dei nodi
   @return Iterable<Position<E>> collezzione iterabile dei nodi */
  public Iterable<Position<E>> positions(){
    PositionList<Position<E>> p=new NodePositionList<Position<E>>();
    positions(root,p);
    return p;
  }
 
  /** Crea un collezzione iterabile dei nodi */
  private void positions(Position24 v,PositionList<Position<E>> p){
     E dict=(E)v.element();
     //caso base foglia
     if (v==null) return;
     //caso base nodo esterno
     if(isExternal(v)){
       p.addLast(v);
       return;
     }
     for(int i=0;i<dict.size();i++){
        Entry temp=dict.getEntry(i);
       positions(dict.getChildAt(i),p);
    }
    p.addLast(v);
   }
 
 
  /** Modifica un elemento posizionato a un determinato nodo
   @param v nodo di cui si desidera modificare l'elemento
   @param E elemento da modificare
   @return E elemento modificato
   @exception InvalidPositionException se la posizione del nodo non è valida
*/
  public E replace(Position<E> v, E e)throws InvalidPositionException{
     Position24<E> temp=checkPosition(v);
     E t=temp.element();  //Dizionario precedente
     temp.setElement(e);
     return t;
  }
 
  /** Ritorna il nodo root dell'albero
   @return Position<E> nodo root dell'abero
   @exception EmptyTreeException se l'albero è vuoto
*/
  public Position<E> root() throws EmptyTreeException{
      if(root==null)
        throw new EmptyTreeException("Albero vuoto");
      return root; 
  }
     
  /** Ritorna il padre di un determinato nodo
   @param v nodo di cui si vuole conoscere il padre
   @return Position<E> posizione del nodo padre
   @exception InvalidPositionException se la posizione del nodo non è valida
*/
  public Position<E> parent(Position<E> v)
  throws InvalidPositionException, BoundaryViolationException{
     Position24<E> temp=checkPosition(v);
     return temp.getParent(); 
  }

/** Ritorna una collezzione iterabile di figli di un determinato nodo
  @param v posizione del nodo
  @return Iterable<Position<E> collezzione iterabile dei figli del nodo v
  @exception InvalidPositionException se la posizione del nodo non è valida
*/
  public Iterable<Position<E>> children(Position<E> v) throws InvalidPositionException{
     Position24 pos=checkPosition(v);
     PositionList<Position<E>> p=new NodePositionList<Position<E>>();
     E dict=(E)pos.element();
     for(int i=0;i<dict.size();i++)
        p.addLast(dict.getChildAt(i));
     return p;
  }
 
  /** Informa se il nodo è interno
   @param v nodo dell'albero
   @return true se il nodo ha dei figli false altrimenti
   @exception InvalidPositionException se la posizione del nodo non è valida
   */
  //E' internal se ha figli e quindi se il riferimento al primo figlio non è vuoto
  public boolean isInternal(Position<E> v) throws InvalidPositionException{ 
     Position24<E> temp=checkPosition(v);
     //So che l'elemento estratto è di tipo Value
     Value x=(Value)temp.element().getEntry(0).getValue();
     return (x.getChild()!=null); 
  }
 
  /** Informa se il nodo è esterno
   @param v nodo dell'albero
   @return true se il nodo non ha figli false altrimenti
   */
  public boolean isExternal(Position<E> v)
    throws InvalidPositionException{  return (!isInternal(v));    }
 
  /** Informa se un determinato nodo è il nodo root dell'albero
   @param v nodo dell'albero
   @return true se il nodo è il root dell'albero false altrimenti
   @exception InvalidPositionException se la posizione del nodo non è valida
   */
  public boolean isRoot(Position<E> v) throws InvalidPositionException{ 
     checkPosition(v);
     return (v==root());
   }
 
  /**Aggiunge una radice
   @param e elemento da inserire nel nodo
   @exception NonEmptyTreeException se la radice è già presente
   @return posizione della nuova radice creata
   */
  public Position<E> addRoot(E e) throws NonEmptyTreeException{
     if(!isEmpty())
        throw new NonEmptyTreeException("L'alberto ha già una radice");
    size=1;
    root=createNode(e,null);
    return root;
  }
 
  /**Crea un nuovo nodo
   @param element elemento del nodo
   @param posizone del padre
   @return Position24<E> posizione del nuovo nodo
   */
   //se non passo nulla come argomento o un dizionario vuoto inserisco un infinito come elemento
  public Position24<E> createNode(E element,Position24<E> parent){
      //Nodo vuoto
      E temp=element;
      if(element==null||temp.size()==0){
         if(element==null)
            temp=(E)new ArrayDictionary();
         //inserisco l'elemento con chiave infinita
         temp.insert(Integer.MAX_VALUE,new Value());
      }     
      return new Node24(temp,parent);
     
  }
 
  /**crea un nuovo nodo con padre settato a null
   @param element elemento da inserire nel nodo
   @return posizione del nuovo nodeo creato*/
  private Position24<E> createNode(E element){ 
      return createNode(element,null);
  }
 
  /**Converte un riferimento di Position in Position24
   @param v nodo da convertire
   @return Position24<E> posizione convertita del nodo
   @exception InvalidPositionException se v punta a null o non è di tipo Position24*/
  private Position24<E> checkPosition(Position<E> v) throws InvalidPositionException{
      if(v==null || !(v instanceof Position24))
        throw new InvalidPositionException("Posizione non valida");
     return (Position24<E>)v;
  }
 
  /** Ritorna una voce contente con la chiave indicata o null se la voce non esiste
   @param key chiva con cui effettuare la ricerca
   @return Entry<K,V> voce del dizionario con la data chiva o null se non l'ho trovata */
  public Entry<K,V> find(K key) throws InvalidKeyException{
       //chiamo un metodo ricorsivo
       return search(root(),key);
    }
   
/** metodo ricorsivo che trova la voce riferita alla chiave corrispondente */
  private Entry<K,V> search(Position<E> v,K key) throws InvalidKeyException{
     
    //converto in Position24
     v=checkPosition(v);
     //dizionario riferito al nodo
    OrderedDictionary dict=v.element();
    //cerco la chiave in tutto il nodo se la trovo restituisco la voce del dizionario
    Entry<K,V> x=dict.find(key);
    if(x!=null){
       currentPos=checkPosition(v);
       return x;
    }   
    //caso base nodo è una foglia
     if(isExternal(v)){
        currentPos=checkPosition(v);
        return null;     
    }
    //se non l'ho trovato cerco la chiave nel figlio del primo successore di k
    return search(dict.successorChild(key),key);   
  } 
 
  /** Inserisce una voce nell'albero
   @param key chiave della voce da inserire
   @param value valore della voce da inserire
   @return voce inserita nell'albero */
  public Entry<K,V> insert(K key, V value) throws InvalidKeyException{
     return insertTree(root,key,value);   
  }
 
   /** Inserisce un elemento nell'albero o l'elemento già inserito se è già presente un
    elemento con la stessa chiave
    @param node posizione del nodo su cui effettuare l'inserimento
    @param key chiave della voce
    @param value valore della voce
    @return Entry<K,V> voce inserita nell'albero
    @exception InvalidKeyException se la chiave non è valida*/
  private Entry<K,V> insertTree(Position<E> node,K key, V value) throws InvalidKeyException{
     
     Entry e=find(key);
     if(!isExternal(currentPos))
        return e;
     Position24<E> v=checkPosition(currentPos);
     e=new Entry24(key,new Value(value));
     OrderedDictionary dict=v.element();
     dict.insert(key,value);
     //controllo se c'è overflow: in caso affermativo esegui l'operazione di split
     if(dict.isFull())
        split(v);
     size++;
     return e;
  }
 
  /**Effettua l'operazione di split
   @param v posizione del nodo da splittare*/
  private void split(Position24<E> v){
     
     //Prendo l'elemento memerizzato precedentemente
     E oldDict=v.element();
     //Nuovi dizionari che saranno gli elementi dei nodi
     E dict1=(E)new ArrayDictionary();
     E dict2=(E)new ArrayDictionary();
     //creo i due nodi v1 e v2
     Position24<E> v1=createNode(dict1);
     Position24<E> v2=createNode(dict2);   
         
     //INSERIMENTO NEI FIGLI
     //Inserisci nel primo figlio
     dict1.insert(oldDict.getEntry(0));
     dict1.insert(oldDict.getEntry(1));
     
     //Inserisci nel secondo figlio
     dict2.insert(oldDict.getEntry(3));
           
     //INSERIMENTO NEL PADRE
     //setto nella voce corrispondente il riferimento al figlio
     Position24<E> parent=v.getParent();
   
     E parentDict;
     //caso base root
     if(parent==null){
       parentDict=(E)new ArrayDictionary();
        root=createNode(parentDict,null);
       v1.setParent(root);
        v2.setParent(root);
     }
     else{ //padre esistente
            parentDict=parent.element();
           v1.setParent(parent);
           v2.setParent(parent);
     }
   
      //Estrai l'elemento di mezzo dal dizionario del figlio
      Entry<K,V> middle=oldDict.getEntry(2);

     //Aggiorno i riferimenti dei figli ai due nuovi nodi creati
     oldDict.updateParentChild(0,v1);
     oldDict.updateParentChild(1,v1);
     oldDict.updateParentChild(2,v1);
     oldDict.updateParentChild(3,v2);
     oldDict.updateParentChild(4,v2);
          
     //SO CHE L'INFINITO E' L'ULTIMA VOCE DEL DIZIONARIO         
     //prendo l'infinito del primo nodo e gli salvo il riferimento di middle
     dict1.updateChild(dict1.size()-1,oldDict.getChildAt(2));
          
     /*setto il figlio riferito all'infinito del secondo creato con il figlio dell'infinito del nodo che
     vado a sostituire*/
     dict2.updateChild(dict2.size()-1,oldDict.getChildLast());
   
      //trova la posizione del i-esimo figlio
      int pos=parentDict.findPos(v);
       //Nel caso di root non trovo la posizione del vecchio nodo (ne è stato creato uno nuovo)
      if(pos==-1)
         pos=0;
      //inserisci l'elemento di mezzo nel padre
      parentDict.insert(middle);
      parentDict.updateChild(pos,v1);
      parentDict.updateChild(pos+1,v2);
      //controllo se devo effettuare lo split multiplo 
      if(parentDict.isFull())
         split(parent);
   }
/** Visualizza gli elementi dell'albero in ordine */
  public void print(){
     print(root);
  }
 
  /** Visualizza gli elementi dell'albero in ordine a partire dal nodo v
   @param v root del sottoalbero da visualizzare */
  private void print(Position<E> v){
   
     OrderedDictionary dict=v.element();
     //caso base foglia
     if (v==null) return;
     //caso base nodo esterno
     if(isExternal(v)){
        for(int i=0;i<dict.size()-1;i++)
           System.out.print(dict.getEntry(i)+" ");
        System.out.print("Infinito,[null]");
        System.out.println();
        return;
     }
     for(int i=0;i<dict.size();i++){
        Entry temp=dict.getEntry(i);
       print(dict.getChildAt(i));
       //visualizzazione di Infinito al posto di Integer.MAX_VALUE
       if(i==dict.size()-1)
          System.out.println("Infinito,[null]");
       else System.out.println(temp);
       
    }
  }       
    /** Returns an iterator containing all the entries containing the
   * given key, or an empty iterator if no such entries exist. */
//begin#fragment Dictionary
  public Iterable<Entry<K,V>> findAll(K key) throws InvalidKeyException{}
   
     /** Removes and returns the given entry from the dictionary. */
//begin#fragment Dictionary
  public Entry<K,V> remove(Entry<K,V> e) throws InvalidEntryException{}
//end#fragment Dictionary

  /** Returns an iterator containing all the entries in the dictionary. */
//begin#fragment Dictionary
  public Iterable<Entry<K,V>> entries(){}
     
      /** Ritorna la voce del dizionario con la chiave più piccola
    @return voce del dizionario con la chiave più piccola null se il dizionario è vuoto*/
   public Entry<K,V> first(){}
   
    /** Ritorna la voce del dizionario con la chiave più grande
    @return voce del dizionario con la chiave più grande null se il dizionario è vuoto*/
   public Entry<K,V> last(){}
   
         /** Ritorna la prima voce del dizionario successiva a key
    @param key chiave che permette di selezionario la prima voce del dizionario successiva
    @return voce del dizionario successiva a key o null se non c'è una voce
    successiva
    @exception InvalidKeyException se la chiave non è valida*/
   public Entry<K,V> successor(K key) throws InvalidKeyException{}
   
   
    /** Ritorna la voce del dizionario successiva a key
    @param key chiave che permette di selezionario la voce del dizionario successiva
    @return voce del dizionario successiva a key o null se non c'è una voce
    precedente
    @exception InvalidKeyException se la chiave non è valida*/
   public Entry<K,V> predecessor(K key) throws InvalidKeyException{}
   
    
  private Position24<E> currentPos; //utilizzo questa variabile per memorizzare il nodo nella ricerca
  private Position24<E> root;
  private int size;
  private Comparator<K> C;
}


Classe per i nodi dell'albero:

public interface OrderedDictionary<K,V> extends Dictionary<K,V>{
   /** Ritorna la voce del dizionario con la chiave più piccola
    @return voce del dizionario con la chiave più piccola null se il dizionario è vuoto*/
   public Entry<K,V> first();
   
   /** Ritorna la voce del dizionario con la chiave più grande
    @return voce del dizionario con la chiave più grande null se il dizionario è vuoto*/
   public Entry<K,V> last();
   
   /** Ritorna la prima voce del dizionario successiva a key
    @param key chiave che permette di selezionario la prima voce del dizionario successiva
    @return voce del dizionario successiva a key o null se non c'è una voce
    successiva
    @exception InvalidKeyException se la chiave non è valida*/
   public Entry<K,V> successor(K key) throws InvalidKeyException;
   
    /** Ritorna la voce del dizionario successiva a key
    @param key chiave che permette di selezionario la voce del dizionario successiva
    @return voce del dizionario successiva a key o null se non c'è una voce
    precedente
    @exception InvalidKeyException se la chiave non è valida*/
   public Entry<K,V> predecessor(K key) throws InvalidKeyException;
   
    /** Rimuovi l'ultima voce del dizionario */
    public void removeLast();
   
    /** Inserisci una voce nel dizionario
     @return voce nel dizionario inserita */
    public Entry<K,V> insert(Entry<K,V> e);
   
    /** Ritorna la chiave nella posizione specifica del dizionario
     @param i posizione dove estrarre la voce
     @return voce nel dizionario nella posizione selezionata */
    public Entry<K,V> getEntry(int i);
   
    /** Trova la posizione il numero del figlio v
     @param pos posizione del figlio
     @return int posizione del figlio se non l'ho trovato restituisce -1*/
    public int findPos(Position24 pos);
   
    /** Setta il padre del figlio riferito alla voce nella posizione pos
     @param pos posizione della voce del dizionario
     @param parent posizione del padre */
    public void updateParentChild(int pos,Position24 parent);
   
    /** Setta il figlio riferito alla voce del dizionario nella posizione pos
     @param pos posizione della voce del dizionario
     @param v posizione del figlio*/
    public void updateChild(int pos,Position24 v);
   
    /** Restituisce il figlio riferito alla voce del dizionario nella posizione pos
     @param pos posizione della voce nella quale cercare il figlio
     @return Position24 posizione del figlio */
    public Position24 getChildAt(int pos); 
   
    /** Restituisce il figlio riferito all'ultima voce del dizionario
     @return Position24 posizione del figlio all'ultima voce del dizionario*/
    public Position24 getChildLast();
   
    /** Restituisce il figlio della voce successore di quella con la chiave specificata
     @param key chiave della voce
     @return Position24 voce successore di quella con la chiave specificata
     @exception InvalidKeyException se la chiave non è valida*/
    public Position24 successorChild(K key) throws InvalidEntryException;
   
    /**controlla se il dizionario è pieno
     @return true se è pieno false altrimenti*/
    public boolean isFull();
   
}


Classe che implementa entry:

//V extends Value
  public class Entry24<K,V extends Value> implements Entry<K,V>{
      
       /**Costruttore principale*/
      public Entry24(K k,V v){
         key=k;
         value=v;   
      }
      /** Restituisce la chiave della voce
       *@return chiave della voce */
      public K getKey(){   return key; }
       /** Restituisce il valore della voce
        *@return valore della voce */
      public V getValue(){ return value; }
       public String toString() { return "("+key+","+value+")"; }
       private K key;
      private V value;
}

Classe che implementa Position:

//Interfaccia nodo dell'albero (2,4)
public interface Position24<E> extends Position<E>{
   /**Restituisce il padre del nodo
    *@return Position24 padre del nodo*/
   public Position24<E> getParent();
   /**setta il padre
    *@param padre del nodo*/
   public void setParent(Position24<E> par);
   /*Setta l'elemento (dizionario) nel nodo
    *@param e dizionario**/
   public void setElement(E e);
}

Classe node24:

//realizzazione del nodo il dizionario è l'elemento del nodo

public class Node24<E extends OrderedDictionary> implements Position24<E>{
   
   //costruttore principale
   public Node24(E elem,Position24<E> par){
        element=elem;
        parent=par;
   }
   
   public Node24(Position24<E> par){  this(null,par);  }
   
   public Node24(E e){  this(e,null);  }
   
   public Node24(){     this(null,null);   }
   /**Restituisce l'elemento del nodo
    *@return elemento del nodo*/
   public E element(){     return element;   }
   /*Setta l'elemento nel nodo
    *@param e dizionario**/
   public void setElement(E o){  element=o;   }
    /**Restituisce il padre del nodo
    *@return Position24 padre del nodo*/
   public Position24<E> getParent(){    return parent;   }
    /**setta il padre
    *@param padre del nodo*/
   public void setParent(Position24<E> v){      parent=v;   }
   
   private Position24<E> parent;
   private E element;
}

Classe mycomparator:

import java.util.Comparator;
import java.io.Serializable;

public class MyComparator<E>  implements Comparator<E>{
  //Se il secondo elemento è Integer.MAX_VALUE restuisci -1
  /**Esegue il confronto fra due oggetti
   *@return 1 se il 1° oggetto> 2° oggetto -1 se il 2° oggetto> 1° oggetto 0 se son uguali*/
  public int compare(E a, E b) throws ClassCastException {
    if(b instanceof Integer){
      int temp=(Integer)b;
      if(temp==Integer.MAX_VALUE)
         return -1;
    }
    return ((Comparable<E>) a).compareTo(b);
  }
   
}



Nel file rar ci sono tutte le altre classi con l'interfaccia commentate.
http://bettina86.altervista.org/progtree24.rar

Aiutatemi, grazie.


Top
 Profilo  
 
Non connesso 
 Oggetto del messaggio:
MessaggioInviato: 15 dic 2007 15:31 
Avatar utente
Paralizzato
Paralizzato

Iscritto il: 15 dic 2007 01:00
Messaggi: 1
Salve a tutti !
Sono nuovo di questa bella comunità :) !
Sono anche io un informatico e avendo dato uno sguardo al codice di bettina86 ho visto un riferimento alla classe NodePositionList che da poco ho studiato e di cui non riesco a pensare a che tipo di oggetto passare ai metodi addAfter() e addBefore() nella classe tester (o starter).
I metodi addAfter() e addBefore() necessitano di 2 parametri : un oggetto di tipo Position e un elemento(di qualsiasi tipo,ad esempio Object).
Ora dato che Position è un oggetto di un tipo Interfaccia che non può essere instanziato,ho pensato di instanziare un oggetto DNode,ma il problema sta qui, perchè DNode necessita di 2 parametri di tipo DNode per
il nodo precedente e successivo e un elemento(di qualsiasi tipo).
Come faccio ad usare quei metodi ?
Per essere più chiaro riporto alcuni frammenti di codice :

Codice:
public class DNode<E> implements Position<E>
{
  public DNode(DNode<E> newPrev, DNode<E> newNext, E elem)
  {
   prev = newPrev;
   next = newNext;
   element = elem;
  }
  ...
}



Codice:
public interface Position <E>
{
  E element();
}



Codice:
  public static void main(String[] args)
  {
    NodePositionList<Object> list = new NodePositionList<Object>();
    list.addFirst("A");   
    list.addAfter( ??, "B"); //I punti interrogativi significano che non so che parametro passare a questo metodo
    list.addBefore(??, "C");
  }



Qualcuno può aiutarmi gentilmente ?
Grazie in anticipo !


Top
 Profilo  
 
Cerca per:
Visualizza ultimi messaggi:  Ordina per  
New Topic Post Reply  [ 2 messaggi ] 

Tutti gli orari sono UTC + 1 ora


Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati
Vai a:  

Tutti i loghi e i marchi in questo sito sono proprietà dei rispettivi autori. I commenti sono proprietà dei rispettivi autori, tutto il resto © 2003-2010 by Hardware Tweakers
Powered by - Skin-Lab © Alpha Trion | Modded by Master of Mouse
Traduzione Italiana phpBB.it