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 > 0and an integer constantn0 >= 1such 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 > 0and integer constantn0 >= 1such that8n+5 <= c * nfor every integern >= n0. It is easy to see that a possible choice isc = 9andn0 = 5. Indeed, this is one of infinitely many choices available because there is a trade-off betweencd andn0. For example, we could rely on constantc = 13andn0 = 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
cen0? -
Perché la scelta tra
cen0è importante? Sembra strano selezionare valori arbitrari comec = 9999999999en0=1e 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 .