Diferença entre complexidade de tempo e complexidade computacional

14

Para medir a complexidade de um algoritmo, é complexidade de tempo ou complexidade computacional? Qual a diferença entre eles?

Eu costumava calcular a contagem máxima (pior) da operação básica (mais cara) no algoritmo.

Median Hilal
fonte
2
Não é uma resposta para sua pergunta, mas dado seu interesse por esse tipo de coisa, você também pode estar interessado em cs.stackexchange.com/q/13669/755
DW
1
"complexidade de um algoritmo" quando se refere a runime assintótico é um nome impróprio (freqüentemente usado). Você quer dizer "tempo de execução assintótico".
Raphael

Respostas:

9

A complexidade computacional é apenas um termo mais geral, pois o tempo não é o único recurso que podemos considerar. O próximo mais óbvio é o espaço que um algoritmo usa e, portanto, podemos falar sobre a complexidade do espaço , também como parte da complexidade computacional. De fato, podemos fazer isso para qualquer medida que você queira usar, é claro que algumas são mais úteis que outras.

Assim, contar o número de etapas que um algoritmo executa no pior caso fornece uma complexidade de tempo vinculada ao problema que resolve, contando quanta memória / quantas células de fita ele usa fornece uma complexidade de espaço vinculada etc. etc.

Lembre-se também de que, se você quiser ser rigoroso, a complexidade se refere ao problema, não ao algoritmo; portanto, um problema tem limites de complexidade, um algoritmo possui limites de recursos (tempo de execução, uso do espaço ...). É apenas uma questão de formalidade de definição, a teoria da complexidade lida com problemas. Sim, os algoritmos são um instrumento fundamental para a análise de problemas e complexidade e algorithmics estão estreitamente ligados, mas formalmente não diríamos Merge-Sort (um algoritmo) está em , é o problema S o r t i n g que está em P . A Merge-Sort usa certos recursos ( O ( n log n )PSortEungPO(nregistron)etapas, por exemplo). O limite de recursos e a correção do algoritmo implicam a complexidade (superior) do problema, mas são coisas diferentes. é também t C 0 -completo sob Uma C 0 -reductions, esta complexidade ligado só pode realmente ser indicado para um problema (mas não têm implicações algorítmicos).SortEungTC0 0UMAC0 0

Luke Mathieson
fonte
@shekharsuman Por problema, quero dizer a noção formal de um problema computacional (por exemplo, k-Vertex Cover), não o significado geral. A complexidade computacional é a classificação dos problemas computacionais, portanto, no sentido formal, a complexidade se refere ao que podemos dizer sobre o problema. Os resultados sobre algoritmos nos dizem coisas sobre a complexidade dos problemas, mas não são por si só resultados de complexidade (mas informalmente falamos sobre a complexidade de um algoritmo).
Luke Mathieson
1
@shekharsuman o parágrafo de abertura da página da Wikipedia é um resumo muito bom.
Luke Mathieson
@ Lucas Obrigado, isso deixa as coisas claras. No entanto, se eu puder usar o idioma "tipo de complexidade mais usado para avaliar formalmente algoritmos" (mesmo sabendo que isso não é preciso). O que seria tempo versus computacional? O que penso é que, em geral, o mais importante é o tempo, pois os recursos são mais extensíveis em algum sentido!
Median Hilal
1
O tempo @MedianHilal é realmente a medida mais comumente considerada para a complexidade de um problema. O espaço não está muito atrás (pelo menos por teóricos da complexidade e por pessoas lidando com conjuntos de dados muito grandes, menos no dia a dia).
Luke Mathieson
-2

A complexidade ciclomática é freqüentemente usada como a medida da complexidade computacional. Um exemplo útil é fornecido em /programming/9097987/calculation-of-cyclomatic-complexity

Pode haver muitos caminhos diferentes (possivelmente aninhados) por meio de um algoritmo, dando-lhe uma alta complexidade ciclomática, mas nenhum loop dando a ele uma baixa complexidade de tempo. Um programa com um único loop teria uma baixa complexidade ciclomática, mas possivelmente uma alta complexidade de tempo.

A complexidade ciclomática é frequentemente usada como uma medida da manutenção necessária para o código. Uma discussão mais detalhada é fornecida em http://docs.sonarqube.org/display/SONAR/Bad+Distribution+of+Complexity . Isso é diferente da complexidade do tempo, que é a medição do tempo de execução do código e pode ser usada para avaliar a percepção dos usuários sobre a eficácia do sistema.

aveludado
fonte
A questão é sobre complexidade computacional, não sobre complexidade ciclomática!
Am_I_Helpful
Você pode querer ler o OP - ele está perguntando sobre a complexidade de um algoritmo - complexidade Cyclomatic dá uma medida estática de um algoritmos de complexidade computacional - tente adicionar um feedback positivo na próxima vez
velvetytoast
2
A complexidade ciclomática não mede a complexidade computacional. A complexidade computacional refere-se ao tempo de execução, não à complexidade da estrutura do código-fonte.
DW
@DW Mais precisamente, a complexidade computacional refere-se aos recursos necessários para resolver um problema (que pode incluir espaço, alternância, chamadas de oracle e assim por diante, além de tempo).
precisa saber é o seguinte
@DavidRicherby Não sou especialista nisso, portanto, corrija se estiver errado. Medidas de complexidade estática, como o tamanho do programa, desempenham algum papel em alguma situação. Estou correto que está mais relacionado à complexidade de Kolmogorov. Esse também seria o caso da complexidade ciclomática? Um tipo de complexidade para escrever programas ou problemas, e outro para resolvê-los ou executá-los ... possivelmente uma breve aproximação da situação. Não tenho certeza se escreveria uma pergunta sensata sobre isso.
Babou