Я не уверен, что согласен с опубликованными фактическими цифрами, но концепция надежна.Что вам нужно сделать, это выяснить, как рабочая нагрузка изменяется в зависимости от входного значения.
Возьмите пример O(lg N)
(где lg
- это обозначение для log<sub>10</sub>
), и мы будем предполагать постоянный множитель c
, чтобы получить времена (это предположение, скорее всего, является причиной, по которой мои цифры будут отличаться от книги).
Итак, (c * lg 100)
дает вам 1второе и, поскольку (lg 100 = 2)
, это означает (c = <sup>1</sup>/<sub>2</sub>)
.Применяя это к входному размеру 1000, (<sup>1</sup>/<sub>2</sub> * lg 1000)
дает вам 1,5 секунды.
Для O(NlgN)
, (c * 100 * lg 100)
дает вам 1 секунду, а с (100 lg 100 = 200)
это означает (c = <sup>1</sup>/<sub>200</sub>)
,Применяя это к входному размеру 1000, (<sup>1</sup>/<sub>200</sub> 1000 lg 1000)
дает вам 15 секунд.
Для O(N<sup>2</sup>)
, (c * 100<sup>2</sup>)
дает вам 1 секунду, а с (100<sup>2</sup> = 10,000)
это означает (c = <sup>1</sup>/<sub>10,000</sub>)
,Применяя это к входному размеру 1000, <sup>1</sup>/<sub>10,000</sub> * 1000<sup>2</sup>
дает вам 100 секунд.
И, наконец, случай O(2<sup>N</sup>)
.
Поскольку (c * 2<sup>100</sup>)
дает вам 1 секунду,это означает (c = <sup>1</sup>/<sub>2<sup>100</sup></sub>)
.Применяя это к входному размеру 1000, (<sup>1</sup>/<sub>2<sup>100</sup></sub> * 2<sup>1000</sup>)
дает вам (я разберусь с этим, поскольку числа становятся больше):
(1/(2^100)) * 2^1000
= 2^1000 / 2^100
= 2^900
= 8.4 * 10^270 seconds
= 2.6 * 10^263 years (using 86,400 secs/day, 365 days/year).
И это , гдеПоистине огромная фигура.Короче говоря:
Complexity Duration From book
---------- -------- ---------
O(1) 1 s 1 s
O(lgN) 1.5 s 3 s
O(N) 10 s 10 s
O(NlgN) 15 s 33 s
O(N^2) 100 s 100 s
O(2^N) 10^263 y 10^263 y
Не точно те же цифры, что и в вашей книге, но они соответствуют порядку величин, что, вероятно, является лучшим, на что вы можете надеяться при выполнении сложности.анализ.