Логарифмы и экспоненты являются обратными операциями.
if
x^n = y
then
Logx(y) = n
Например,
10^3 = 1000
Log10 (1000) = 3
Алгоритмы «разделяй и властвуй» работают, разделяя проблему на части, которые затем решаются как независимые проблемы. Также может быть этап объединения, объединяющий части. Большинство алгоритмов «разделяй и властвуй» имеют основание 2, что означает, что они каждый раз сокращают проблему вдвое. Например, Binary Search работает как поиск имени в телефонной книге. Вы переворачиваете на середину и говорите... Имя, которое я ищу, в первой половине или во второй половине? (до или после того, к чему вы перелистнули), затем повторите. Каждый раз, когда вы делаете это, вы делите размер проблемы на 2. Следовательно, это основание 2, а не основание 10.
Обозначение порядка в первую очередь связано только с «порядком» среды выполнения, потому что это наиболее важно при попытке определить, будет ли проблема разрешимой (решаемой за разумное время).
Примеры различных заказов:
O(1)
O(n)
O(n * log n)
O(n^2 * log n)
O(n^3.5)
O(n!)
и Т. Д.
O здесь означает «большое обозначение O», которое в основном обеспечивает верхнюю границу скорости роста функции. Поскольку мы заботимся только о росте функции для больших входных данных... например, мы обычно игнорируем члены более низкого порядка.
n^3 + 2 n^2 + 100 n
было бы
O(n^3)
поскольку n ^ 3 является наибольшим членом порядка, он будет доминировать в функции роста для больших значений N.
Когда вы видите O (n * log n), люди просто сокращают ... если вы понимаете алгоритм, это обычно логарифмическая база 2, потому что большинство алгоритмов сокращают проблему вдвое. Однако это может быть логарифмическая база 3, например, если алгоритм разрезает проблему, например, на трети.
Примечание:
В любом случае, если бы вы построили график функции роста, она выглядела бы как логарифмическая кривая. Но, конечно, O(Log3 n) будет быстрее, чем O(Log2 n).
Причина, по которой вы не видите O(log10 n) или O(log3 n) и т. д., заключается в том, что алгоритм не так уж часто работает лучше таким образом. В нашем примере с телефонной книгой вы можете разделить страницы на 3 отдельные трети и сравнить между ними 1-2 и 2-3. Но тогда вы только что сделали 2 сравнения и в итоге узнали, в какой 1/3 находится имя. Однако, если вы просто делили его пополам каждый раз, вы бы знали, в какой 1/4 оно было более эффективным.
person
Alan
schedule
29.08.2014
math.log10
, гдеmath.log10(100)
возвращает ожидаемое2
. Ноmath.log(100)
возвращает4.605170185988092
. - person MikeiLL   schedule 29.08.2014