Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-09-2008, 16:53   #1
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
[C++] Heap

Salve ragazzi,

ho implementato in c++ un heap utilizzato prima come algoritmo di orinamento ( heapsort) e poi stavo implementanto le procedure per renderlo coda di priorità.

In effetti ho implementato
Codice:
void max_heapify(int A[], int heap_size, int i);
void build_max_heap(int A[],int heap_size);
void heap_sort(int A[], int heap_size);
int heap_maximum(int A[]);
int heap_extract_max(int A[], int &heap_size);
void heap_increase_key(int A[],int i, int key);
void max_heap_insert(int A[],int &heap_size, int key);
il problema o meglio l'errore logico che incontro è quando chiamo la procedura
max_heap_insert
Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1 ;
	A[++heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}
che chiama la procedura heap_increase_key che funziona correttamente

Codice:
void heap_increase_key(int A[],int i, int key)
{
	if( key < A[i] )
	{
		cerr << "La nuova chiave è più piccola di quella corrente" << endl;
		return;
	}

	A[i] = key;

	while( (i > 1) && (A[parent(i)] < A[i] ) )
	{
		swap(A[i],A[parent(i)]);
		i = parent(i);
	}

}
Allora io creo un array con numeri casuali
applico build_max_heap(A,heap_size);
e quindi costruisco l'heap

a(1) a(2) a(3) (a4) ...... a(n)

poi applico max_heap_insert(A,heap_size,101);

e giustamente l'output desiderato deve essere questo

a(1)=101 a(2) a(3) (a4) ...... a(n)...a(n+1)=numero che è sceso nella foglia e che soddisfi ancora le proprietà dell'heap

invece l'output che ottengo è:

a(1)=101 a(2) a(3) (a4) ...... a(n)...a(n+1)=-858993460 a(n+2)= numero che è sceso nella foglia e che soddisfi ancora le proprietà dell'heap

c'è qualcuno che gentilmente potrebbe dare un occhiata e potrebbe aiutarmi a trovare quest'errore logico. grazie mille

saluti
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 13:01   #2
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da robs05 Guarda i messaggi
Salve ragazzi,
...
il problema o meglio l'errore logico che incontro è quando chiamo la procedura
max_heap_insert
Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1 ;
	A[++heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}
...
Ciao,

incrementi due volte heap_size. Prova così:

Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	A[++heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}
o così:

Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1;
	A[heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}
o così:

Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size += 1;
	A[heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}

Ultima modifica di Vincenzo1968 : 21-09-2008 alle 13:11.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 14:16   #3
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ciao

in effetti il codice che dava l'errore è proprio questo
Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1;
	A[heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}

è stato un errore di copia nel thread

effettuando varie prove prima con il postincremento e poi con il preincremento ho dimenticato di aggiornare il codice alla versione originale che mi dava l'errore, ti ringrazio cmq ma mi sa che si dovrà sbattere ancora un pò la testa
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 14:18   #4
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ciao

in effetti il codice che dava l'errore è proprio questo
Codice:
void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1;
	A[heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}

è stato un errore di copia nel thread

effettuando varie prove prima con il postincremento e poi con il preincremento ho dimenticato di aggiornare il codice alla versione originale che mi dava l'errore, ti ringrazio cmq ma mi sa che si dovrà sbattere ancora un pò la testa
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 15:26   #5
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
A questo punto l'errore dovrebbe trovarsi un qualche altro punto del codice. Così com'è, la funzione è implementata come consiglia il Cormen. È un problema, per te, postare l'intero codice?

Ciao
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 17:23   #6
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
no nessun problema, solo che adesso su questo calcolatore non ho il codice a disposizione...appena possibile lo posto
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 19:23   #7
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ecco il codice:

questo è il file header function.h

Codice:
void print_array(int a[], int heap_size);
void copia_array( int a[], int b[], int heap_size);
void carica_array(int a[], int heap_size);
void swap(int &a, int &b);

int parent(int i);
int left( int i );
int right( int i );

void max_heapify(int A[], int &heap_size, int i);
void build_max_heap(int A[],int &heap_size);
void heap_sort(int A[], int heap_size);
int heap_maximum(int A[]);
int heap_extract_max(int A[], int &heap_size);
void heap_increase_key(int A[],int i, int key);
void max_heap_insert(int A[],int &heap_size, int key);


