Временная сложность алгоритма: важно ли указать основание логарифма?

19

Поскольку существует только константа между основаниями логарифмов, не так ли просто написать f(n)=Ω(logn) , в отличие от Ω(log2n) , или какова бы ни была база?

Alex5207
источник

Ответы:

63

Это зависит от того, где находится логарифм. Если это просто фактор, то это не имеет значения, потому что big-O или θ позволяет вам умножить на любую константу.

Если вы берете O(2logn) то база важна. В базе 2 у вас будет только O(n) , в базе 10 - около O(n0.3010) .

gnasher729
источник
5
Я думаю, что это будет только что-то вроде . Я не вижу причин для того, чтобы выражать число как2clogbn,а неn-to-what-it-is (за исключением, возможно, промежуточного этапа вычисления). 2logn2clogbnn
Дэвид Ричерби
7
+1 за «постоянные факторы имеют значение в показателях»
троянцы
50

Поскольку асимптотические обозначения не учитывают постоянные множители, а любые два логарифма отличаются постоянным множителем, основание не имеет значения: logan=Θ(logbn) для всех a,b>1 . Таким образом, нет необходимости указывать основание логарифма при использовании асимптотической записи.

Юваль Фильмус
источник
13
Я предпочитаю видеть вместо ==
Наюки
16
Я боюсь, что стандартное обозначение использует . =
Юваль Фильмус
4
@YuvalFilmus Стандартные обозначения вводят в заблуждение, они совершенно иные, чем везде, и делают алгоритмическую сложность совершенно чуждой вещам, схожим с ней. «Это стандартное обозначение» никогда не должно быть причиной для того, чтобы отдать предпочтение плохому решению по сравнению с лучшим, столь же понятным. (Значение символа обычно ясно из контекста, во всяком случае.)
wizzwizz4
7
@ wizzwizz4 Обычная практика - отличная причина. Это способствует эффективному общению. Вот почему мы все смирились с причудами английского правописания.
Юваль Фильмус
3
Иногда просто содержит слишком много материала, чтобы быть понятнее, чем log a n = Θ ( log b n ) . nloganΘ(nlogbn)logan=Θ(logbn)
JiK
15

As logxy=1logyx иlogxy=logzylogzx , поэтому loganlogbn=lognblogna=logablogaba,b>1logan=Θ(logbn)

О, мой бог
источник
8

В большинстве случаев безопасно отбрасывать основание логарифма, потому что, как указывали другие ответы, формула изменения базиса для логарифмов означает, что все логарифмы являются постоянными, кратными друг другу.

В некоторых случаях это небезопасно. Например, @ gnasher729 указал, что если у вас есть логарифм в показателе степени, то логарифмическое основание действительно значимо.

Я хотел указать на другой случай, когда основание логарифма является значительным, и это случаи, когда основание логарифма напрямую зависит от параметра, указанного в качестве входного значения для задачи. Например, алгоритм сортировки по основанию работает, выписывая числа в некоторой базебразложение входных чисел на их базовыебцифры, затем с помощью сортировки подсчета, чтобы отсортировать эти числа по одной цифре за раз. Работа за раундΘ(N+б) и есть примерно журналбU раунды (где U максимальное входное целое число), поэтому общее время выполнения O((n+b)logbU). For any fixed integer b this simplifies to O(nlogU). However, what happens if b isn't a constant? A clever technique is to pick b=n, in which case the runtime simplifies to O(n+lognU). Since lognU = logUlogn, the overall expression simplifies to O(nlogUlogn). Notice that, in this case, the base of the logarithm is indeed significant because it isn't a constant with respect to the input size. There are other algorithms that have similar runtimes (an old analysis of disjoint-set forests ended up with a term of logm/2+2 somewhere, for example), in which case dropping the log base would interfere with the runtime analysis.

Another case in which the log base matters is one in which there's some externally-tunable parameter to the algorithm that control the logarithmic base. A great example of this is the B-tree, which requires some external parameter b. The height of a B-tree of order b is Θ(logbn), where the base of the logarithm is significant in that b is not a constant.

To summarize, in the case where you have a logarithm with a constant base, you can usually (subject to exceptions like what @gnasher729 has pointed out) drop the base of the logarithm. But when the base of the logarithm depends on some parameter to the algorithm, it's usually not safe to do so.

templatetypedef
источник