Spiegare l'affermazione che la funzione an + b appartiene a O (n ^ 2) e Θ (n)?


12

Diciamo che ho una funzione lineare f(n)= an+b, qual è il modo migliore per dimostrare che questa funzione appartiene a O (n 2 ) e Θ(n)?

Non ho bisogno di rigore matematico qui. Ho bisogno di una risposta da programmatore. Qualche modo logico di spiegare.

Questo è esattamente il motivo per cui non ho pubblicato la domanda in Domande e risposte in matematica e invece in Domande e risposte sui programmatori.


2
@EmmadKareem In letteratura spesso la notazione Big O viene spesso usata casualmente per rappresentare limiti stretti che sono fondamentalmente Θ (n). Big O è il limite superiore in realtà.
Geek,

1
@EmmadKareem "il limite superiore di O (n) non è n * n.", Non esiste un limite superiore di O (n). O (n) stesso definisce il limite superiore. Può effettivamente contenere un insieme di funzioni che soddisfano la condizione: f (x) ∈ O (g (x)) in quanto esiste c> 0 (ad esempio c = 1) e x0 (ad esempio x0 = 5) tale che f (x ) <cg (x) ogni volta che x> x0.
Geek,

2
@EmmadKareem In realtà O (n) \ subset O (n ^ 2) \ subset O (n ^ 3) e così via, quindi f \ in O (n ^ 2) per transitività di \ subset. Si noti che \ subset non è \ subseteq.
scarfridge,

6
"Ho bisogno di una risposta da parte dei programmatori. Qualche modo logico di spiegare." - bene come definisci "logico"? La matematica è logica. Niente di meno che il pensiero rigoroso è sbagliato qui. Puoi provare a spiegare l'argomento, ma senza digerire la matematica (altrimenti non difficile) dietro non la capirai davvero - avrai solo un senso nebbioso di ciò che significa.
Tamás Szelei,

2
@Geek: immagino tu intenda la matematica ? cs.SE sarebbe anche un buon indirizzo.
Raffaello,

Risposte:


20

La notazione Big Oh (O, Theta, Omega) riguarda i tassi di crescita delle funzioni.

Quando si implementa un algoritmo, ha una certa caratteristica su come cambia il runtime quando si aumenta il set di dati. Ora, puoi ottimizzare l'algoritmo in modo che funzioni più velocemente di un fattore 100. Certo, questo è fantastico, ma essenzialmente è sempre lo stesso algoritmo. Allo stesso modo, in pochi anni, i computer potrebbero essere due volte più veloci di oggi.

La notazione Landau estrae questi fattori costanti. Non importa se un algoritmo fè sempre due volte più veloce di un altro algoritmo g: forse gpuò essere ottimizzato per funzionare 4 volte più velocemente, oppure potresti invece acquistare hardware più veloce. Se lo guardi da questa prospettiva, potresti dire che sono "uguali". (Questo non vuol dire che puoi (sempre) ignorare i fattori costanti nella pratica.)

Big oh specifica un limite superiore, è simile alla <=relazione.

Concorderai che 1 < 2è vero. Ciò significa che 1non può essere inferiore a qualsiasi altro numero? Certamente no. C'è un numero infinito di numeri che sono più grandi di 1.

Con i tassi di crescita, è simile. O(n)indica l'insieme di tutte le funzioni, che crescono linearmente (o più lentamente). O(n^2)d'altra parte indica tutte quelle funzioni, che crescono con una compattezza quadratica (o più lenta). Sono sicuro che concorderai sul fatto che una funzione lineare cresce più lentamente di una funzione quadratica.

Ecco perché una funzione può essere in più di una classe "Big-oh".

