Dal mio libro "Strutture dati e algoritmi in Java: Sesta edizione" la definizione di Big Oh è la seguente:
Let
f(n)
andg(n)
be functions mapping positive integers to positive real numbers. We say thatf(n)
isO(g(n))
if there is a real constantc > 0
and an integer constantn0 >= 1
such thatf(n) <= c * g(n)
forn >= 0
Quindi mostrano che la funzione 8n + 5
è O(n)
e usa la seguente giustificazione:
By the big-Oh definition, we need to find a real constant
c > 0
and integer constantn0 >= 1
such that8n+5 <= c * n
for every integern >= n0
. It is easy to see that a possible choice isc = 9
andn0 = 5
. Indeed, this is one of infinitely many choices available because there is a trade-off betweenc
d andn0
. For example, we could rely on constantc = 13
andn0 = 1
Nei miei studi di laurea, ho imparato che il grande O è solo il più grande fattore crescente in un metodo f(n)
e come tale questa descrizione è nuova per me. Posso rispondere alle domande trovando il più grande fattore, ma non posso giustificare. Mi avrebbe aiutato se avessi saputo:
-
Che cosa si intende con "una costante reale
c > 0
" e "una costante interan0 >= 1
" Che cosa significano? -
Di quali trade-off si parla quando dicono che c'è un compromesso tra
c
en0
? -
Perché la scelta tra
c
en0
è importante? Sembra strano selezionare valori arbitrari comec = 9999999999
en0=1
e quindi concludere che effettivamentef(n)
è Big-Oh diO(g(n))
solo perché8*1 + 5 <= 999999999* 1
Non riesco a immaginare un caso in cui una funzione f(n)
sarebbe maggiore di c*n
se sei libero di scegliere c
.