Si j'ai une fonction dont la complexité temporelle est O ( mn ), où m et n sont les tailles de ses deux entrées, appellerions-nous sa complexité temporelle "linéaire" (car elle est linéaire en m et n ) ou "quadratique" ( puisqu'il s'agit d'un produit de deux tailles)? Ou autre chose?
Je pense que l'appeler "linéaire" est déroutant parce que O (m + n) est également linéaire mais beaucoup plus rapide, mais j'ai l'impression que l'appeler "quadratique" est aussi bizarre car il est linéaire dans chaque variable séparément.
Réponses:
En mathématiques, des fonctions comme celle-ci sont appelées fonctions multilinéaires . Mais les informaticiens ne connaîtront probablement généralement pas cette terminologie. Cette fonction ne doit certainement pas être appelée linéaire, que ce soit en mathématiques ou en informatique, sauf si vous pouvez raisonnablement considérer l'un de et n comme une constante.m n
la source
Pour élucider la discussion dans les commentaires, il est important de savoir ce que vous mesurez la croissance par rapport.
Comme mentionné par @Kaveh, n'est pas linéaire dans les deux en même temps, mais est linéaire si l'un est une constante et que l'autre croît.O ( m n )
D'un autre côté, serait probablement considéré comme linéaire. Intuitivement, si m double, ou si n double, ou même si m et n double, m + n ne peut pas plus que doubler. Ce n'est pas le cas de m n ; si m et n doublent tous les deux m n . C'est pourquoi, dans de nombreux contextes, ce temps de fonctionnement serait considéré comme quadratique. Je donne un exemple de cela avec une correspondance de chaîne dans quelques paragraphes.O ( m + n ) m n m n m + n m n m n m n
Mais généralement, lorsque vous utilisez la notation Big- , vous l'utilisez en référence à quelque chose en particulier. Puisque nous sommes principalement des théoriciens, c'est généralement la taille de l'entrée du problème.O
Prenons l'exemple de Matrix Addition. L'ajout de deux matrices prend du temps O ( m n ) . Mais chaque élément de notre entrée n'est touché qu'une seule fois, ce qui est généralement appelé linéaire. En d'autres termes, notre entrée est de taille O ( m n ) , donc un temps d'exécution de O ( m n ) est linéaire dans la taille de l'entrée.m × n O ( m n ) O ( m n ) O ( m n )
Regardons maintenant la correspondance des chaînes - à savoir, on nous donne une chaîne de taille et une chaîne de taille n et nous voulons voir s'il y a une occurrence de la plus petite chaîne dans la plus grande chaîne. Nous pouvons vérifier cela naïvement en temps O ( m n ) ; cela serait généralement considéré comme quadratique. Pourquoi? Si m et n peuvent être n'importe quoi, définissez m = n . Ensuite, notre temps de course est O ( m 2 ) et notre entrée est de taille 2 m .m n O ( m n ) m n m = n O ( m2) 2 m
En revanche, si nous utilisons l' algorithme de Rabin-Karp , nous obtenons (en moyenne) le temps . Notre entrée était composée des deux chaînes, donc notre entrée était également de taille O ( m + n ) . Par conséquent, cela serait généralement appelé linéaire.O ( m + n ) O ( m + n )
Pour résumer: est généralement appelé linéaire pour des choses comme la multiplication matricielle car il est linéaire dans la taille de l'entrée, mais il est généralement appelé quadratique pour des choses comme la correspondance de chaînes en raison de l'entrée plus petite. Le terme approprié dépend du contexte dans lequel vous l'utilisez.O ( m n )
la source
Si vous mesurez le temps de course en alors O ( m n ) n'est pas une fonction linéaire en ( m , n ) . S'il n'y a pas de relation entre m et n, cette fonction peut croître de façon quadratique en général.( m , n ) O ( m n ) ( m , n ) m n
Cependant, c'est une fonction linéaire dans chacun d'eux séparément, c'est-à-dire que si vous fixez l'un d'eux et regardez la croissance dans l'autre variable, alors c'est une fonction linéaire dans l'autre.
la source
Pour mesurer la complexité des problèmes avec plusieurs entrées , une façon consiste à trouver la variable dominante , puis à délimiter d'autres entrées en fonction de cette variable. Avec cette approche, vous pourriez avoir la fonction de complexité basée sur une seule variable .
la source
Étant donné une langue et une fonction f telle que min { | w 1 | , | w 2 | } ≤ f ( | w | ) pour tout w = w 1 # w 2 ∈ LL = { w1# w2| wje∈ ( Σ ∖ { # } )∗, … } F min { | w1| , | w2| }≤f( | w | ) w = w1# w2∈ L vous pouvez estimer le temps d'exécution d'un algorithme qui reconnaît L comme
O ( f ( | w | ) ⋅ ( | w | - f ( | w | ) ) = O ( f ( | w | ) | w | - f ( | w | )O ( | w1| ⋅ | w2| ) L .O(f(|w|)⋅(|w|−f(|w|))=O(f(|w|)|w|−f(|w|)2)=O(f(|w|)|w|)
Cela signifie que vous obtenez un temps linéaire, si la plus petite partie de votre entrée est constante (par rapport à l'ensemble de l'entrée), quelque chose entre les deux (comme ) s'il s'agit d'un temps d'exécution sublinéaire et quadratique s'il est linéaire.O(nlogn)
la source