void max_heap_test(int A[], int heap_size);
questo è il file function.cpp

Codice:
#include <iostream>
using namespace std;


#include "function.h"


int heap_maximum(int A[])
{
	return A[1];
}

int heap_extract_max(int A[], int &heap_size)
{
	int max;
	if (heap_size < 1)
	{
		cerr << "Underflow dell'heap";
		return 0;
	}

	max = A[1];
	A[1]=A[heap_size - 1];
	heap_size--;
	
	max_heapify(A,heap_size,1);
	return max;
}


void heap_increase_key(int A[],int i, int key)
{
	if( key < A[i] )
	{
		cerr << "La nuova chiave e' piu' piccola di quella corrente" << endl;
		return;
	}

	A[i] = key;

	while( (i > 1) && (A[parent(i)] < A[i] ) )
	{
		swap(A[i],A[parent(i)]);
		i = parent(i);
	}

}


void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1 ;
	A[heap_size] = -10000;
	heap_increase_key(A,heap_size,key);
}

void max_heapify(int A[], int &heap_size, int i)
{
	int l = left(i);
	int r = right(i);
	int massimo;

	if( l <= heap_size  &&  A[l] > A[i] )
		massimo = l;
	else
		massimo = i;

	if( r <=heap_size  &&  A[r] > A[massimo])
		massimo = r;

	if( massimo != i )
	{
		swap(A[i],A[massimo]);
		max_heapify(A,heap_size,massimo);
	}
}


void build_max_heap(int A[],int &heap_size)
{
	for(int i = (heap_size-1)/2; i > 0; i-- )
		max_heapify(A,heap_size,i);
}

void heap_sort(int A[], int heap_size)
{
	int size_heap = heap_size - 1;
	build_max_heap(A,heap_size);

	for( int i = heap_size - 1; i >= 2 ; i-- )
	{
		swap(A[1],A[i]);
		size_heap = size_heap - 1;
		max_heapify(A,size_heap,1);
	}
}



void max_heap_test(int A[], int heap_size)
{
	int test = 1;
	for(int i = 2; i < heap_size; i++ )
	      if (A[parent(i)] >= A[i])
			  test++;
	if( test == heap_size-1 )  
		cout << "OK-> L' array e' un max heap" << endl;
	else
		cout << "NO-> L'array non e' un max heap" << endl;



}



void swap(int &a, int &b)
{
	int tmp = a;
	a = b;
	b = tmp;
}


void carica_array(int a[], int heap_size)
{
	for(int i = 1; i < heap_size; i++)
		a[i] = rand()%100;
}


void copia_array( int a[], int b[], int heap_size)
{
	for(int i = 1; i < heap_size; i++)
		b[i] = a[i];
	
}
void print_array(int a[], int heap_size)
{
	for(int i = 1; i < heap_size ; i++)
	{
		if( (i != 0) && (i%20) == 0 ){ cout << endl; }
		cout << a[ i ] << " ";
	}
	cout << endl;

}


int parent(int i)
{
	return i/2;	
}

int left( int i )
{
	return 2*i;
}

int right( int i )
{
	return 2*i + 1;
}
questo è il main main.cpp

Codice:
#include <iostream>
using namespace std;
#include <time.h>
#include "function.h"

const int array_size = 100;



int main()
{
	srand(time(NULL));
	int heap_size = 11;


	int A[array_size];

	carica_array(A,heap_size);
	cout << "\nArray generico.... " << endl;
	print_array(A,heap_size);
	//coustrisci max-heap
	build_max_heap(A,heap_size);
	//heap_sort(A,heap_size);
	cout << "\nHeap ...." << endl;
	print_array(A,heap_size);
	cout << "\nheap size --> " << heap_size << endl;
	//cout << heap_maximum(A) << endl;
	//cout << heap_extract_max(A,heap_size) << endl;
	//heap_increase_key(A,10,10);
	cout << "\nInserisco elemento 101" << endl;
	max_heap_insert(A,heap_size,101);

	//max_heap_insert(A,heap_size,102);
	//max_heap_insert(A,heap_size,103);
	cout << "\nheap size --> " << heap_size << endl;

	cout << "\nA[11] =  " << A[11] << endl;
	cout << "\nA[12] =  " << A[12] << endl;

	print_array(A,heap_size);





	max_heap_test(A,heap_size);


	return 0;
}
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 21-09-2008, 22:28   #8
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Nel Cormen gli esempi sono fatti su array in base 1. Bisogna adattarli agli array del C/C++ che sono invece in base 0.
Per esempio, le funzioni parent, left e right diventano:

Codice:
int parent(int i)
{
	return i/(2+1);	
}

int left( int i )
{
	return 2*i + 1;
}

int right( int i )
{
	return 2*i + 2;
}

File funzioni.cpp:
Codice:
#include <iostream>
using namespace std;

#include "function.h"

int heap_maximum(int A[])
{
	return A[0];
}

int heap_extract_max(int A[], int &heap_size)
{
	int max;
	if (heap_size < 1)
	{
		cerr << "Underflow dell'heap";
		return 0;
	}

	max = A[0];
	A[0]=A[heap_size - 1];
	heap_size--;
	
	max_heapify(A,heap_size,0);
	return max;
}

void heap_increase_key(int A[],int i, int key)
{
	if( key < A[i] )
	{
		cerr << "La nuova chiave e' piu' piccola di quella corrente" << endl;
		return;
	}

	A[i] = key;

	while( (i > 0) && (A[parent(i)] < A[i] ) )
	{
		swap(A[i],A[parent(i)]);
		i = parent(i);
	}

}

void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1;
	A[heap_size - 1] = -10000;
	heap_increase_key(A,heap_size-1,key);
}

void max_heapify(int A[], int &heap_size, int i)
{
	int l = left(i);
	int r = right(i);
	int massimo;

	if( l < heap_size  &&  A[l] > A[i] )
		massimo = l;
	else
		massimo = i;

	if( r < heap_size  &&  A[r] > A[massimo])
		massimo = r;

	if( massimo != i )
	{
		swap(A[i],A[massimo]);
		max_heapify(A,heap_size,massimo);
	}
}

void build_max_heap(int A[],int &heap_size)
{
	for(int i = heap_size/2; i >= 0; i-- )
		max_heapify(A,heap_size,i);
}

void heap_sort(int A[], int heap_size)
{
	build_max_heap(A, heap_size);

	for( int i = heap_size - 1; i >= 1 ; i-- )
	{
		swap(A[0], A[i]);
		heap_size = heap_size - 1;
		max_heapify(A, heap_size, 0);
	}
}

void max_heap_test(int A[], int heap_size)
{
	int test = 0;
	for(int i = 1; i < heap_size; i++ )
	      if (A[parent(i)] >= A[i])
			  test++;
	if( test == heap_size-1 )  
		cout << "OK-> L' array e' un max heap" << endl;
	else
		cout << "NO-> L'array non e' un max heap" << endl;
}

