Complexidade temporal da adição

11

A Wikipedia lista a complexidade temporal da adição como , onde é o número de bits.nnn

Esse é um limite inferior teórico rígido? Ou isso é apenas a complexidade do algoritmo conhecido mais rápido atual. Eu quero saber, porque a complexidade da adição sublinha todas as outras operações aritméticas e todos os algoritmos que as utilizam.

É teoricamente impossível obter um algoritmo de adição que seja executado em ? Ou estamos vinculados à complexidade linear para adição.o(n)

Tobi Alafin
fonte

Respostas:

17

Se seu algoritmo usar assintoticamente menos que tempo, ele não terá tempo suficiente para ler todos os dígitos dos números que está adicionando. Você deve imaginar que está lidando com números muito grandes (armazenados, por exemplo, em arquivos de texto de 8 MB). Obviamente, a adição pode ser feita muito rapidamente em comparação com o valor dos números; ele será executado no tempo , se for o valor da soma.nNO(registro(N))N

Isso não significa que você pode acelerar um pouco as coisas; se seu processador manipular 32 bits a cada operação, você usará tempo, mas ainda será e não . O(n)o(n)n32.O(n)o(n)

Lieuwe Vinkhuijzen
fonte
Está lendo todos os dados teoricamente necessários. Para a adição de dois números quaisquer e . O cálculo , pode ser feito na operação , através de deslocamento. Anexando um . Considere isso. Se você não encontrar uma estimativa mais rápida para a soma, refine-a até que esteja correta. Em menos de operações? b , a : a b , a + b 2 a 2 a O ( 1 ) 0 numab,uma:umab,uma+b2uma2umaO(1)0 0n
precisa
3
Sim, é uma necessidade teórica, porque: cada bit da entrada é usado não trivialmente na saída , onde por não trivial quero dizer que não é a função de identidade. No seu exemplo , se pode ser calculado em tempo depende do modelo computacional: se anexar é uma operação em tempo constante, então sim. Se tiver acesso à RAM, você precisa de tempo para escrever o endereço do bit se você já sabe o comprimento de , ou tempo, se você tem que ler todos descobrir. Neste exemplo , muitos bits de saída são funções triviais dos bits de entrada.2uma2umaO(1)0 0O(registro(n))umaO(n)uma2uma
Lieuwe Vinkhuijzen
Eu tenho um algoritmo que encontra o comprimento de em . Ele usa pesquisa binária. umaO(registron)
precisa
3
@TobiAlafin Se o seu modelo suportar endereçamento de RAM, sua pesquisa binária será executada nas etapas , corrija. Na máquina de Turing e em um arquivo de texto não carregado na memória principal, isso leva tempo . Em qualquer um dos casos, para responder à sua pergunta, com ou sem endereçamento de RAM para acelerar a pesquisa, seu algoritmo precisará examinar todos os bits da entrada para calcular . Suponha-se que isso não aconteceu, e de uma entrada de bits não inspecionar a bit -ésimo. Então eu poderia virar esse pedaço, e daria a resposta errada. O(registron)O(n)uma+b42.6
Lieuwe Vinkhuijzen
1
Basicamente, todas as operações são , por esse motivo. A única exceção é se você estiver lidando com uma estrutura de dados de alguma forma ordenada: por exemplo, você não precisa visitar uma BST inteira para verificar se ela contém um determinado valor, mas isso é verdade apenas devido aos invariantes que acompanham a BST. Ω(n)
Bakuriu
7

Para que a análise de complexidade faça algum sentido formal, é necessário especificar um modelo computacional formal no qual o algoritmo no objeto está sendo executado ou, no mínimo, um modelo de custo , que especifica quais são as operações básicas e seus custos.

Na maioria dos contextos, supõe-se que operações aritméticas levem tempo . Isso geralmente é razoável, pois estamos interessados ​​na complexidade algorítmica, independentemente dos números envolvidos. Isso é chamado de modelo de custo uniforme .Θ(1)

Se os números puderem crescer sem limites, ou se estivermos interessados ​​em analisar as próprias operações, considera-se que as operações aritméticas têm custo , proporcional ao tamanho da entrada.Θ(|x|)

Agora, as operações podem ter um custo menor que isso? Possivelmente, no entanto, você precisará definir formalmente um modelo computacional no qual isso pode acontecer.

ordenação rápida
fonte
1
Como um exemplo adicional, um somador de carry-forward leva, sob suposições simplificadoras apropriadas, tempo para calcular a soma de dois números de n bits. Θ(registron)n
Fabio Somenzi
3

A entrada para adição é dois números arbitrários . Como eles são arbitrários, você deve ler cada bit e, portanto, o algoritmo é .Ω(n)

Imagine que seu algoritmo adiciona com êxito 1010100110 e 0010010110 sem ler cada bit. Para que seu algoritmo seja capaz de adicionar entradas arbitrárias , eu devo poder virar aleatoriamente qualquer um desses bits, e o algoritmo ainda gera uma adição correta (mas diferente). Mas se o seu algoritmo não lê todos os bits, como ele poderia dizer que a entrada invertida era diferente da entrada original?

murrdpirate
fonte
n
Absolutamente. Você apenas precisa definir o que "aproximado" significa no seu algoritmo. Dependendo dessa definição, a adição dos dois bits mais significativos pode ser uma soma aproximada, o que pode ser feito em o (n) tempo. Quando você menciona o algoritmo "adição", acho que todos entendemos que isso significa que a resposta deve ser exata.
murrdpirate