Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071

    [C++] Heap Binario e Coda di priorità

    Ciao a tutti... non riesco a capire la differenza tra

    un Heap e un Heap Binario



    e la differenza tra

    una Coda e una Coda di priorità


    qualcuno può brevemente e teoricamente spiegare cosa sono o almeno dove posso trovare su internet le relative spiegazioni?

    Con l'implementazione del codice, una volta capita la differenza, non dovrei più avere problemi...

    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    118
    Un heap (o meglio d-heap) è una struttura dati che può risultare efficiente con alcuni algoritmi di ordinamento (HeapSort). Un heap binario è un heap con soli due figli (cioè un 2-heap). Tra l'altro un d-heap è una coda con priorità in quanto nella costruzione di un heap si mantiene nella radice sempre il minimo (o il massimo) e ogni nodo ha una chiave <= a quella dei figli (con il massimo si ha >=). In pratica una coda con priorità è una struttura dati che mantiene gli elementi con una priorità basata su una chiave che proviene da un insieme totalmente ordinato (altre code con priorità sono gli heap binomialie quelli di fibonacci che sono mooooolto efficienti in senso ammortizzato). Le code con priorità hanno un ruolo determinante per l'efficienza di alcuni algoritmi sui grafi.
    Una coda normale non ha nulla a che vedere con una coda con priorità, non è altro che una "serie" di elementi per cui gli inserimenti (push) avvengono da un lato e le eliminazioni (pop) avvengono dall'altro (questo modo di procedere si chiama FIFO (First In First Out). Tipo la coda che fai alla banca, gli utenti si inseriscono alla fine della fila e ne escono all'inizio.

  3. #3
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    quindi mi pare di aver capito che:

    un heap binario è come un albero binario (o E' un albero binario?)...

    Una coda con priorità, se ho capito bene, altro non è che una struttura dati logica che segue una determinata regola (come gli alberi ordinati?)

    Ma a questo punto mi sorge un altra domanda... che tipo di struttura è l'Heap?? gerarchica? lineare?

  4. #4
    Un heap binario è un albero binario in cui ogni nodo ha chiave maggiore(minore) di quelle dei suoi figli.

    La struttura dell'heap è gerarchica, essendo esso un albero binario. Ciò che può essere fuorviante è che tale struttura ad albero binario può essere memorizzata in un array A, in cui A[0] rappresenta la radice, e i generici figli del nodo in posizione i si trovano alle posizioni 2i+1 (figlio sinistro) e 2i+2 (figlio destro). Ciò è vero nel caso che il linguaggio che utilizzi faccia iniziare gli array dalla posizione 0 come il C o il Java.
    Nel caso gli array partano da 1, come in Pascal, le posizioni saranno 2i e 2i+1.

    Una coda a priorità indica invece un ordinamento tra un insieme di elementi, secondo la priorità di tali elementi.

    Va di suo che un heap è particolarmente efficace per realizzare una coda a priorità in quanto l'estrazione dall'insieme dell'elemento con priorità massima può essere fatto in tempo costante, in quanto nella radice dell'heap ci sarà sempre l'elemento con priorità massima.
    Mentre il ripristino della proprietà heap può essere fatta in tempo logaritmico.

    ciao ciao

  5. #5
    Utente di HTML.it L'avatar di Il Pazzo
    Registrato dal
    Jul 2004
    Messaggi
    1,071
    vi riingrazio... gentilissimi...e chiarissimi

    ciao

  6. #6
    Salve a tutti vorrei sapere come si implementa un min_heap in C++ io ho provato ma mi da eroore in fase di esecuzione mi serve poikè devo testare l'algoritmo mi serve il tempo di esecuzione
    questo è il codice in C++ ke ho scritto

    heap.h

    codice:
    
    
    typedef int A[];
    
    
    
    
    
    //length=(int)(sizeof(A[]);
    //size=length-1;
    
    
    int parent(int i);
    int left(int i);
    int right(int i);
    
    /*
    int PARENT(int i);
    int LEFT(int i);
    int RIGHT(int i);
    */
    void Scambia(int Heap, int ind1, int ind2);
    void MinHEAPIFY(int Heap, int i,int heapsize_A);
    int HEAP_estrai_min(int A[],int l);
    void min_heap_insert(int A[], int key,int heapsize_A);
    void Diminuisci_chiave(int A[],int i,int k);
    
    void Build_Min_HEAP(int A[],int l);
    int MINIMUM(int A[]);
    heap.cpp

    codice:
    #include "hea.h"
    #include <stdlib.h>
    #include <iostream>
    
    using namespace std;
    
    
    
    int NumElementi_Array(int A[]){
                    return (sizeof(A)/sizeof(A[0]));
                    }
    
    int NumElementi_Heap(int A[]){
        return NumElementi_Array( A) -1;
          }
    //cout<<"Numero di elementi dell'array: " NumElementi()); 
    int length_array(int A[]){
        NumElementi_Array( A);
    }
    
    int size_heap(int A[]){
        NumElementi_Heap( A);
    }
    
    int length(int A[]){
        return sizeof A;
        }
    
    int heapsize(int A[]){
        return length(A) - 1;
    }
     
    int length_A;
    int heapsiza_A;
    
    int parent(int i){ return i/2; }
    int left(int i){ return 2*i; }
    int right(int i){ return 2*i+1;}
    
    
    void scambia(int HEAP[], int ind1, int ind2){
    int appo;
    appo = HEAP[ind1];
    HEAP[ind1]=HEAP[ind2];
    HEAP[ind2]=appo;
    }
    
      
    
    void MinHEAPIFY(int HEAP[], int i,int heapsize_A){
          
      int smallest;
      int l = left(i);
      int r = right(i);
      if ((l <= heapsize_A) && (HEAP[l] < HEAP[i]))
          smallest = l;
      else
       smallest = i;
      if ((r <= heapsize_A) && (HEAP[r] < HEAP[smallest]))
            smallest = r;
      if (smallest != i) {
         scambia(HEAP,i,smallest);
         MinHEAPIFY(HEAP,smallest,heapsize_A);
       }
    }
    
    
    int HEAP_estrai_min(int A[],int l){
     int min;
     int length_A=l;
     int heapsize_A=length_A-1;
    if (heapsize_A < 1){
    		fprintf(stderr,"heap underflow\n");
    		exit(1);
    	}
            min = A[1];
            A[1] = A[heapsize_A];
        heapsize_A = (heapsize_A-1);
       // size_heap(A)=size;
         MinHEAPIFY(A, 1,heapsize_A);
        return min;        
    
    }
    
    
    
    void min_heap_insert(int A[], int key,int heapsize_A){
         //int length_A=l;
         //int heapsize_A=0;
         heapsize_A = (heapsize_A+1);
         //cout<< " heapsize : "<< length_A << " \n";
    	cout<< " heapsize : "<< heapsize_A << " \n";
    	system("PAUSE");
    	
    	//size_heap(A)=size;
    	A[(heapsize_A-1)]=INT_MAX;  
    	Diminuisci_chiave(A,heapsize_A-1, key);
    }
    
    
    int MINIMUM(int A[]) {
    return A[1];
    }
    
    void Diminuisci_chiave(int A[],int i,int k) {
     
     if(k > A[i]){
          fprintf(stderr, "la nuova chiave è più grande di quella corrente.\n");
    		exit(1);
    	}
    	A[i] = k;
     while ((i > 1) && (A[parent(i)] > A[i])){
      scambia (A,i,parent(i));
     i = parent(i);
      }
      //return i;
    }
    
    
    
    void Build_Min_HEAP(int A[],int l){
     int i;
     int length_A=l;
     int heapsize_A=length_A;
     //size=length_array(A);
    // size_heap(A)=size;
     for (i =(length_A/2);i>0;i--)
     cout<<"heapsize è: " << heapsize_A;
     system("PAUSE");
     MinHEAPIFY(A, i,heapsize_A);
    }
    
    void HEAP_SORT(int A[],int l) {
      int i;
      int length_A=l;
      int heapsize_A=length_A-1;
      Build_Min_HEAP(A,l);
       for(i=length_A;i>1;i--) {
       scambia(A,1,i);
       heapsize_A =( heapsize_A-1);
      // size_heap(A) = size;
       MinHEAPIFY(A,1,heapsize_A);
      }
    }
    main

    codice:
    #include "hea.h"
    #include <iostream>
    #include <stdlib.h>
    #include <ctime>
    #include <cstdlib>
    
    
    
    using namespace std;
    
    
    int main()
    {
        
               
               int* found=NULL;
               time_t t1,t2;
               clock_t clk1,clk2;
               double media=0;
               int dim;
               int l;
               int scelta;
               int k;
               int length_A,heapsize_A;
               
    
    
               do{
                  cout<<"\n SCEGLI LA FUNZIONE DI CUI VUOI TESTARE LA COMPLESSITA'";
                  cout<<"\n digita 1 per INSERT";
                  cout<<"\n digita 2 per SEARCH (ricorsiva)";
                  cout<<"\n digita 3 per SEARCH (iterativa)";
                  cout<<"\n digita 4 per uscire dal programma";
                  cout<<"\n ->";
                  cin>>scelta;
                  switch(scelta){
                        case 1:
                               cout<<"\n TEST INSERT";
                               cout<<"\n test di complessita' ";
                               cout<<"\n inserisci la dimensione dell'input ->";
                               cin>>l;
                                
                                length_A=l;
                                heapsize_A=length_A-1;
                                int H[length_A];
                               //Build_Min_HEAP( H);
                               media=0;
                               cout<<"\n";
                               for(int h=0;h<10;h++){
                                  //Crea il vettore di l elementi
                                  for (int i=0;i<l;i++){
                                                                               
                                      //x=new heap_element;
                                      //x->key=rand();
                                     
                                     
                                     H[i]=rand();
                                      cout<< " la nuova chiave : "<< H[i] << " \n";
                                     cout<< " la vecchia chiave : "<< H[i-1] << " \n";
                                      
                                       if(i==0) {
                                        clk1 = clock();
                                      }
                                    
                                      min_heap_insert(H, H[i],heapsize_A);
                                      
                                         }
                                 clk2 = clock();
                                
                                 
                                  cout<<"tempo della "<<h+1<<" prova: ";
                                  
                                  double tempo_trascorso = (double)(clk2-clk1)/CLOCKS_PER_SEC;
                                  
                                  cout<<tempo_trascorso;
                                  
                                  cout<<"\n";
                                 
                                                        
                                   media=media+tempo_trascorso;
                               }
                               
                               cout<<"\n media dei tempi -> "<<media/10<<"\n\n";
                               cout<<"\n\n";
                               
                               break;
                       case 2:
                               cout<<"\n TEST Build_min_heap";
                               cout<<"\n test di complessita' ";
                               cout<<"\n inserisci la dimensione dell'input ->";
                               cin>>l;
                              
                               
                                  length_A=l;
                                heapsize_A=length_A-1;
                                 H[length_A];    
                                       
                                  //Crea il vettore di l elementi
                                  for (int i=0;i<l;i++){
                                                                             
                                                                  
                                     H[i]=rand();
                                     cout<< " la nuova chiave : "<< H[i] << " \n";
                                     cout<< " la vecchia chiave : "<< H[i-1] << " \n";
                                     system("PAUSE");                                  
                                     
                                         }
                              // media=0;
                               cout<<"\n";
                            //   for(int h=0;h<10;h++){ 
                                        clk1 = clock();
                                      
                                       Build_Min_HEAP( H,l);
                                       //HEAP_SORT( H);
                                       clk2 = clock();
                                
                                 
                                 // cout<<"tempo della "<<h+1<<" prova: ";
                                   cout<<"tempo della  prova: ";
                                  double tempo_trascorso;
                                  tempo_trascorso = (double)(clk2-clk1)/CLOCKS_PER_SEC;
                                  
                                  cout<<tempo_trascorso;
                                
                                  cout<<"\n";
                                  
                                  
                                //   media=media+tempo_trascorso;
                              // }
                               
                               //cout<<"\n media dei tempi -> "<<media/10<<"\n\n";
                               cout<<"\n\n";
                               
                               break;
                               
                        case 3:
                               cout<<"\n TEST SEARCH_min";
                               cout<<"\n test di complessita' ";
                               cout<<"\n inserisci la dimensione dell'input ->";
                               cin>>l;
                               
                               length_A=l;
                                heapsize_A=length_A-1;
                                H[length_A];
                             
                                  //Crea il vettore di l elementi
                                  for (int i=0;i<l;i++){
                                      
                                      
                                     
                                     H[i]=rand();
                                   //     min_heap_insert(H, H->h[i].key);
                                      
                               }
                               Build_Min_HEAP( H,l);
                               
                                                         
                              
                               media=0;
                               for(int h=0;h<10;h++){
                                
                                       clk1 = clock();
                                      int min=MINIMUM(H);
                                       clk2 = clock();
                                       
                                  cout<<"tempo della "<<h+1<<" prova: ";
                                  
                                  double tempo_trascorso = (double)(clk2-clk1)/CLOCKS_PER_SEC;
                                  
                                  cout<<tempo_trascorso;
                                  cout<<"\n";
                                  media=media+tempo_trascorso;
                                                          
                               }
                               
                               cout<<"\n media dei tempi -> "<<media/10<<"\n\n";
                              
                               cout<<"\n\n";
                               break;
    
                        case 4:
                             
                               exit(0);
                               break;
                       
                  }
               }while((scelta>0)&&(scelta<5));
    
               cout<<"\n Errore di digitazione \n";
               
    	cout<<"\n\n\n\n\n";
    	system("PAUSE");	
      
      
    }
    potreste aiutarmi

    GRazie

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma perche' hai postato in coda ad un messaggio del 2006 ... ?

    Devi crearne uno nuovo e spiegare il tuo problema, indicando l'errore e dove si presenta ... altrimenti difficilmente avrai risposte ...

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301

    Moderazione

    Originariamente inviato da oregon
    Ma perche' hai postato in coda ad un messaggio del 2006 ... ?
    Devi crearne uno nuovo e spiegare il tuo problema, indicando l'errore e dove si presenta ... altrimenti difficilmente avrai risposte ...
    Concordo e chiudo.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    beh sicuramente hai sbagliato a richiamare la libreria creata da te se noti invece di aver scritto "heap.h" nel file main e nel file heap.cpp ha scritto "hea.h"

  10. #10
    la libreria ke ho crato si hiama "hea.h" è giusto
    l'errore nn lo da in compilazione ma in fase di esecuzione
    quando eseguo il progamma per fare i test ke sono nel main
    mica sapresti dirmi come si implementa un min_heap utilizzando gli array forse ho sbagliamo ha implementarlo in questo modo in c++

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.