Ecco un confronto di diverse funzioni con vincoli: (dalla matematica di Knuth's Concrete)

confronti del tasso di crescita

Da sinistra a destra, le funzioni crescono più velocemente.

Inoltre, inserisci qui la descrizione dell'immaginesignifica che n ^ 2 cresce più velocemente di n ^ 1 perché 2> 1.

definizioni

definizione Omega

"f cresce più velocemente o altrettanto velocemente di g"

definizione big Oh

"f cresce più lentamente o altrettanto velocemente di g"

definizione Theta

La combinazione dei due precedenti. Dice che la funzione fcresce "altrettanto velocemente" come g. È una relazione di equivalenza.

Interpretazione

Diciamo che hai due algoritmi fe g.

Omega

Supponendo f non in Theta di g, f in Omega di gsignifica che, indipendentemente dal budget, non esiste una quantità costante di potenza di calcolo che è possibile aggiungere al sistema, in modo tale da ffunzionare sempre più velocemente g.

Grande oh

Supponendo f non in Theta di g, f in Big Oh di gsignifica che se hai abbastanza dati, ffunzionerà sempre più velocemente di g, indipendentemente dalla potenza di elaborazione che aggiungi al tuo sistema.

Prova

Se stai davvero cercando di dimostrarlo, devi dimostrare usando le definizioni della notazione Landau che la tua funzione soddisfa le condizioni necessarie.

Quindi è necessario trovare i valori per c, d, n_0in modo tale che la condizione detiene.

Ecco come puoi farlo per il limite inferiore con c:

prova

È importante rendersi conto che io definisco arbitrariamente ccome più piccolo di quanto a-1vada perfettamente bene. La definizione di Theta (g) dice che "esiste un c". Può essere qualsiasi valore purché sia ​​maggiore di 0. (Se aè un numero reale positivo, tuttavia, è necessario modificare leggermente la prova, poiché a - 1potrebbe essere effettivamente negativo)

(Sto assumendo adi essere positivo, altrimenti la funzione sarà sempre negativa per grandi valori di n, il che non ha senso per una funzione che indica il runtime.)

Puoi provare a farlo per il limite superiore, è abbastanza simile. Se non sai come fare, posso fornirti una prova.

Suggerimento: iniziare con d > a + 1

Attenzione

È importante non dimostrarlo nel modo sbagliato. Se supponi che (an + b) sia in O (n) e passi da lì, non hai dimostrato ciò che volevi. Dovrai verificare che tutti i tuoi passaggi procedano in entrambe le direzioni, ovvero invece di =>te <=>.


2
Questo è tutto. Le persone troppo cattive vanno fuori di testa a causa della matematica, in realtà è molto semplice.
Tamás Szelei,

domanda afferma: "Non ho bisogno di rigore matematico qui. Ho bisogno di una risposta dei programmatori ..." La notazione usata in questa risposta non sembra adatta alla domanda
moscerino del

1
@gnat Hmm, pensavo che la domanda dicesse "prova" ad un certo punto. Comunque, ho aggiunto interpretazioni per le definizioni matematiche.
phant0m

@ phant0m ottima risposta. esattamente quello che stavo cercando. La matematica nella risposta lo ha reso più solido, anche se "la matematica" non è stata specificamente richiesta nella domanda originale. Grazie mille.
Geek,

@Geek, sono contento che ti piaccia. Se hai altre domande, sentiti libero di chiedere e posso chiarire / espandere la mia risposta.
phant0m

5

Quando hai a che fare con i polinomi, ti preoccupi solo del grado del polinomio. Cioè, per an + b, ti importa solo n. Se lo fosse an^3 + bn^2 + cn + d, ti interesserebbe solo n^3.

Quindi un polinomio con grado d sarà sempre presente Θ(n^d). Semplice.

Ora dobbiamo parlare della differenza tra Θ e O. Essenzialmente, è la stessa differenza tra ==e <=rispettivamente. Quindi Θ(n)significa che è sempre all'interno di un fattore costante di n. O(n)significa che è sempre all'interno di un fattore costante no inferiore a n.

Ciò significa che qualsiasi funzione in Θ(s), per qualsiasi s, sarà anche in O(s). Inoltre, se una funzione è attiva Θ(s)ed sè sempre inferiore ad altre funzioni t, tale funzione è attiva O(t)ma non attiva Θ(t).

Per completezza, c'è anche Ω(n). Se Θrappresenta ==e Orappresenta <=, Ωrappresenta >=. Così an + bè in Ω(1), Θ(n)e O(n^2).

Come ho detto prima, è davvero facile capire in che polinomi di classe ci sono - basta guardare il grado. Ci sono anche altre funzioni con cui è facile lavorare.

Qualsiasi funzione sotto forma di a^bnper arbitraria ae bsono in Θ(a^n). Per qualsiasi valore c >= a, sono in O(c^n). Ogni polinomio è dentro O(2^n). In sostanza, ciò afferma semplicemente che le funzioni esponenziali battono sempre i polinomi e che la base della funzione esponenziale è importante.

I logaritmi sono l'opposto. Per uno, log_b nè in Θ(log n)per qualsiasi b. Ciò significa che la base non ha importanza per i logaritmi. Questo ha senso perché il passaggio tra basi diverse nei logaritmi si sta moltiplicando per una costante. Anche le funzioni logaritmiche sono O(n): cioè una funzione logaritmica è più piccola di qualsiasi polinomio (almeno di grado 1).

Data una somma di queste funzioni, la più grande "vince". Lo n + log nè anche Θ(n)perché il ntermine domina il log ntermine. La moltiplicazione è più complicata. Per CS, l'unica cosa che devi sapere è che nlog nè tra ne n^2.


1
piuttosto buono. Per il mio ricordo sopra spiegazione è il più vicino al classico manuale Algorithm design , come si arriva
moscerino

1
@Tikhlon nice write up. Quindi +1. Ma quello che ho accettato era ancora meglio.
Geek,

-2

Senza usare molta matematica, prendi la funzione f (n) = an + b e rilascia tutte le costanti, quindi assomiglia a questa f (n) = n, quindi prendi la "n" con il massimo grado come risposta QED Θ (n)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.