2015-02-09 22 views
5

Qual è la complessità della conversione di un numero n bit molto grande in una rappresentazione decimale?Complessità computazionale della conversione di base

Il mio pensiero è che l'algoritmo elementare della divisione intera ripetuta, prendendo il resto per ottenere ogni cifra, avrebbe la complessità O(M(n)log n), dove M(n) è la complessità dell'algoritmo di moltiplicazione; tuttavia, la divisione non è tra 2 numeri n bit ma piuttosto 1 numero bit n e un piccolo numero costante, quindi mi sembra che la complessità potrebbe essere minore.

+0

@xdavidliu: Non è necessario passare il tempo O (M (n)) per calcolare il quoziente e il resto di un intero grande per 10. È sufficiente il tempo lineare. – tmyklebu

+0

@tmyklebu non importa, sì che è corretto – xdavidliu

risposta

1

La conversione di base in Naive come descritto richiede tempo quadratico; fai circa n divisioni bigint-by-smallint, la maggior parte delle quali richiede tempo lineare nella dimensione del bitint n bit.

È possibile eseguire la conversione di base in tempo O (M (n) log (n)), tuttavia, selezionando una potenza di base di destinazione che è approssimativamente la radice quadrata del numero da convertire, facendo dividere e-resto da esso (che può essere fatto in tempo O (M (n)) tramite il metodo di Newton), e ricorsivamente sulle due metà.

+0

Suppongo che la mia domanda sia se la divisione con un numero piccolo può essere eseguita o meno nel tempo lineare O (n) o meno. Ad esempio, la divisione per 2 o 4 è banalmente O (1); c'è un algoritmo O (n) per divisione per 10? – Tanner

+0

come è divisione per 2 O (1)? dovrete spostare tutti i bit, no? –

+0

@Tanner, sì, la divisione per qualsiasi divisore fisso è O (n), dove n è la lunghezza del dividendo. Basta usare il solito algoritmo di divisione lunga. Permettere divisori arbitrari cambia le cose. – dfeuer