Вычисление рекуррентного отношения T (n)=T (n / log n) + Θ (1)
вопрос исходит от введение в алгоритмы 3-е издание, P63, проблема 3-6, где она представлена как Итерированных функций. Я переписываю его следующим образом:--19-->
int T(int n){
for(int count = 0; n > 2 ; ++count)
{
n = n/log₂(n);
}
return count;
}
тогда дайте как можно плотнее привязку на T(n)
.
я могу сделать это O(log n)
и Ω(log n / log log n)
, но может ли он быть плотнее?
PS: используя Mathematica, я узнал, что когда n=1*10^3281039
, T(n)=500000
и в то же время T(n)=1.072435*log n/ log log n
и коэффициент снижается с n
С 1.22943
(n = 2.07126*10^235
) к 1.072435
(n = 1*10^3281039
).
эта информация может быть полезной.
3 ответов
похоже, что нижняя граница довольно хороша, поэтому я попытался доказать, что верхняя граница O(log n / log log n)
.
Но позвольте мне сначала объяснить другие границы (просто для лучшего понимания).
TL; DR
T(n)
находится в Θ(log n / log log n)
.
T (n) находится в O(log n)
это можно увидеть, изменив n := n/log₂n
to n := n/2
.
Ему нужно O(log₂ n)
действия до n ≤ 2
держит.
T (n) находится в Ω(log n / log log n)
этот можно увидеть, изменив n := n/log₂(n)
to n := n/m
, где m
- начальное значение log n
.
Решение уравнения
n / (log n)x < 2
на x
приводит нас к
log n - x log log n < log 2 ⇔ log n - log 2 < x log log n ⇔ (log n - log 2) / log log n < x ⇒ x ∈ Ω(log n / log log n)
повышение верхней границы: O(log n) → O(log n / log log n)
теперь давайте попробуем улучшить верхнюю границу. Вместо того, чтобы разделять n
фиксированной константой (а именно 2
в приведенном выше доказательстве) разделяем n
пока начальное значение log(n)/2
как текущее значение log(n)
больше. Быть более четко посмотрите на измененный код:
int T₂(int n){
n_old = n;
for(int count=0; n>2 ;++count)
{
n = n / (log₂(n_old)/2);
if(log₂(n)) <= log₂(n_old)/2)
{
n_old = n;
}
}
return count;
}
сложность функции T₂
явно является верхней границей для функции T
С log₂(n_old)/2 < log₂(n)
держит на все время.
теперь нам нужно знать, сколько раз мы делим на каждого 1/2⋅log(n_old)
:
n / (log(sqrt(n)))x ≤ sqrt(n) ⇔ n / sqrt(n) ≤ log(sqrt(n))x ⇔ log(sqrt(n)) ≤ x log(log(sqrt(n))) ⇔ log(sqrt(n)) / log(log(sqrt(n))) ≤ x
Итак, мы получаем формулу повторения T₂(n) = T(sqrt(n)) + O(log(sqrt(n)) / log(log(sqrt(n))))
.
теперь нам нужно знать, как часто эта формула должна быть расширена до n < 2
зацепки.
n2-x < 2 ⇔ 2-x⋅log n < log 2 ⇔ -x log 2 + log log n < log 2 ⇔ log log n < log 2 + x log 2 ⇔ log log n < (x + 1) log 2
поэтому нам нужно расширить формулу о log log n
раза.
теперь это становится немного сложнее. (Посмотрите также на Mike_Dog это)
T₂(n) = T(sqrt(n)) + log(sqrt(n)) / log(log(sqrt(n))) = Σk=1,...,log log n - 1 2-k⋅log(n) / log(2-k⋅log n)) = log(n) ⋅ Σk=1,...,log log n - 1 2-k / (-k + log log n)) (1) = log(n) ⋅ Σk=1,...,log log n - 1 2k - log log n / k = log(n) ⋅ Σk=1,...,log log n - 1 2k ⋅ 2- log log n / k = log(n) ⋅ Σk=1,...,log log n - 1 2k / (k ⋅ log n) = Σk=1,...,log log n - 1 2k / k
в строке, отмеченной (1), я переупорядочил сумму.
Итак, в конце мы "всего лишь" вычислить Σk=1,...,t 2k / k
на t = log log n - 1
. На данный момент Maple решает это до
Σk=1,...,t 2k / k = -I⋅π - 2t⋅LerchPhi(2, 1, t) +2t/t
здесь I
является мнимой единицей и LerchPhi
- это Лерх запредельным. Поскольку результат для суммы выше является действительным числом для всех соответствующих случаев, мы можем просто игнорировать все мнимые части. Лерх трансцендентный!--39--> кажется O(-1/t)
, но я не на 100% уверен в этом. Может, кто-нибудь докажет это.
наконец, это приводит к
T₂(n) = -2t⋅O(-1/t) + 2t/t = O(2t/t) = O(log n / log log n)
все вместе T(n) ∈ Ω(log n / log log n)
и T(n) ∈ O(log n/ log log n)
,
так что T(n) ∈ Θ(log n/ log log n)
держит. Этот результат также поддерживается данными примера.
I надеюсь, это понятно и немного помогает.
кишки проблемы проверки предполагаемой оценки заключается в том, чтобы получить хорошую оценку затыкания значения
n / log(n)
функции
n --> log(n) / log(log(n))
Теорема:
log( n/log(n) ) / log(log( n/log(n) )) = log(n)/log(log(n)) - 1 + o(1)
(в случае проблем с удобочитаемостью шрифта, это мало-о, не большой-о)
доказательство:
чтобы сэкономить на нотации, напишите
A = n
B = log(n)
C = log(log(n))
работа основана на приближении первого порядка к (естественный) логарифм: когда 0 < y < x
,
log(x) - y/x < log(x - y) < log(x)
значение, которое мы пытаемся оценить, это
log(A/B) / log(log(A/B)) = (B - C) / log(B - C)
применение границ для логарифма разности дает
(B-C) / log(B) < (B-C) / log(B-C) < (B-C) / (log(B) - C/B)
то есть
(B-C) / C < (B-C) / log(B-C) < (B-C)B / (C (B-1))
и рекурсия, которую мы пытаемся удовлетворить, и нижняя граница предполагают, что мы должны оценить это с B/C - 1
. Потянув, что с обеих сторон дает
B/C - 1 < (B-C) / log(B-C) < B/C - 1 + (B-C)/(C(B-1))
и таким образом мы заключение
(B-C) / log(B-C) = B/C - 1 + o(1)
если вы уберете одну идею из этого анализа, чтобы использовать ее самостоятельно, пусть это будет точка использования дифференциальных аппроксимаций (или даже рядов Тейлора более высокого порядка) для замены сложных функций более простыми. например, если у вас есть идея использовать
log(x-y) = log(x) + Θ(y/x) when y = o(x)
тогда все алгебраические вычисления, необходимые для вашей проблемы, просто следуют непосредственно.
Спасибо за ответ @AbcAeffchen
Я владелец вопроса, используя знания "мастер-метода", которые я узнал вчера," немного сложнее " часть доказательства может быть сделана следующим образом.
начну здесь:
T(n) = T(sqrt(n)) + O(log(sqrt(n)) / log(log(sqrt(n))))
⇔ T(n)=T(sqrt(n)) + O(log n / log log n)
пусть
n=2k, S(k)=T (2k)
затем у нас есть
T (2k) =T (2k / 2) + O (log 2k / log log 2k) ⇔ S(k) =S( k/2) + O (k/log k)
С помощью метода master
S(k)=a*S(k/b)+f (k), где
a=1, b=2
, f (k)=k / log k = Ω (klog21 +ε) = Ω (kε),
пока ε∈(0,1)
таким образом, мы можем применить случай 3. Тогда
S(k) = O (k/log k)
T (n) = S(k) = O(k/log k) = O (log n/ log N)