2015-02-09 35 views
5

Jaka jest złożoność konwersji bardzo dużej liczby n-bitowej na reprezentację dziesiętną?Obliczeniowa złożoność konwersji bazy

Moja myśl jest taka, że ​​elementarny algorytm powtarzanego podziału całkowitoliczbowego, pobierający pozostałość w celu uzyskania każdej cyfry, miałby złożoność O(M(n)log n), gdzie M(n) jest złożonością algorytmu mnożenia; jednak podział nie jest między liczbami 2 n-bitowymi, ale raczej n-bitową liczbą i małą stałą liczbą, więc wydaje mi się, że złożoność może być mniejsza.

+0

@xdavidliu: Nie trzeba wydawać czasu O (M (n)), aby obliczyć iloraz i resztę dużej liczby całkowitej przez 10. Wystarczy czas liniowy. – tmyklebu

+0

@tmyklebu nieważne, tak, to jest poprawne – xdavidliu

Odpowiedz

1

Naiwna konwersja bazy, jak opisano, zajmuje kwadratowy czas; wykonujesz około n podziałów bigint-by-smallint, z których większość zajmuje czas liniowy w rozmiarze n-bitowego biginta.

Konwersję bazy można przeprowadzić w czasie O (M (n) log (n)), wybierając moc bazy docelowej, która jest w przybliżeniu pierwiastkiem kwadratowym liczby konwertowanej do konwersji, dzieląc- i - pozostała przez niego (można to zrobić w czasie O (M (n)) za pomocą metody Newtona) i recursing na dwóch połówkach.

+0

Domyślam się, że moje pytanie brzmi, czy podział przez małą liczbę może być dokonany w czasie liniowym O (n) lub mniej. Na przykład dzielenie przez 2 lub 4 jest trywialnie O (1); czy istnieje algorytm O (n) do dzielenia przez 10? – Tanner

+0

jak podział według 2 O (1)? będziesz musiał przesunąć wszystkie bity, nie? –

+0

@Tanner, tak, dzielenie przez dowolny stały dzielnik to O (n), gdzie n jest długością dywidendy. Wystarczy użyć zwykłego algorytmu długiego podziału. Dozwolone arbitralne dzielniki zmieniają rzeczy. – dfeuer