Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Upper bound e Lower bound

    Salve a tutti....sono alle prese con lo studio della complessità..sono arrivato all' analisi asintotica e mi sono inbattuto nella definizione di Upper bound e Lower bound e della notazione Θ..Ho queste definizioni:

    Lower Bound:
    codice:
    f(n)=Ω(g(n)) se esistono due costanti c>0 ed n0>0 tali che f(n)>=c*g(n) con n>=n0
    Upper Bound:
    codice:
    f(n)=O(g(n)) se esistono due costanti c>0 ed n0>0 tale che f(n)<= c*g(n) con n>=n0
    Notazione Θ:
    codice:
    f(n)=Θ(g(n)) se esistono tre costanti c1,c2>0 e n0>0 tali che c1*g(n)>=f(n)<=c2*g(n)
    Fatte le definizioni ho visto questo esempio:
    codice:
    f(n)=3n^2+10 
    di cui:
    f(n)=O(n^2) per c=4 e n0=10
    f(n)=Ω(n^2) per c=1 e n0=0
    f(n)=Θ(n^2)
    poi dice anche che:
    f(n)=O(n^3)
    f(n)!=Θ(n^3)
    ora io non capisco come si calcola praticamente, con i passaggi e tutto, l' Upper bound e il Lower bound ma soprattutto non capisco come si fa a dire che :
    codice:
    f(n)=O(n^3)
    f(n)!=Θ(n^3)
    Qualcuno può aiutarmi a capire???grazie

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304

    Moderazione

    Direi che è un argomento di trattazione generale... non specifico di Java o di un linguaggio in particolare.

    Sposto in "Programmazione" e lo marco come OT.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Nella notazione Theta che hai postato c'è un piccolo errore, hai messo un maggiore al posto di un minore (o viceversa). Ovviamente è:

    codice:
    0 <= c1*g(n) <= f(n) <= c2*g(n)
    Quando hai una funzione, per verificare se appartene ad uno di questi insiemi di funzioni (O, Theta, Omega - in realtà ce ne sono anche altri due) basta che applichi la definizione e verifichi le disuguaglianze.

    Data f(n) = 3n^2 + 10 ovviamente si vede ad occhio che è in O(n^2) ma devi dimostrarlo applicando la definizione, che è:

    codice:
    f(n) = O(g(n)) se esistono c > 0 t.c. f(n) <= c*g(n) per n sufficientemente grande
    Quindi devi trovare i due valori di c ed n che rendono vera la seguente disequazione:

    codice:
    f(n) <= c*g(n)
    Che è:

    codice:
    3*n^2 + 10 <= c*n^2
    Con c = 4 e n = 10:

    codice:
    3*10^2 + 10 <= 4*10^2
    
    310 <= 400
    Le due costanti trovate verificano la disequazione, quindi è dimostrato che f(n) appartiene a O(n^2).

    In modo analogo dimostri il lower bound (ovviamente le costanti possono essere diverse). Per la notazione Theta, non serve rifare i calcoli, perché se una funzione è sia in O(g(n)) che in Omega(g(n)) allora è anche in Theta(g(n)).

    Riguardo alle ultime due righe, è semplice dimostrare (come ho fatto sopra) che f(n) è in O(n^3). Ciò che però non puoi fare è verificare che f(n) sia in Omega(g(n)), di conseguenza non puoi affermare che f(n) sia in Theta(g(n)), perché come ho già detto il limite inferiore dovrebbe coincidere con quello superiore.

  4. #4
    Grazie Kaamos!!!Molto esauriente!!!!

  5. #5
    Occhio che sono tutte definizioni asintotiche "prese a prestito" dall'analisi matematica, e normalmente si considerano per n->infinito.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.