Se eu tiver alguma função cuja complexidade de tempo seja O ( mn ), onde m e n são os tamanhos de suas duas entradas, chamaríamos sua complexidade de tempo de "linear" (já que é linear em m e n ) ou "quadrática" ( já que é um produto de dois tamanhos)? Ou alguma outra coisa?
Sinto que chamá-lo de "linear" é confuso porque O (m + n) também é linear, mas muito mais rápido, mas sinto que chamá-lo de "quadrático" também é estranho porque é linear em cada variável separadamente.
terminology
asymptotics
landau-notation
Mehrdad
fonte
fonte
Respostas:
Em matemática, funções como essa são chamadas funções multilineares . Mas os cientistas da computação provavelmente não conhecerão essa terminologia. Esta função deve definitivamente não ser chamado linear, tanto em matemática ou ciência da computação, a menos que você pode razoavelmente considerar um dos e n uma constante.m n
fonte
Para esclarecer a discussão nos comentários, é importante o que você está medindo em relação ao crescimento.
Conforme mencionado por @Kaveh, não é linear nos dois ao mesmo tempo, mas é linear se um for uma constante e o outro crescer.O ( m n )
Por outro lado, provavelmente seria considerado linear. Intuitivamente, se m dobrar, ou se n dobrar, ou mesmo se m e n dobrarem, m + n não poderá mais que dobrar. Isso não é verdade para m n ; se m e n, o dobro de m n, aumenta em 4. É por isso que em muitos contextos esse tempo de execução seria considerado quadrático. Eu dou um exemplo disso com correspondência de string em alguns parágrafos.O ( m + n ) m n m n m+n mn m n mn
Mas geralmente quando você está usando a notação Big- , está usando-a em referência a algo em particular. Como somos na maioria teóricos, geralmente é o tamanho da entrada para o problema.O
Vamos pegar Matrix Addition, por exemplo. Adicionar duas matrizes leva tempo O ( m n ) . Mas cada elemento de nossa entrada é tocado apenas uma vez, então isso geralmente seria chamado linear. Em outras palavras, nossa entrada é do tamanho O ( m n ) , portanto, um tempo de execução de O ( m n ) é linear no tamanho da entrada.m×n O(mn) O(mn) O(mn)
Agora, vejamos a correspondência de cadeias - ou seja, recebemos uma cadeia de tamanho e uma cadeia de tamanho n e queremos ver se há uma ocorrência da cadeia menor na cadeia maior. Podemos verificar isso ingenuamente em O ( m n ) tempo; isso geralmente seria considerado quadrático. Por quê? Se m e n puder ser qualquer coisa, defina m = n . Então nosso tempo de execução é O ( m 2 ) e nossa entrada é de tamanho 2 m .m n O(mn) m n m=n O(m2) 2m
Por outro lado, se usarmos o algoritmo Rabin-Karp , obtemos (em média) tempo . Nossa entrada consistia em ambas as cadeias, então nossa entrada também era do tamanho O ( m + n ) . Portanto, isso geralmente seria chamado de linear.O(m+n) O(m+n)
Resumindo: geralmente é chamado linear para coisas como multiplicação de matrizes porque é linear no tamanho da entrada, mas geralmente é chamado quadrático para coisas como correspondência de cadeias por causa da entrada menor. O termo apropriado depende do contexto em que você o está usando.O(mn)
fonte
Se você estiver medindo o tempo de execução em então O ( m n ) não é uma função linear em ( m , n ) . Se não houver relação entre m e n, essa função pode crescer quadraticamente em geral.(m,n) O(mn) (m,n) m n
No entanto, é uma função linear em cada um deles separadamente, ou seja, se você corrigir um deles e observar o crescimento na outra variável, será uma função linear em outro.
fonte
Para medir a complexidade dos problemas com várias entradas , uma maneira é encontrar a variável dominante e vincular outras entradas com base nessa variável. Com essa abordagem, você pode ter a função de complexidade baseada em uma única variável .
fonte
fonte