Uma complexidade de tempo Big-Oh pode conter mais de uma variável?

11

Digamos, por exemplo, que estou processando strings que requer alguma análise de duas strings. Eu não tenho informações sobre o que seus comprimentos podem acabar sendo, então eles vêm de duas famílias distintas. Seria aceitável chamar a complexidade de um algoritmo ou (dependendo se usamos um algoritmo ingênuo ou otimizado)?O ( n + m )O(nm)O(n+m)

Do mesmo modo, suponhamos que o algoritmo que escolhemos realmente requer dois estágios - uma fase de configuração na primeira string que nos permite processar qualquer número de outras strings sem incorrer nesse custo inicial. Seria apropriado dizer que tem uma construção seguida por qualquer número de cálculos de ?O ( m )O(n)O(m)

Seria apropriado chamá-los de porque ambos os cálculos são lineares?O(n)

corsiKa
fonte
Veja os comentários sobre esta resposta para um pouco de experiência - meu respeito ao @corsiKa por fazer tão bravamente uma pergunta tão controversa.
OldCurmudgeon
@OldCurmudgeon, entendo. Eu odiaria entrar nesse tópico de comentários. Oldcurmudgeon, você está discutindo sobre a notação big-O sem entender a notação big-O? Estranho mesmo. Além disso, você e corsiKa estão discutindo sobre tempo de execução sem definir os parâmetros e - uma receita para problemas de comunicação. Dica: uma convenção comum ao lidar com strings é concordar em usar para usar o comprimento de uma string no comprimento de outra string - mas, idealmente, é provavelmente melhor deixar isso explícito, pois, caso contrário, poderá causar confusão (como ilustrado aqui). nmmn
DW
@DW É possível que o OldCurmudgeon simplesmente tenha aprendido uma definição diferente na escola ... como aponto em um comentário abaixo, é possível evitar várias variáveis, embora eu nunca tenha pensado em fazê-lo até agora. Talvez isso - ou algo parecido - costumava ser padrão?
precisa saber é o seguinte
2
Eu acho que isso tem respostas suficientes aqui e aqui .
Raphael

Respostas:

14

Sim, claro. Isso é bom e perfeitamente aceitável. É comum e padrão ver algoritmos cujo tempo de execução depende de dois parâmetros.

Por exemplo, você verá frequentemente o tempo de execução da busca pela profundidade expressa como , onde é o número de vértices e é o número de arestas no gráfico. Isso é perfeitamente válido. O significado disso é que existe uma constante e os números modo que o tempo de execução do algoritmo seja no máximo , para todos os . Em outras palavras, se o tempo de execução exato for , dizemos que se existir modo que e implicaO(n+m)nmcn0,m0c(n+m)n>n0,m>m0f(n,m)f(n,m)=O(n+m)c,n0,m0n>n0m>m0f(n,m)c(n+m) .

Sim, é perfeitamente apropriado e aceitável dizer que o primeiro estágio leva tempo e o segundo estágio leva tempo .O(n)O(m)

Importante: Certifique-se de definir o que e são. Você não pode dizer "este é um algoritmo de tempo " sem especificar o que é. Se não estiver especificado na declaração do problema, você precisará especificá-lo. Por exemplo, consulte algoritmos de gráfico, onde geralmente definimos # de vértices e # de arestas.nmO(n)nnn=m=

Tanto quanto você pode chamá-los de tempo , não, claro que não - a menos que você saiba que . Obviamente, se você sabe que , segue-se que ; portanto, um algoritmo de tempo também é um algoritmo de tempo . Mas se não houver garantia de que , não será possível chamá-lo de algoritmo de tempo .m = O ( n ) m = O ( n ) m + n = O ( n ) O ( m + n ) O ( n ) m = O ( n ) O ( n )O(n)m=O(n)m=O(n)m+n=O(n)O(m+n)O(n)m=O(n)O(n)

Isso é coisa básica. Você encontrará tudo isso em livros didáticos de algoritmos.

DW
fonte
11
@ OldCurmudgeon, é provável que você encontre exemplos disso em muitos livros didáticos de algoritmos padrão. Para quem você olhou? Você já tentou examinar o capítulo sobre pesquisa em profundidade (o exemplo que mencionei na minha resposta)?
DW
2
@OldCurmudgeon Na minha edição do CLRS, o exercício 3.1-8 apresenta exatamente essa definição da anotação para funções de muitas variáveis. E seu limite superior no tempo de execução de dfs é para um gráfico . O ( V + E ) ( V , E )OO(V+E)(V,E)
Kirill
2
@ Kirill Meu argumento era que é concebível, em algum momento no passado, era considerado habitual considerar apenas o comprimento total agregado, na medida em que fazer o contrário poderia ter sido considerado um erro. Se você está avaliando o exame de um aluno e esse aluno usou o comprimento total da entrada como variável para a complexidade temporal do DFS, consideraria um erro não considerar duas dimensões (V e E)? O que é verdade e o que as pessoas estão dispostas a conceder nem sempre são a mesma coisa. n
Patrick87
11
Eu concordo na medida em que todos usam a notação Landau dessa maneira, mas quase ninguém sabe o que realmente significa (a menos que você conecte os parâmetros funcionalmente). Veja também o artigo vinculado na resposta de A. Schulz aqui, que começa afirmando que o uso "básico" e "comum" está errado.
Raphael
11
@ Patrick87 A teoria da complexidade usa, em virtude da definição de muitas classes conhecidas, principalmente o comprimento da entrada (com notáveis ​​exceções). A análise do algoritmo está - quando realizada com seriedade - interessada em aprender algo sobre o uso real de recursos (na medida em que o modelo permite), de modo que outros parâmetros se tornem mais interessantes para pintar a imagem inteira (com mais precisão).
Raphael