Abaixo, suponha que estamos trabalhando com uma máquina de Turing com fita infinita.
Ao explicar a noção de complexidade de tempo a alguém e por que ela é medida em relação ao tamanho de entrada de uma instância, deparei-me com a seguinte afirmação:
[..] Por exemplo, é natural que você precise de mais etapas para multiplicar dois números inteiros com 100000 bits do que, digamos, multiplicar dois números inteiros por 3 bits.
A alegação é convincente, mas de alguma forma, acenando com a mão. Em todos os algoritmos que deparei, quanto maior o tamanho da entrada, mais etapas você precisará. Em palavras mais precisas, a complexidade do tempo é uma função monotonicamente crescente do tamanho da entrada.
Será que a complexidade do tempo é sempre uma função crescente no tamanho da entrada? Se sim, por que é esse o caso? Existe uma prova disso além do acenar com a mão?
Respostas:
Não. Considere uma máquina de Turing que pare após etapas quando o tamanho de entrada n for par e pare após n 2 etapas quando n for ímpar.n n n2 n
Se você quer dizer a complexidade de um problema , a resposta ainda é não. A complexidade do teste de primalidade é muito menor para números pares do que para números ímpares.
fonte
Deixe denotar o tamanho da entrada. Para ler toda a entrada, uma máquina de turing já precisa de n etapas. Portanto, se você assumir que um algoritmo deve ler toda a entrada (ou n / c para alguma constante c ), sempre terá pelo menos tempo de execução linear.n n n / c c
O problema com a definição de algoritmos com uma "função de tempo de execução que diminui monotonicamente" é que você precisa definir o tempo de execução para alguma forma. Você precisa configurá-lo para algum valor finito . Mas existem infinitos valores possíveis para n > 1 , então você acaba com uma função que é constante para muitos valores infinitos.n = 1 n > 1
Provavelmente algoritmos sublineares são de seu interesse, que não leem toda a entrada. Veja, por exemplo, http://www.dcs.warwick.ac.uk/~czumaj/PUBLICATIONS/DRAFTS/Sublinear-time-Survey-BEATCS.pdf .
fonte
Dito isto, os tempos de execução médios podem conter componentes oscilantes, por exemplo, o Mergesort .
fonte