Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [JAVA] Complessità

  1. #1

    [JAVA] Complessità

    Ho un problema con questo algoritmo di cui dovrei calcolare la complessità asintotica. Non so se sono nella sezione giusta ma il codice è scritto in java.
    Come procedo per calcolare la complessità?

    codice:
     public static void esercizio(int[][] a){ 
                   int n=a.length; 
                   int i=0; 
                   int j=0; 
     
                   while(i<n && j<n){ 
                        for(int k=i-1;k<=i+1;k++) 
                             for(int h=j-1;h<=j+1;h++) 
                                  if(k>=0 && k<n && h>=0 && h<n) 
                                       a[k][h]++; 
                        i++; 
                        j++; 
                   } 
         }

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Devi cercare di dare una stima asintotica del "costo" di questo algoritmo..devi in pratica fare una stima sul numero , ripeto in modo asintotico , delle ripetizioni delle istruzioni (quindi stai attento ai vari cicli ecc)..
    Comunque , premettendo che sono piuttosto arruginito a riguardo , se non sbaglio dovrebbe essere un O(n) ..c'ho preso?

  3. #3
    i e j sono sempre uguali, quindi possiamo eliminare j rimpiazzandola con i; a questo punto, il while più esterno si può trasformare in un for, ottenendo:
    codice:
    public static void esercizio(int[][] a)
    {
        int n=a.length;
    
        for(int i=0; i<n; i++) // <= n iterazioni
            for(int k=i-1; k<=i+1; k++) // <= 3 iterazioni
                for(int h=i-1; h<=i+1; h++) // <= 3 iterazioni
                    if(k>=0 && k<n && h>=0 && h<n)
                        a[k][h]++;
    }
    Come da commenti, il ciclo più esterno viene eseguito n volte, e ciascuno dei due cicli interni viene eseguito 3 volte (da i-1 a i+1 inclusi); l'if governa una singola istruzione (e non un ciclo), per cui non conta nel calcolo della complessità asintotica (darebbe come contributo una costante k, che sparisce nella notazione dell'O-grande).
    Per questo, il codice più interno viene eseguito 3*3*n*k volte, ovvero la procedura è O(n) (tutte le costanti spariscono).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Ok! Più chiaro di così si muore! In pratica ogni volta devo determinare quante volte si itera un ciclo e determinare la complessità delle operazioni al suo interno?
    Cioè se per esempio avessi questo codice:

    codice:
     public static void esercizio(int[] a, int[] b){ 
              int n=a.length; 
              int m=b.length; 
     
              int i=0; 
              int j=0; 
     
              while(j<m){ 
                   System.out.println(""+a[i]*b[j]); 
                   j=j+((i+1)/n); 
                   i=(i+1)%n; 
     
              } 
         }
    i varia tra 0 e n-1 e j incrementa di 1 ogni n-1 iterazioni, fino a che rimane minore di m. Posso concludere che la complessità è n*m? (o (n-1)*(m-1) ?)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.