Progettazione di Algoritmi

di il
10 risposte

Progettazione di Algoritmi

Sia g(n) = n + 2n^3 - 3n^3 + 4n^4. Dire quali delle seguenti affermazioni sono vere e quali sono false. E' necessario provare le affermazioni che si ritengono vere, non è necessario provare le affermazioni che si ritengono false.

(a) g(n) = O(n log n)

(b) g(n) = T(n^5)

(c) g(n) = O(n^10)

(d) g(n) = O(n^4)

So quale sono vere e quali sono false però non so come spiegare le affermazioni vere. Qualche dritta? oppure qualche esercizio svolto simile?

a= Vero - b= Falso - c= Vero - d= Vero

10 Risposte

  • Re: Progettazione di Algoritmi

    E' BANALE:

    Il tutto si riduce ad APPLICARE LA DEFINIZIONE dei vari operatori che descrivono la complessita' computazionale.

    QUINDI, la PRIMA COSA che devi fare e' STUDIARE il significato dei vari operatori!

  • Re: Progettazione di Algoritmi

    Qualche esercizio svolto simile? Cosi da facilitarmi il tutto.
  • Re: Progettazione di Algoritmi

    Sono un po' perplesso sulle risposte, in particolare confrontando a e d
  • Re: Progettazione di Algoritmi

    Formalmente sono tutte false: c'è un evidente abuso di notazione! Non si usa "uguale" ma "incluso" perché O-grande, Theta e Omega rappresentano classi di funzioni. Ma, in fondo, questo è un dettaglio.
    Considerando che il limite all'infinito di g(n) si comporta come n^4 si conclude che le risposte a, b, c sono sbagliate.
    La d lascia qualche perplessità perché manca di contesto; in un contesto adeguato so potrebbe concludere che "la funzione g(n) nel caso migliore richiede n^4 passi per essere risolta".
  • Re: Progettazione di Algoritmi

    epdragon ha scritto:


    Sia g(n) = n + 2n^3 - 3n^3 + 4n^4. Dire quali delle seguenti affermazioni sono vere e quali sono false. E' necessario provare le affermazioni che si ritengono vere, non è necessario provare le affermazioni che si ritengono false.

    (a) g(n) = O(n log n)

    (b) g(n) = T(n^5)

    (c) g(n) = O(n^10)

    (d) g(n) = O(n^4)

    So quale sono vere e quali sono false però non so come spiegare le affermazioni vere. Qualche dritta? oppure qualche esercizio svolto simile?

    a= Vero - b= Falso - c= Vero - d= Vero
    (A) VERO

    Da definizione, troviamo N e C tali che per qualsiasi n > N : g(n) >= C*f(n), cioè: n + 2 * n ^ 3 – 3 * n^3 + 4 * n^4 >= C * n * log n

    Scegliendo C = 4, deve valere : n * (1 – n^2 + 4*n^3) >= 4 * n * log n, quindi (1 – n^2 + 4*n^3) >= 4 * log n

    Poiché log n < n e quindi 4 * log n < 4 * n, l’equazione di sopra è automaticamente vera
    per tutti gli n che verificano anche: (1 – n^2 + 4*n^3) >= 4 * n

    Poiché (1 – n^2 + 4*n^3) > (– n^2 + 4*n^3), l’equazione di sopra è automaticamente vera
    per tutti gli n che verificano anche: (– n^2 + 4*n^3) >= 4 * n,
    quindi per tutti gli n che verificano: n * (- n + 4 * n^2) >= 4 * n ===> - n + 4 * n^2 >= 4 ===> n^2 >= 1 + n / 4

    Poiché n^2 >= n, la condizione di sopra è vera per tutti gli n tali che n >= 1 + n/4, cioè n >= 4/3

    Perciò la condizione iniziale è vera prendendo, ad esempio, C = 4 e N = 2 (o N=3 o N=4… tutti quelli maggiori di 4/3)

    (C) VERO

    Da definizione, troviamo N e C tali che per qualsiasi n > N : g(n) <= C*f(n), cioè: n + 2 * n ^ 3 – 3 * n^3 + 4 * n^4 <= C * n ^ 10

    Scegliendo C = 5, deve valere : n * (1 – n^2 + 4*n^3) <= 5 *n^10, quindi (1 – n^2 + 4*n^3) <= 5 * n^9

    Poiché (1 – n^2 + 4*n^3) < (1 + 4*n^3), l’equazione di sopra è automaticamente vera
    per tutti gli n che verificano: (1 + 4*n^3) <= 5 * n^9

    Poiché n^9 >= n^3 e quindi 5 * n^9 >= 5 * n^3, l’equazione di sopra è automaticamente vera
    per tutti gli n che verificano: (1 + 4*n^3) <= 5 * n^3, cioè 1 <= n^3 che è vera sempre

    Perciò la condizione iniziale è vera prendendo, ad esempio, C = 5 e N = 1


    (D) VERO

    Da definizione, troviamo N e C tali che per qualsiasi n > N : g(n) >= C*f(n), cioè: n + 2 * n ^ 3 – 3 * n^3 + 4 * n^4 >= C * n ^ 4

    Scegliendo C = 3, deve valere : n * (1 – n^2 + 4*n^3) >= 3 * n^4, quindi (1 – n^2 + 4*n^3) >= 3 * n^3

    Poiché (1 – n^2 + 4*n^3) > (– n^2 + 4*n^3), l’equazione di sopra è automaticamente vera
    per tutti gli n che verificano: (– n^2 + 4*n^3) >= 3 * n^3, cioè n^3 >= n^2, che è vero sempre

    Perciò la condizione iniziale è vera prendendo, ad esempio, C = 3 e N = 1
  • Re: Progettazione di Algoritmi

    Sia g(n) = n log n + 2n^3 - 3n^2.

    (a) g(n) = O(n log n)
    (b) g(n) = O(n^2)
    (c) g(n) = T(n^3)
    (d) g(n) = O(n^4)


    E' lo stesso genere di prima weierstrass a= Falso - b= Vero - c= Vero - d= Vero. Mi potresti aiutare?
  • Re: Progettazione di Algoritmi

    APPLICA la definizione degli operatori di Complessita' Computazionale!

    E' BANALE!

    Lo sai che vuol dire n^2?

    Al limite, fai qualche plot o stampa le tabelline!
  • Re: Progettazione di Algoritmi

    epdragon ha scritto:


    Sia g(n) = n log n + 2n^3 - 3n^2.

    (a) g(n) = O(n log n)
    (b) g(n) = O(n^2)
    (c) g(n) = T(n^3)
    (d) g(n) = O(n^4)


    E' lo stesso genere di prima weierstrass a= Falso - b= Vero - c= Vero - d= Vero. Mi potresti aiutare?
    Ascolta è uguale a prima: te ne ho fatti 3 nel momento di pausa giusto per farti capire, ma sono tutti identici e basta applicare le definizioni come dice migliorabile. Abbi pazienza non ne posso fare altri
  • Re: Progettazione di Algoritmi

    Per la dimostrazione di una falsa va bene sempre lo stesso procedimento?
  • Re: Progettazione di Algoritmi

    epdragon ha scritto:


    Per la dimostrazione di una falsa va bene sempre lo stesso procedimento?
    (A) g(n) = O(n log n) - FALSO

    Per dimostrare che sia falsa, bisogna dimostrare che sia vera la negazione della definizione,
    cioè che per qualsiasi coppia (N,C) esiste un n > N tale che g(n) > C * f(n),
    ossia n * log n + 2 * n^3 - 3 * n^2 > C * n * log n ===> log n + 2 * n^2 - 3 * n > C * log n

    Caso C = 1 : log n + 2 * n^2 - 3 * n > C * log n ===> 2 * n^2 - 3 * n > 0 ===> 2 * n^2 > 3 * n ===> n > 3/2,
    quindi basta prendere n = MAX(N+1, 2) = N+1


    Caso C > 1 : log n + 2 * n^2 - 3 * n > C * log n ===> 2 * n^2 - 3 * n > (C - 1) * log n

    Poiché log n < n e quindi (C -1) * log n < (C -1) * n, l’equazione di sopra è automaticamente vera
    per un n che verifichi anche: 2 * n^2 - 3 * n > (C - 1) * n ===> 2 * n - 3 > (C-1) ===> n > (C+2)/2,
    quindi basta prendere n = MAX(N+1, C+2)


    p.s. importante: queste erano le dimostrazioni dirette - se il prof ti consente di utilizzare le stime asintotiche, le dimostrazioni diventano molto più facili
Devi accedere o registrarti per scrivere nel forum
10 risposte