void swap(int &a, int &b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

void carica_array(int a[], int heap_size)
{
	for(int i = 0; i < heap_size; i++)
		a[i] = rand()%100;
}

void copia_array( int a[], int b[], int heap_size)
{
	for(int i = 0; i < heap_size; i++)
		b[i] = a[i];
	
}
void print_array(int a[], int heap_size)
{
	for(int i = 0; i < heap_size; i++)
	{
		if( (i != 0) && (i%20) == 0 ){ cout << endl; }
		cout << a[ i ] << " ";
	}
	cout << endl;
}

int parent(int i)
{
	return i/(2+1);	
}

int left( int i )
{
	return 2*i + 1;
}

int right( int i )
{
	return 2*i + 2;
}
File main.cpp:
Codice:
#include <iostream>
using namespace std;
#include <time.h>
#include "function.h"

const int array_size = 100;

int main()
{
	srand(time(NULL));
	int heap_size = 11;

	int A[array_size];

	carica_array(A,heap_size);
	cout << "\nArray generico.... " << endl;
	print_array(A,heap_size);

	//coustrisci max-heap
	build_max_heap(A,heap_size);
	//heap_sort(A,heap_size);
	cout << "\nHeap ...." << endl;
	print_array(A,heap_size);
	cout << "\nheap size --> " << heap_size << endl;
	cout << "heap maximum -> " << heap_maximum(A) << endl;
	//cout << heap_extract_max(A,heap_size) << endl;
	//heap_increase_key(A,10,10);
	cout << "\nInserisco elemento 101" << endl;
	max_heap_insert(A,heap_size,101);

	//max_heap_insert(A,heap_size,102);
	//max_heap_insert(A,heap_size,103);
	cout << "\nheap size --> " << heap_size << endl;
	cout << "heap maximum -> " << heap_maximum(A) << endl;

	cout << "\nA[0] =  " << A[0] << endl;

	cout << "\nA[" << heap_size - 2 << "] =  " << A[heap_size - 2] << endl;
	cout << "\nA[" << heap_size - 1 << "] =  " << A[heap_size - 1] << endl;

	cout << endl;

	print_array(A,heap_size);

	max_heap_test(A,heap_size);

	return 0;
}

Ultima modifica di Vincenzo1968 : 21-09-2008 alle 23:39.
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 01:46   #9
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Ho dato un'occhiata alle varie implementazioni sul web e ho visto che è conveniente mantenere gli array con indici in base 1:

File function.h:
Codice:
#ifndef HEAP_H
#define HEAP_H

void print_array(int a[], int heap_size);
void copia_array( int a[], int b[], int heap_size);
void carica_array(int a[], int heap_size);
void swap(int &a, int &b);

int parent(int i);
int left(int i);
int right(int i);

void max_heapify(int A[], int heap_size, int i);
void build_max_heap(int A[],int heap_size);
void heap_sort(int A[], int heap_size);
int heap_maximum(int A[]);
int heap_extract_max(int A[], int &heap_size);
void heap_increase_key(int A[],int i, int key);
void max_heap_insert(int A[],int &heap_size, int key);

void max_heap_test(int A[], int heap_size);

#endif // HEAP_H

File function.cpp:
Codice:
#include <iostream>
using namespace std;

#include "function.h"

int heap_maximum(int A[])
{
	return A[1];
}

int heap_extract_max(int A[], int &heap_size)
{
	int max;
	if (heap_size < 1)
	{
		cerr << "Underflow dell'heap";
		return 0;
	}

	max = A[1];
	A[1] = A[heap_size];
	heap_size--;
	
	max_heapify(A, heap_size, 1);

	return max;
}

void heap_increase_key(int A[], int i, int key)
{
	if( key < A[i] )
	{
		cerr << "La nuova chiave e' piu' piccola di quella corrente" << endl;
		return;
	}

	A[i] = key;

	while( (i > 1) && (A[parent(i)] < A[i] ) )
	{
		swap(A[i], A[parent(i)]);
		i = parent(i);
	}
}

void max_heap_insert(int A[],int &heap_size, int key)
{
	heap_size = heap_size + 1;
	A[heap_size] = -10000;
	heap_increase_key(A, heap_size, key);
}

void max_heapify(int A[], int heap_size, int i)
{
	int l = left(i);
	int r = right(i);
	int massimo;

	if( l <= heap_size  &&  A[l] > A[i] )
		massimo = l;
	else
		massimo = i;

	if( r <= heap_size  &&  A[r] > A[massimo])
		massimo = r;

	if( massimo != i )
	{
		swap(A[i], A[massimo]);
		max_heapify(A, heap_size, massimo);
	}
}

void build_max_heap(int A[], int heap_size)
{
	for(int i = heap_size/2; i >= 1; i-- )
		max_heapify(A, heap_size, i);
}

void heap_sort(int A[], int heap_size)
{
	build_max_heap(A, heap_size);

	for( int i = heap_size; i >= 2 ; i-- )
	{
		swap(A[1], A[i]);
		heap_size = heap_size - 1;
		max_heapify(A, heap_size, 1);
	}
}

void max_heap_test(int A[], int heap_size)
{
	int test = 0;
	for(int i = 1; i <= heap_size; i++ )
	      if (A[parent(i)] >= A[i])
			  test++;
	if( test == heap_size )  
		cout << "OK-> L' array e' un max heap" << endl;
	else
		cout << "NO-> L'array non e' un max heap" << endl;
}

void swap(int &a, int &b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

void carica_array(int a[], int heap_size)
{
	for(int i = 1; i <= heap_size; i++)
		a[i] = rand()%100;

	/*
	a[1] = 4;
	a[2] = 1;
	a[3] = 3;
	a[4] = 2;
	a[5] = 16;
	a[6] = 9;
	a[7] = 10;
	a[8] = 14;
	a[9] = 8;
	a[10] = 7;
	*/
}

void copia_array( int a[], int b[], int heap_size)
{
	for(int i = 1; i <= heap_size; i++)
		b[i] = a[i];
	
}
void print_array(int a[], int heap_size)
{
	for(int i = 1; i <= heap_size; i++)
	{
		if( (i != 0) && (i%20) == 0 ){ cout << endl; }
		cout << a[ i ] << " ";
	}
	cout << endl;
}

int parent(int i)
{
	return i/2;	
}

int left( int i )
{
	return 2*i;
}

int right( int i )
{
	return 2*i + 1;
}
File main.cpp:
Codice:
#include <iostream>
using namespace std;
#include <time.h>
#include "function.h"

const int array_size = 100;

int main()
{
	srand(time(NULL));
	int heap_size = 10;

	int A[array_size];

	carica_array(A,heap_size);
	cout << "\nArray generico.... " << endl;
	print_array(A,heap_size);

	//coustrisci max-heap
	build_max_heap(A,heap_size);
	//heap_sort(A,heap_size);
	cout << "\nHeap ...." << endl;
	print_array(A,heap_size);


	int x = 5;
	cout << endl;
	cout << "parent(" << x << ") -> " << parent(x) << endl;


	cout << "\nheap size --> " << heap_size << endl;
	cout << "heap maximum -> " << heap_maximum(A) << endl;
	//cout << heap_extract_max(A,heap_size) << endl;
	//heap_increase_key(A,10,10);
	cout << "\nInserisco elemento 101" << endl;
	max_heap_insert(A,heap_size,101);

	//max_heap_insert(A,heap_size,102);
	//max_heap_insert(A,heap_size,103);
	cout << "\nheap size --> " << heap_size << endl;
	cout << "heap maximum -> " << heap_maximum(A) << endl;

	cout << "\nA[0] =  " << A[0] << endl;

	cout << "\nA[" << heap_size - 2 << "] =  " << A[heap_size - 2] << endl;
	cout << "\nA[" << heap_size - 1 << "] =  " << A[heap_size - 1] << endl;

	cout << endl;

	print_array(A,heap_size);

	max_heap_test(A,heap_size);

	cout << endl << "array ordinato: " << endl;
	heap_sort(A, heap_size);
	print_array(A,heap_size);

	return 0;
}
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 12:59   #10
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ok grazie tutto funziona solo correttamente adesso mi guardo il codice per bene e capisco come creare un heap con base array 0, l'unica cosa che volevo chiarire è il perchè nel file header ed in questi due prototipi manca il passaggio del parametro heap_size per riferimento


Codice:
void max_heapify(int A[], int heap_size, int i);
void build_max_heap(int A[],int heap_size);
all'atto della compilazione mi segnala l'errore in quanto viene interpretata dal compilatore come un overload

modificando cos'

Codice:
void max_heapify(int A[], int &heap_size, int i);
void build_max_heap(int A[],int &heap_size);
tutto funziona correttamente.

penso sia un errore di copia...altrimenti se non è cosi non sono riuscito a capire il perchè

grazie
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 14:12   #11
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da robs05 Guarda i messaggi
ok grazie tutto funziona solo correttamente adesso mi guardo il codice per bene e capisco come creare un heap con base array 0, l'unica cosa che volevo chiarire è il perchè nel file header ed in questi due prototipi manca il passaggio del parametro heap_size per riferimento


Codice:
void max_heapify(int A[], int heap_size, int i);
void build_max_heap(int A[],int heap_size);
all'atto della compilazione mi segnala l'errore in quanto viene interpretata dal compilatore come un overload

modificando cos'

Codice:
void max_heapify(int A[], int &heap_size, int i);
void build_max_heap(int A[],int &heap_size);
tutto funziona correttamente.

penso sia un errore di copia...altrimenti se non è cosi non sono riuscito a capire il perchè

grazie
Ciao Robs,
ti consiglio di lasciar perdere la versione con array in base 0. Utilizza quella che ho postato per ultima.

Il compilatore da errore perché devi modificare anche la dichiarazione delle due funzioni nel file header. Poiché le due funzioni non modificano il valore di heap_size, ho pensato di togliere il riferimento e passare l'argomento per valore. Ma funziona in entrambi i casi.

Ora che hai una versione funzionante, potresti provare a incapsulare il tutto in una classe template in modo da gestire agevolmente differenti tipi di dati.

Ciao
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 14:51   #12
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ah ecco erano due versioni di codice, dato la troppa lunghezza del post non avevo notato alle diversità... scusami.

cmq grazie mille adesso mi è tutto chiaro, in effetti ho iniziato ad implementare il tutto ragionando con array di base 1 poi non so il perchè iteravo fino a heap_size - 1.

ps.:se non chiedo troppo dato che prima si è fatto riferimento al Cormen ed io sono uno studente che in effetti sta adottando quel testo, le volevo chiedere se gentilmente ha qualche link da postarmi concerne qualche dispensa o qualche approfondimenti ricchi di esempi delle equazioni di ricorrenza (Cap 4) ed i vari metodi per risolverle.

saluti
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 15:03   #13
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da robs05 Guarda i messaggi
ah ecco erano due versioni di codice, dato la troppa lunghezza del post non avevo notato alle diversità... scusami.

cmq grazie mille adesso mi è tutto chiaro, in effetti ho iniziato ad implementare il tutto ragionando con array di base 1 poi non so il perchè iteravo fino a heap_size - 1.

ps.:se non chiedo troppo dato che prima si è fatto riferimento al Cormen ed io sono uno studente che in effetti sta adottando quel testo, le volevo chiedere se gentilmente ha qualche link da postarmi concerne qualche dispensa o qualche approfondimenti ricchi di esempi delle equazioni di ricorrenza (Cap 4) ed i vari metodi per risolverle.

saluti
Se mi dai dal tu è meglio, lo preferisco. Purtroppo non ti posso aiutare sulle equazioni di ricorrenza ché di matematica ne so poco e niente. Anzi, mi associo alla tua richiesta. Speriamo che qualcuno fornisca quei link.

Ciao
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 22-09-2008, 15:17   #14
robs05
Member
 
Iscritto dal: Jan 2007
Messaggi: 112
ok allora speriamo che qualcuno possa soddisfare questa richiesta

ciao e di nuovo grazie
robs05 è offline   Rispondi citando il messaggio o parte di esso
Old 28-09-2008, 16:14   #15
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da robs05 Guarda i messaggi
...
ps.:se non chiedo troppo dato che prima si è fatto riferimento al Cormen ed io sono uno studente che in effetti sta adottando quel testo, le volevo chiedere se gentilmente ha qualche link da postarmi concerne qualche dispensa o qualche approfondimenti ricchi di esempi delle equazioni di ricorrenza (Cap 4) ed i vari metodi per risolverle.

saluti
Ho trovato questo:

http://www.educ.di.unito.it/~albano/...nse/MatDis.pdf

Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Portatili con 32GB e 40GB di RAM e 1TB S...
Prezzo dell'ittrio fuori controllo: perc...
Grazie a VLT è stata misurata dir...
Blue Origin annuncia un aerofreno ripieg...
Blue Origin annuncia una nuova versione ...
LG UltraFine evo 6K: il primo monitor al...
DJI cambia direzione: investe in Elegoo ...
Black Friday Narwal 2025: risparmi da ca...
Phishing evoluto contro Apple ID: caso f...
Prestazioni in discesa nei giochi? NVIDI...
Addio ai banner dei cookie? L'UE spinge ...
Le offerte Black Friday per gli smartpho...
Il controllo qualità degli iPhone...
Qualcomm Snapdragon X Elite vola con il ...
A2RL Season 2: storia, innovazione e sor...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v