O que é análise amortizada de algoritmos? [fechadas]


85

Como é diferente da análise assintótica? Quando você o usa e por quê?

Eu li alguns artigos que parecem ter sido bem escritos, como estes:

mas ainda não entendi totalmente esses conceitos.

Então, alguém pode simplificar isso para mim?


5
Provavelmente pertence a programmers.stackexchange.com
lanzz

2
@lanzz Talvez agora pertencesse a cs.stackexchange.com
nbro

Um grande tópico sobre o significado de Tempo Amortizado Constante .
RBT de

Respostas:


88

A análise amortizada não multiplica ingenuamente o número de invocações com o pior caso para uma invocação.

Por exemplo, para uma matriz dinâmica que dobra de tamanho quando necessário, a análise assintótica normal apenas concluiria que adicionar um item a ela custa O (n), porque pode ser necessário aumentar e copiar todos os elementos para a nova matriz. A análise amortizada leva em consideração que, para ter que crescer, n / 2 itens devem ter sido adicionados sem causar um crescimento desde o crescimento anterior, então adicionar um item realmente leva apenas O (1) (o custo de O (n) é amortizado em n / 2 ações).

A análise amortizada não é o mesmo que um "desempenho médio" - a análise amortizada oferece uma garantia sólida sobre o que o desempenho fará se você fizer tantas ações.


1
"A análise amortizada leva em consideração que para ter que crescer, n / 2 itens devem ter sido adicionados sem causar um crescimento desde o crescimento anterior, então adicionar um item realmente leva apenas O (1) (o custo de O (n) é amortizado em n / 2 ações). " Isso era muito confuso e pouco claro.
AleksandrH

@AleksandrH alguma parte específica disso?
Harold

Sim, é difícil seguir a matemática sem uma explicação de onde os números estão vindo
AleksandrH

44

Existem muitas respostas para "o quê", mas nenhuma para "por quê".

Como todo mundo já disse, a análise assintótica trata de como o desempenho de uma determinada operação é dimensionado para um grande conjunto de dados. A análise amortizada é sobre como a média do desempenho de todas as operações em um grande conjunto de dados é dimensionada. A análise amortizada nunca fornece limites piores do que os assintóticos e, às vezes, fornece limites muito melhores.

Se você está preocupado com o tempo total de execução de um trabalho mais longo, provavelmente você se preocupa com os melhores limites da análise amortizada. É por isso que as linguagens de script (por exemplo) costumam ficar felizes em aumentar matrizes e tabelas de hash por algum fator, mesmo que seja uma operação cara. (O crescimento pode ser uma O(n)operação, mas amortizado é O(1)porque você raramente o faz.)

Se você estiver fazendo programação em tempo real (as operações individuais devem ser concluídas em um tempo previsível), os melhores limites da análise amortizada não importam. Não importa se a operação em média foi rápida, se você falhou em terminar a tempo de voltar e ajustar a serra de fita antes de cortar muito ...

O que importa no seu caso depende exatamente de qual é o seu problema de programação.


1
"O crescimento pode ser uma operação O (n), mas amortizado é O (1) porque você faz isso raramente" Eu acho que essa declaração realmente precisa de uma prova matemática rigorosa.
novembro

"Se você está fazendo programação em tempo real ...", deve ser mais preciso e explicar exatamente por que esse parágrafo deve ser considerado "verdadeiro".
novembro

1
@nbro Por que você acha que "deveria"? A questão pergunta como a análise amortizada difere da assintótica e quando você deseja usar cada uma. Tem links para artigos que explicam como fazê-los. Portanto, a análise matemática parece redundante. Quanto à programação em tempo real, eu queria explicar isso. A programação em tempo real é a programação em que as operações individuais devem ser concluídas em um tempo previsível. Um exemplo típico é a programação embarcada, onde você precisa monitorar algo em intervalos regulares. Como controlar máquinas. Neste caso, operações lentas ocasionais não são aceitáveis.
btilly

27

Análise assintótica

Este termo se refere à análise do desempenho do algoritmo sob a suposição de que os dados nos quais o algoritmo opera (a entrada ) são, em termos leigos, "grandes o suficiente para que aumentá-los não altere a conclusão". Embora o tamanho exato da entrada não precise ser especificado (precisamos apenas de um limite superior), o conjunto de dados em si deve ser especificado.

Observe que até agora falamos apenas sobre o método de análise; não especificamos exatamente qual quantidade estamos analisando (complexidade do tempo? complexidade do espaço?), e nem especificamos em qual métrica estamos interessados ​​(pior caso? melhor caso? média?).

Na prática, o termo análise assintótica comumente se refere ao limite superior da complexidade de um algoritmo, ou seja, o pior caso de desempenho medido pelo tempo total de execução, que é representado pela notação big-Oh (por exemplo, um algoritmo de classificação pode ser O(nlogn)).

Análise amortizada

Este termo se refere à análise do desempenho do algoritmo com base em uma sequência específica de operações que visa o pior cenário - ou seja, a análise amortizada implica que a métrica é o pior caso de desempenho (embora ainda não diga qual quantidade está sendo medida ) Para realizar essa análise, precisamos especificar o tamanho da entrada, mas não precisamos fazer nenhuma suposição sobre sua forma.

Em termos leigos, a análise amortizada é escolher um tamanho arbitrário para a entrada e, em seguida, "reproduzir" o algoritmo. Sempre que uma decisão que depende da entrada deve ser tomada, o pior caminho é escolhido¹. Depois que o algoritmo foi executado até a conclusão, dividimos a complexidade calculada pelo tamanho da entrada para produzir o resultado final.

