Często widziałem, że dyskretny logarytm jest trudnym problemem. Jednak nie bardzo rozumiem, jak to możliwe. Wydaje mi się, że zwykłe wyszukiwanie binarne dobrze sobie poradziłoby w tym celu. Na przykład,Algorytm logarytmiczny dyskretny
binary_search(base, left, right, target) {
if (pow(base, left) == target)
return left;
if (pow(base, right) == target)
return right;
if (pow(base, (left + right)/2) < target)
return binary_search(base, (left + right)/2, right, target);
else
return binary_search(base, left, (left + right)/2, target);
}
log(base, number) {
left = 1;
right = 2;
while(pow(base, p) < number) {
left = right;
right *= 2;
}
return binary_search(base, left, right, number);
}
Jeśli naiwny realizacja tylko zwiększając p
aż pow(base, p)
wynosi O (n), to z pewnością tego wyszukiwania binarnego wynosi O (log (n)^2).
Czy nie rozumiem, w jaki sposób jest mierzony ten algorytm?
Edytuj: Zazwyczaj nie piszę wyszukiwań binarnych, więc jeśli wystąpił jakiś drobny błąd w implementacji, po prostu zignoruj go lub edytuj w poprawce.
Jaka jest złożoność 'pow'? –
@JoshLee: Logarytmiczna w mocy, najwyżej. – Puppy
Wypróbuj ten http://en.wikipedia.org/wiki/Baby-step_giant-step – kilotaras