Algoritmi

Page last edited 2 038 giorni 7 ore fa
Da wiki.betaingegneria.it.

Trasformare una lista in una matrice[modifica]

Di solito si fa il contrario, è utile ad esempio per matrici sparse.

Non ho trovato nessun algoritmo; comunque è tutto spiegato nel codice che segue (il rpobelma è spiegato anche qui ow.ly):

  <?php
  /*
   * trasforma una lista 
   
  		$A = array(
  			array(0 => 17477, 1 => 5,  2 => array('a')),
  			array(0 => 17477, 1 => 6,  2 => array('d')),
  			array(0 => 17478, 1 => 12, 2 => array('b')),
  			array(0 => 17479, 1 => 5,  2 => array('a')),
  			array(0 => 17479, 1 => 12, 2 => array('c')),
  		);
   * in una tabella 
  			5	6	12
  		17477	a	d	
  		17478	 	 	b
  		17479	a	 	c
  
   * in cui i contenuti delle due colonne di A sono le etichette rispettivamente
   * delle righe e delle colonne
   * 
   */
  $A = array(
  	array(0 => 17477, 1 => 5,  2 => array('a')),
  	array(0 => 17477, 1 => 6,  2 => array('d')),
  	array(0 => 17478, 1 => 12, 2 => array('b')),
  	array(0 => 17479, 1 => 5,  2 => array('a')),
  	array(0 => 17479, 1 => 12, 2 => array('c')),
  );
  foreach($A as $r => $c)
  {
  	if($c[0] != $rcycle) // se ordino preventivamente evito complessità o(n^2)
  	{
  		$rows[] = $c[0];
  		$rcycle = $c[0];
  	}
  	if(!in_array($c[1], $cols)) //complessità o(n^2)
  	{
  		$cols[] = $c[1];
  	}
  }
  sort($rows);
  sort($cols);
  
  $n = sizeof($rows);
  $m = sizeof($cols);
  $s = sizeof($A);
  
  print '<table border="1">';
  
  print '<tr><th> </th>';
  
  // stampa c[.] (riga intestazione colonne)
  for ($j = 0; $j < $m; $j++)
  	print '<th>'.$cols[$j]."</th>";
  $rc = null;
  
  for ($i = 0; $i < $s; $i++)
  {	
  	if ($A[$i][0] != $rc) 
  	{
  		if ($i > 0)
  			for ($k = $h; $k < $m; print '<td></td>', $k++); //completa le eventuali ultime celle vuote 
  		print '</tr><tr><th>'.$i.'-'.$A[$i][0].'</th>';
  		$h = 0;
  	}
  
  	for ($j = $h; $j < $m; $j++)
  	{	
  		if ($A[$i][1] == $cols[$j]) 
  		{
  			print '<td>'.$A[$i][2][0].'</td>';
  			$h = $j + 1;
  			break;
  		}
  		else // questo stampa le celle vuote prima del primo elemnto non nullo 
  		{
  			print '<td> </td>';
  		}
  	}
  
  	$rc = $A[$i][0];	
  }
  
  print '</table>';
  
  ?>