¹note: Para ser preciso, o pior caminho que é teoricamente possível . Se você tem um vetor que dobra de tamanho dinamicamente cada vez que sua capacidade se esgota, "pior caso" não significa supor que ele precisará dobrar a cada inserção, porque as inserções são processadas como uma sequência. Temos permissão para (e de fato devemos) usar o estado conhecido para eliminar matematicamente o máximo de casos "ainda piores" que pudermos, mesmo enquanto a entrada permanecer desconhecida.

A diferença mais importante

A diferença crítica entre a análise assintótica e amortizada é que a primeira depende da própria entrada, enquanto a última depende da sequência de operações que o algoritmo executará.

Portanto:

  • a análise assintótica permite-nos afirmar que a complexidade do algoritmo quando é dada uma entrada de melhor / pior / caso médio de tamanho que se aproxima de N é limitada por alguma função F (N) - onde N é uma variável
  • a análise amortizada nos permite afirmar que a complexidade do algoritmo quando recebe uma entrada de características desconhecidas, mas tamanho N conhecido não é pior do que o valor de uma função F (N) - onde N é um valor conhecido

7
A resposta acima demonstra por que as pessoas não devem cegamente aprovar respostas longas de pessoas de alto escalão.
finalmente,

2
@btilly: Seu feedback seria muito mais útil se fosse acionável - isto é, você pode me dar uma ideia do que exatamente está errado com esta resposta e como melhorá-la?
Jon

7
por onde começar? Você definiu ambos os termos incorretamente e forneceu muitos detalhes esclarecedores que também estavam errados. Para um exemplo aleatório, a análise amortizada nem sempre é o pior caso. Caso contrário, não poderíamos dizer que o desempenho amortizado da inserção em um hash redimensionado dinamicamente é O(1).
provavelmente

@btilly CLRS página 451 diz "... a análise amortizada garante o desempenho médio de cada operação no pior caso."
Glen Selle

1
@GlenSelle A análise amortizada é uma técnica matemática. Ele pode ser usado para uma variedade de finalidades, incluindo desempenho no pior caso. No entanto, não tem que ser o pior caso. No seu caso, aparentemente foi usado para o pior caso. No caso de hashing, não foi.
btilly

14

A resposta para isso é definida de forma sucinta pela primeira frase do capítulo Análise Amortizada do livro - Introdução aos Algoritmos:

Em uma análise amortizada , o tempo necessário para executar uma sequência de operações de estrutura de dados é calculado sobre todas as operações realizadas.

Representamos a complexidade do crescimento de um programa por análise assintótica - que limita o crescimento do programa por uma função e define o pior, o melhor ou o caso médio disso.

Mas isso pode ser enganoso nos casos em que há apenas um caso em que a complexidade do programa atinge o pico, mas, em geral, o programa não exige muitos cálculos.

Portanto, faz mais sentido calcular a média do custo em uma sequência de operações, mesmo que uma única operação possa ser cara. Esta é a análise amortizada!

A análise amortizada é uma alternativa à técnica assintótica usada para calcular a complexidade. Ajuda-nos a calcular uma complexidade mais verdadeira em termos de praticidade, de forma a comparar e decidir entre dois ou mais algoritmos.


5

A melhor referência que encontrei até agora para compreender a análise amortizada de algoritmos está no livro Introdução aos Algoritmos , terceira edição, capítulo 17: "Análise Amortizada". Está tudo lá, explicado muito melhor do que o que pode ser encontrado em uma postagem do Stack Overflow. Você encontrará o livro na biblioteca de qualquer universidade decente.


Sim. Ler sobre o algoritmo Amortizado do livro mencionado foi melhor e finalmente deu clareza.
Rajesh Mappu,

2

A análise assintótica regular examina o desempenho de uma operação individual assintoticamente, em função do tamanho do problema. A notação O () é o que indica uma análise assintótica.

A análise amortizada (que também é uma análise assintótica) analisa o desempenho total de várias operações em uma estrutura de dados compartilhada .

A diferença é que a análise amortizada normalmente prova que o cálculo total necessário para M operações tem uma garantia de desempenho melhor do que M vezes o pior caso para a operação individual.

Por exemplo, uma operação individual em uma árvore splay de tamanho N pode levar até O (N) tempo. No entanto, uma sequência de M operações em uma árvore de tamanho N é limitada pelo tempo O (M (1 + log N) + N log N), que é aproximadamente O (log N) por operação. No entanto, observe que uma análise amortizada é muito mais estrita do que uma análise de "caso médio": ela prova que qualquer sequência possível de operações satisfará seu pior caso assintótico.


1

A análise amortizada lida com o custo total em várias execuções da rotina e os benefícios que podem ser obtidos com isso. Por exemplo, pesquisar uma matriz não classificada de n itens para uma única correspondência pode levar até n comparações e, portanto, é o (n) complexidade. No entanto, se soubermos que o mesmo array será pesquisado por m itens, repetir a tarefa total teria complexidade O (m * n). No entanto, se classificarmos o array antecipadamente, o custo é O (n log (n)), e pesquisas sucessivas levam apenas O (log (n)) para um array classificado. Assim, o custo amortizado total para m elementos usando esta abordagem é O (n * log (n) + m * log (n)). Se m> = n, isso equivale a O (n log (n)) por pré-classificação em comparação com O (n ^ 2) para não classificar. Assim, o custo amortizado é mais barato.

Simplificando, gastando um pouco mais no início, podemos economizar muito mais tarde.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.