Programma per valori distinti di un vettore

di il
2 risposte

Programma per valori distinti di un vettore

Si scriva una funzione MATLAB che abbia come argomento un vettore v e che restituisca come
risultato il numero di valori distinti in v. Ad esempio, nel caso del vettore
v = [4; 7; 8; 3; 1; 3; 5; 9; 9; 5];
la risposta corretta e 7. Infatti v contiene i 7 valori distinti 1, 3, 4, 5, 7, 8, e 9.
Dopo aver scritto la funzione, se ne determini la complessita asintotica in tempo nel caso peggiore, espressa come numero di confronti tra gli elementi e in funzione della lunghezza n del vettore in ingresso. Qualcuno riesce a farlo?

2 Risposte

  • Re: Programma per valori distinti di un vettore

    Per identificare gli elementi distinti all'interno di un vettore e per calcolarne il numero, si possono utilizzare due funzioni di MatLab:

    [*] unique: restituisce un vettore (o una matrice, a seconda dell'input) contenente i valori "unici" presenti all'interno del vettore
    [*] length: restituisce la lunghezza di un vettore (o la massima tra le varie dimensioni nel caso di una matrice)

    per tanto l'istruzione:

    length(unique(v))

    restituisce il numero di elementi unici all'interno del vettore "v"

    Nel caso non si volessero utilizzare le funzioni built-in di MatLab, si può risolvere il problema con una serie di cicli for come nello script che segue.
    Nello script, un loop esterno cicla sugli elementi del vettore e, tramite un ciclo interno li confronta con gli altri alla ricerca di eventuali "duplicati"
    
    % 
    % Definzione del vettore
    % 
    v = [4; 7; 8; 3; 1; 3; 5; 9; 9; 5];
    % 
    % Calcolo del numero degli elementi del vettore
    % 
    n_elem=length(v);
    % 
    % Creazione di una copia del vettore di input
    % 
    v_tmp=v;
    % 
    % Loops per la scansione del vettore di input e ricerca dei duplicati
    % 
    for i=1:n_elem-1
       for j=i+1:n_elem
    %       
    %       Se viene trovato un duplicato, il suo valore viene nel vettore
    %       "copia" cambiato in NaN
    %       
          if(v(i) == v(j))
             v_tmp(j)=NaN;
          end
       end
    end
    % 
    % Inizializzazione contatore, conteggio dei valori distinti e loro
    % assegnazione ad un vettore "output"
    % 
    num_elem_dist=0;
    for i=1:n_elem
       if(~isnan(v_tmp(i)))
          num_elem_dist=num_elem_dist+1;
          v_dist(num_elem_dist)=v_tmp(i);
       end
    end
    % 
    % Visualizzazione risultati
    % 
    disp(['Numero elementi distinti= ' num2str(num_elem_dist)])
    disp('Elementi distinti nel vettore in input:')
    v_dist
    
    Per quanto riguarda la seconda parte della domanda (determinazione della complessità asintotica) purtroppo non sono in grado di dare una risposta concreta.

    Quello che si può valutare è il numero di iterazioni necessarie: queste sono

    n_iter=n*(n-1)/2

    dove "n" è la lunghezza del vettore di input meno 1.
    Nel corso delle iterazioni, infatti, ogni elemento del vettore viene confrontato solo con quelli successivi (rispetto alla sua posizione), così che, dato un vettore di 10 elementi:
    [*] il primo viene confrontato con 9 elementi
    [*] il secondo con 8 elementi
    [*] ...
    [*] il penultimo con 1 solo elemento (l'ultimo) - l'ultimo elemento non deve essere confrontato

    La somma delle iterazioni è dunque: 9 + 8 + 7 + 6 ... +1 che è calcolabile con la formula fdi Gauss sopra riportata.

    In Internet è comunque disponibile una grande quantità di documentazione sulla "Complessità Asintotica".

    Hope this helps.
  • Re: Programma per valori distinti di un vettore

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte