Короткий ответ заключается в том, что исходный вопрос, вероятно, неявно предполагал, что логарифм должен быть в базе 2, так что 2 ^ (log_2 (N)) - это просто N, по определению log_2 (x) как обратной функции из 2 ^ лет
Тем не менее, интересно исследовать это немного более тщательно, если логарифм относится к другой базе. Стандартные результаты позволяют записать логарифм в основание b
следующим образом:
, где ln(x)
- натуральный логарифм (используется основание e
). Точно так же можно переписать 2^x
следующим образом:
Затем мы можем переписать исходное выражение порядка следующим образом:
, которое можно уменьшить до:
Итак, если основание b
нашего логарифма равно 2, то это явно просто N
. Однако, если база отличается, мы получаем N
, возведенное в степень. Например, если b=10
, мы возводим N в степень 0,301, что, безусловно, является медленнее возрастающей функцией, чем O(N)
.
Мы можем проверить это напрямую с помощью следующего скрипта Python:
import numpy
import matplotlib.pyplot as plt
N = numpy.arange(1, 100)
plt.figure()
plt.plot(N, 2**(numpy.log2(N)))
plt.xlabel('N')
plt.ylabel(r'$2^{\log_2 N}$')
plt.figure()
plt.plot(N, 2**(numpy.log10(N)))
plt.xlabel('N')
plt.ylabel(r'$2^{\log_{10} N}$')
plt.show()
График, который получается, когда мы предполагаем, что логарифм основывается на двух:
сильно отличается от графика, когда логарифм принимается за основание десять: