Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C++] Min_heap

    Salve a tutti vorrei sapere come si implementa un min_heap in C++

    Grazie

  2. #2

  3. #3
    GRazie per il tuo aiuto
    ma mi servirebbe implementarlo tramite l'utilizzo degli array senza classi potreste dire come si fa

  4. #4
    ho provato ha impelntarlo nel seguente modo:

    hea.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[]);
    hea.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.cpp

    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_min ";
                  cout<<"\n digita 3 per SEARCH_min ";
                  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");	
      
      
    }
    nn mi da errori in fase di compilazione
    ma qnd mando in escuzione il programma e selezione uno dei test (per eseguirlo) nn riesco ad fare nulla pochè si kiude il programma (esce dal programma in esecuzione)

    nn capisco cm mai


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 © 2025 vBulletin Solutions, Inc. All rights reserved.