Problema complessità

di il
3 risposte

Problema complessità

Salve a tutti ho questo problema.
Devo simulare un server dove si connettono dei pc.Ogni pc contiene dei job e io devo stamparli in ordine e inoltre se il pc 1 stampa ad esempio il valore 3 lo devo cancellare dagli altri pc.Ho organizzato le strutture in questo modo.I pc sono una lista e ogni pc contiene un albero.Cosa faccio io
prendo la lista prima lista faccio la visita in order del suo albero e poi controllo se ogni singolo valore è contenuto in uno degli altri alberi.Il problema che questo è molto dispendioso sapete aiutarmi?dicendomi qualche modo per ottimizzare l'algoritmo ?

3 Risposte

  • Re: Problema complessità

    Non si capisce nulla!

    1) scrivi in Italiano, usando la grammatica e la punteggiatura! Espressioni sgrammaticate sono permesse solo se non sei italiano

    2) nella descrizione, separa il problema, dall'algoritmo e dalla sua implementazione

    3) descrivi il problema

    4) descrivi l'algoritmo usato per risolverlo (quello che hai descritto e' tutto meno che un algoritmo)

    5) descrivi l'implementazione che hai addottato

    6) descrivi i dubbi che hai su questa implementazione


    Hai scritto: i pc sono una lista (quindi un pc e' una lista) e subito dopo ogni pc contiene un albero.

    Ma allora il pc e' una lista o un albero? O una lista di alberi? O meglio, che cosa e' un pc (nel senso di struttura dati, evidentemente).

    Quanti pc hai modellato? Quanti job? (informazione utile, ma non necessaria)
    Perche' pc diversi possono avere lo stesso job? (informazione utile, ma non necessaria)
    Perche' devi rimuovere il job da tutti gli altri pc? (informazione utile, ma non necessaria)

    Poi mi sono perso ...


    1) di che valore stai parlando
    2) cosa rappresenta questo valore
    3) di che tipo e' (informazione non fondamentale)
    4) che cosa rappresenta questo albero?
    5) e' un albero ordinato o generico?

    Perche' dici che e' molto dispendioso?

    Fornisci un ordine di grandezza della complessita' computazionale, almeno a grandi linee (O[n], O[n^n], O[n^2], ...), spiegando perche', e quello che vorresti ottenere e perche'.


    Comunque:

    in generale le strutture dati si scelgono in base alle operazioni da fare e non vicevera.

    Questo implica conoscere le proprieta' delle diverse strutture dati (lista, mappa, set, albero, grafo, vettore, ...), e saper come utilizzarle per modellare il problema da risolvere.

    Altra considerazione: ci sono motivi per cui tu non possa fare una pre-analisi del tuo modello per raccogliere alcune informazioni (quali job si trovano su quali pc), da utilizzare quando un certo job termina su un certo pc?

    In questo modo, ad esempio, non ti servirebbe riscandire tutti i pc rimanenti per vedere se contengono quel job, ma tale informazione la potresti avere gia' disponibile in opportune strutture dati di supporto
  • Re: Problema complessità

    Riscrivo il problema allora:
    i miei pc sono realizzati in questo modo:
    
    struct job{
       struct job *left;
       struct job *right;
       int valore;
    };
    
    struct pc{
       int codice;
       int priorita;
       struct pc *next;
       struct pc *last;
       struct job *lavoro;
    };
    
    in parole povere sono liste di alberi.Quello che sto cercando di fare,è di stampare i job dei pc.Questi job sono dei valori che sono contenuti negli alberi di ogni singolo nodo della lista.Stampando i job dei pc, devo controllare che questi valori non siano contenuti nei job degli altri pc
    esempio:
    se il pc 1 ha come job 3 4 5 6 e il pc 2 ha come job 4 6 7 8 la stampa sarà: pc 1 3 4 5 6 il pc 2: stamperà 7 8
    l'algoritmo che mi fa questo lavoro è questo:
    
    struct job *elimina_job(struct job *radice, int x){
       if(radice != NULL){//se non e vuoto l'albero
       /*
          if(x < radice->valore)//scendi a sinistra
             radice->left = elimina_job(radice->left,x);
          else if(x > radice->valore)//scendi a destra
             radice->right = elimina_job(radice->right,x);  
       */
           radice->left=elimina_job(radice->left,x);
           if(radice->valore>x)
              return radice;
              else if(radice->valore == x){//elemento trovato
             struct job *nodo = (struct job *)malloc(sizeof(struct job));//crea un nodo d'appoggio
             nodo = radice; //appoggio
             if (nodo->right == NULL)//se ha solo il figlio sinistro
                radice = nodo->left;
             else if(nodo->left == NULL)//se ha solo il figlio destro
                radice = nodo->right;
             else{
                nodo = stacca_min(radice->right,radice);//assegna il minimo al nodo d'appoggio
                radice->valore = nodo->valore;//assegna il campo valore
             } 
             free(nodo);//libera spazio nodo d'appoggio
             }
             radice->right=elimina_job(radice->right,x);
       }        
       return radice;//ritorna la nuova radice
    } 
    
    struct pc *prova(struct pc *iniziale, int x){
       if (iniziale->next != NULL){//se il pc successivo esiste
          if(iniziale->lavoro != NULL){//se il pc ha dei job
             iniziale->lavoro = elimina_job(iniziale->lavoro, x);// elimina dall albero il job x 
             iniziale->next = prova(iniziale->next, x);
          }
       }
       else
          iniziale->lavoro = elimina_job(iniziale->lavoro, x);
       return iniziale;
    }
    
    
    struct pc * elimina_generale(struct job * radice, struct pc *iniziale){
       //visita inorder dell albero attuale usato per cancellare gli altri    
       if(radice != NULL){
          elimina_generale(radice->left,iniziale);
          if(iniziale->next != NULL)
             iniziale->next = prova(iniziale->next ,radice->valore);//elimina negli alberi successivi
          elimina_generale(radice->right, iniziale);
       }
       else
          if(iniziale->next != NULL)//se c'è il pc successivo 
             iniziale->next = elimina_generale(iniziale->next->lavoro,iniziale->next);
       return iniziale;
    } 
    
    Ho dimenticato di scrivere che per caricare i job negli alberi,ho usato la funzione srand che genera numeri a caso,ho scritto questi valori in un file e poi li ho letti caricandoli nell'albero.ogni albero ha circa 200 job e inizialmente l'algoritmo ha 5 pc
  • Re: Problema complessità

    Ragazzi ho provato a risolvere il problema in questo modo:
    Mi copio l'albero dei job del primo pc in una struttura di appoggio,siccome su di esso non dobbiamo fare niente. Dopodichè inizio a scorrermi gli alberi degli altri pc e se il job è presente eliminalo dal pc che sto visitando altrimenti lo inserisco nella struttura di appoggio.Questo procedimento lo faccio per tutti gli alberi ecco come ho implementato la cosa :
    
    struct job *crea_appoggio(struct job *iniziale,struct job *appoggio){
    if(iniziale!=NULL){
       appoggio=inserisci(appoggio,iniziale->valore);
       appoggio=crea_appoggio(iniziale->left,appoggio);
       appoggio=crea_appoggio(iniziale->right,appoggio);
    }
    return appoggio;
    }
    
    int cerca_jobpro(struct job * radice, int x,int i){// mi serve per cercare il valore se lo trova riporta 1 altrimenti 0
       if (radice == NULL)
          return 0;
       else if(radice->valore == x)
          return 1;
       else if(radice->valore > x)
           i=cerca_job(radice->left, x);
       else 
          i=cerca_job(radice->right, x);
    }
    
    struct pc *boh2(struct job *appoggio,struct pc *iniziale){//mi porto appoggio e la lista
       //int i;// mi serve per far il controlla se trova il valore o no
       int i;
       if (iniziale!=NULL){
          if(appoggio!=NULL){
             i=cerca_jobpro(iniziale->lavoro,appoggio->valore,i);// mi ritorna 0 o 1 
             if(i==0)
                appoggio=inserisci(appoggio,iniziale->lavoro->valore);//qua inserisce in appoggio
             else if(i==1)
                iniziale->lavoro=elimina_job(iniziale->lavoro,iniziale->lavoro->valore);//qua elimina invece
             iniziale=boh2(appoggio->left,iniziale);//visita normale dell'albero non ricordo come si chiama
             niziale=boh2(appoggio->right,iniziale);
          }
       }
       return iniziale;
    }    
          
       
    
    struct pc *boh(struct pc *iniziale,struct job *appoggio){// mi porto l'ablero di appoggio e iniziale
       if(iniziale!=NULL){// controllo ke la lista e il successivo siano diversi da null perkè se gli passo il successivo e non c'è va in segmentation fault            
          iniziale->next=boh2(appoggio,iniziale->next);//questa funzione mi scorre appoggio e cerca i valori nel nostro iniziale
          iniziale->next=boh(iniziale->next,appoggio);//questa rikiama se stessa sulla prossima lista
        }
        return iniziale;
    }
    
    scusate per il nome poco fantasioso delle funzioni.
    Il problema dell'algoritmo è questo:
    L algoritmo dovrebbe cancellare man mano che mi scorro gli alberi faccio un esempio
    Supponiamo di avere 3 pc e il primo pc ha : 2 3 4 5 6 come job il secondo :3 6 10 11 e il terzo 9 33 10 11dovrebbe stampare il primo albero normale il secondo invece dovrebbe cancellare solo il 3 e il 6 del primo albero ma invece mi cancella anche i nodi degli alberi successivi cioè il 10 e 11 del terzo albero.
    Qualcuno sa spiegarmi il perchè?
Devi accedere o registrarti per scrivere nel forum
3 risposte