Algoritmi

Page last edited 1 924 giorni 22 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>';
  
  ?>