[C] Complessità computazionale

di il
11 risposte

[C] Complessità computazionale

Salve a tutti, avrei bisogno di un aiuto riguardante il calcolo della complessità computazionale, dato che dopo averlo studiato dal libro e da internet non ho comunque capito il modo per calcolarlo, quindi vi chiedo un aiuto utilizzando come esempio un codice che ho creato che devo portare all esame proprio con la sua complessità


#include <stdio.h>
 
int main()
{
   int v[100], n, i, j, position, swap;
   
 
   printf("Inserisci il numero degli elementi\n");
   scanf("%d", &n);
 
   printf("Inserisci %d elementi\n", n);
 
   for ( i = 0 ; i < n ; i++ )
      scanf("%d", &v[i]);
 
   for ( i = 0 ; i < ( n - 1 ) ; i++ )
   {
      position = i;
 
      for ( j = i + 1 ; j < n ; j++ )
      {
         if ( v[position] < v[j] )
            position = j;
      }
      if ( position != i )
      {
         swap = v[i];
         v[i] = v[position];
         v[position] = swap;
      }
   }
 
   printf("Lista in ordine decrescente:\n");
 
   for ( i = 0 ; i < n ; i++ )
      printf("%d\n", v[i]);
    int x;
    printf("inserisci un intero x \n");		//Setto il valore di x
    scanf("%d", &x);
    for( i = 0; i < n; i++)
	{
	     if ( v[i] > x)
         {
  			 printf("Il primo elemento dell'array=%d e' maggiore di x=%d", v[i], x);
			 return 0;
		 }
		 int somma = 0;
			for(i = 0; i < n; i++)
			{
				somma += v[i];
				if (somma > x)
			    {
					printf("Vengono sommati gli elementi del vettore fino al v[%d],\nLa loro somma e' %d maggiore di x %d. ", i, somma, x);
					return 0;
			    }
			}
		 
	 
       printf("La somma di tutti gli elementi dell'array e' minore di x= %d\n",x);	
    }
	return 0;
   
}

11 Risposte

  • Re: [C] Complessità computazionale

    Crossposting

    http://forum.html.it/forum/showthread.php?threadid=2926442
  • Re: [C] Complessità computazionale

    Il Crossposting è vietato!

    Comunque voglio darti qualche suggerimento!
    
    for ( i = 0 ; i < n ; i++ )
          scanf("%d", &v[i]);
    
    Che complessità ha?

    E questo?
    
    for ( i = 0 ; i < ( n - 1 ) ; i++ ){
          for ( j = i + 1 ; j < n ; j++ ){
         ----
        }
    }
    
    E questo?
    
    for( i = 0 ; i < n ; i++ ){
        ---
    }
    for ( i = 0 ; i < ( n - 1 ) ; i++ ){
          for ( j = i + 1 ; j < n ; j++ ){
         ----
        }
    }
    
  • Re: [C] Complessità computazionale

    In primis mi scuso per il crossposting, ma essendo l'esame alle porte, ho una certa urgenza.
    Comunque ti rispondo solo al primo dato che non sono sicuro neanche di quello , dovrebbe essere O(n) giusto?
  • Re: [C] Complessità computazionale

    
    for ( i = 0 ; i < n ; i++ ){
    } // O(n) Ovvero lineare nel numero di dati
    
    Se vogliamo
    
    for ( i = 0 ; i < 4 ; i++ ){
    } // O(4) 
    
    Mentre:
    
    for ( i = 0 ; i < n ; i++ ){
    } 
    
    for ( i = 0 ; i < n ; i++ ){
    } // O(n) + O(n) = 2O(n)
    
    Se invece hai:
    
    for ( i = 0 ; i < n ; i++ ){
         for ( j = 0 ; j < n ; j++ ){
         }
    } O(n^2) Ovvero quadratico
    
    Se adesso hai:
    
    for ( i = 0 ; i < n ; i++ ){
         for ( j = 0 ; j < n ; j++ ){
         }
    } O(n^2)
    for ( j = 0 ; j < n ; j++ ){
         } O(n)
    
    L'intero algoritmo ha complessità T(n)=O(n^2)+O(n)=O(n^2) ovvero quadratico.

    Se ci sono funzioni ricorsive va calcolata la complessità mediante l'equazione alle ricorrenze e poi messo tutto insieme così da determinare la complessità complessiva.
  • Re: [C] Complessità computazionale

    Quindi la complessità computazionale dell'intero algoritmo che ho implementato è O(n^2)?
  • Re: [C] Complessità computazionale

    Esatto!
  • Re: [C] Complessità computazionale

    Potrei rispondere all'ultima domanda dicendo che, dato che sto usando il selection sort che è un algoritmo di ordinamento, che quindi di per se ha complessita O(n^2), non è possibile fare di meglio.

    Solo che stavo pensando che forse la domanda si riferisce alla seconda parte dell'algoritmo cioè quando è gia implementato, e deve trovare gli elementi che sommati sono uguali ad x. In quel caso la complessità non sarebbe O(n)?
  • Re: [C] Complessità computazionale

    Scusa non ho capito, potresti spiegarmi? comunque questo che hai fatto riguarda sempre il selection sort
  • Re: [C] Complessità computazionale

    No! @ultrasound91 voleva dimostrarti che si può fare un algoritmo in modi diversi.

    Il costo computazionale nel secondo caso dello scambio è maggiore, si risparmia però nello spazio delle variabili.
  • Re: [C] Complessità computazionale

    Adesso non esageriamo, una funzione swap si comprende subito.

    Comunque non esiste una regola precisa, due ingegneri diversi costruiscono un ponte in due modi diversi, e sono sicuro tutti e due i ponti ti fanno passare da una riva all'altra del fiume, in qualsiasi progetto è sempre da vedere qual è l'obiettivo e come meglio si può raggiungere.
    Nel caso di scambio variabili, molto più leggibile e manutenibile la swap, "con costo computazionale minore".
  • Re: [C] Complessità computazionale

    SVNiko ha scritto:


    in qualsiasi progetto è sempre da vedere qual è l'obiettivo e come meglio si può raggiungere.
    Penso dica proprio quello.
Devi accedere o registrarti per scrivere nel forum
11 risposte