Ciao,
quando provo ad eseguire il mio codice mi appare il seguente errore:
Parse error: parse error, expecting `','' or `';'' in C:\xampp\htdocs\PHPEsempi\algoritmiOrdinamento\Hea p.php on line 11
Ma non mi spiego perchè visto che lalinea 11 termina con ;
Il mio codice è il seguente:
codice:
<?php
/* Classe che implementa la struttura dati HEAP e la sua funzionalità per
l'ordinamento di una collezione mediante l'algoritmo di ordinamento
Heap Sort */
class Heap{
/* Variabile di istanza che implementa la struttura dati ad albero
dell'heap per mezzo di un array */
private $heap[];
private $heapSize = 0; // Numero di elementi correntemente dentro l'HEAP
/* Costruttore: Crea un nuovo oggetto istanza di Heap. Riceve un qualunque
array come parametro di input, lo copia dentro alla
variabile di istanza heap[] (mettendoli dentro l'array Heap
a partire dalla posizione 1) e su di esso richiama ilmetodo
di classe heapify per trasformarlo in loco in un heap */
public function __construct($arr=array()){
/* Scorre l'array ricevuto come parametro e lo copia nel'array heap
traslando gli elementi una posizione in avanti (per farli partire dalla
posizione 1 e non 0) */
foreach($arr as $chiave => $valore){
$heap[$chiave+1] = $arr[chiave]; // Copia gli elementi traslandoli
$heapSize ++; //Incrementa di 1 il numero elementi inseriti nell'heap
}
/* Invoca il metodo heapify sull'array partendo dalla prima posizione che
sarà trasformato in un HEAP */
$this->heap = $this->heapify($heap, 1);
}
/* Metodo che dato un qualsiasi array lo riarrangia trasformandolo in una
struttura dati HEAP memorizzata sempre nello stesso array di partenza */
private function heapify($heap, nodo_i){
echo "heapify è stata chiamata
";
/* CASO BASE: Se heap è vuoto ritorna al chiamante */
if(sinistro($nodo_i) > this->$heapSize) return;
/* Altrimenti procedi ricorsivamente nel seguente modo */
else{
$sin = sinistro($nodo_i); // Posizione della radice del sottoalbero sinistro
$des = destro($nodo_i); // Posizione della radice del sottoalbero destro
$nodoCorrente = $sin;
heapify($heap, $nodoCorrente); // Chiama ricorsivamente sul sottoalbero sinistro
$nodoCorrente = $des;
heapify($heap, $nodoCorrente); // Chiama ricorsivamente sul sottoalbero destro
fixHeap($nodoCorrente, $heap);
}
}
/* Metodo che prende in input un quasi heap (cioè un heap con al più
un'anomalia) ed un indice nodo_i e restituisce un heap corretto */
private function fixHeap($nodo_i, $quasiHeap[]){
$sin; // Conterrà l'indice del figlio sinistro
$des; // Conterrà l'indice del figlio destro
$max; // Conterrà l'indice del figlio avente valore massimo
/* Se nodo_i è una foglia allora ritorna al chiamante (caso base)*/
if(sinistro($nodo_i) > this->$heapSize) return;
/* Se nodo_i non è una foglia */
else{
$sin = sinistro($nodo_i); // Posizione del figlio sinistro
$des = destro($nodo_i); // Posizione del figli destro
/* Trova il massimo tra il figlio sinistro e destro di nodo_i */
if($quasiHeap[sin] >= $quasiHeap[$des]) $max = $sin;
else $max = $des;
/* Se il valore in posizione nodo_i è MINORE del valore del figlio
massimo */
if(quasiHeap[$nodo_i] < quasiHeap[$max]){
$tmp = $quasiHeap[$nodo_i]; // Salva il valore in posizione i
/* Scambia il valore in posizione nodo_i con il valore in
posizione max */
$quasiHeap[$nodo_i] = $quasiHeap[max];
$quasiHeap[$max] = $tmp;
/* Invoca ricorsivamente il metodo fixHeap() passandogli come
parametro lo stesso array e la posizione max */
fixHeap($max, $quasiHeap);
}
}
}
/* Metodo che dato l'indice di un elemento dell'heap calcola l'indice del
suo figlio sinistro nell'heap */
private function sinistro(indicePadre){
$sin = $indicePadre*2; // Calcola l'indice del figlio sinistro
return $sin; // Ritorna il valore di sin al chiamante
}
/* Metodo che dato l'indice di un elemento dell'heap calcola l'indice del
suo figlio destro nell'heap */
private function destro(indicePadre){
$des = $indicePadre*2 + 1; // Calcola l'indice del figlio destro
return $padre; // Ritorna il valore di des al chiamante
}
/* Metodo che dato un elemento dell'heap calcolal'indice del padre */
pruvate function padre(indiceNodo){
$padre = floor(i/2); // Calcola la parte intera
return $padre; // Ritorna al chiamante la posizione del padre
}
}
?>
Grazie
Andrea