O((n^3)/4)
nie ma sensu pod względem zapisu big-O, ponieważ ma on mierzyć złożoność jako stosunek argumentu. Dzielenie przez 4 nie ma wpływu, ponieważ zmienia wartość wskaźnika, ale nie jego charakter.
Wszystkie one są równoważne:
O(n^3)
O(n^3/4)
O(n^3*1e6)
Inne terminy mają sens tylko wtedy, gdy zawierają one n
określenia, takie jak:
O(n^3/log(n))
O(n^3 * 10^n)
Jak słusznie zauważa Anthony Kanago, to konwencja, aby:
- tylko trzymać termin z najwyższą stopą wzrostu dla sum:
O(n^2+n) = O(n^2)
.
- Pozbyć się stałych produktów:
O(n^2/4) = O(n^2)
.
Nie zgadzam się z zasadą pierwszą we wszystkich przypadkach. Jest to dobra zasada decydująca o maksymalnej szybkości wzrostu funkcji, ale dla takich rzeczy jak porównanie algorytmów (a), gdzie można inteligentnie ustawić limit parametru wejściowego, coś takiego jak O(n^4+n^3+n^2+n)
jest znacznie gorsze niż tylko O(n^4)
.
W takim przypadku należy podać dowolny termin, który zależy od parametru wejściowego. W rzeczywistości przydatne mogą być nawet stałe terminy. Porównaj na przykład O(n+1e100)
z O(n^2)
- ten drugi będzie przez pewien czas lepszy od pierwszego, aż n
stanie się wystarczająco duży, aby wpłynąć na termin.
(a) Istnieją, oczywiście, tych, którzy twierdzą, że nie powinno być stosowane w taki sposób, ale pragmatyzm często pokonuje dogmatyzm w realnym świecie :-)
n/4 * n * n = (N^3)/4 –
Smart kompilator Prawdopodobnie zoptymalizuj to gniazdo pętli, aby było O (1), ponieważ w rzeczywistości nic nie robi. – tgamblin
"Inteligentny" kompilator pozostawiłby to w spokoju, chyba że powiedziano inaczej - może to być pętla synchronizacji w osadzonym systemie kontrolującym przepływ krwi przez maszynę do dializy :-) – paxdiablo