La croissance O (mn) est-elle considérée comme "linéaire" ou "quadratique"?

24

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.

Mehrdad
la source
7
Il est important de dire linéaire en quoi . Si, par exemple, nous avons un graphique avec arêtes et sommets, est linéaire dans le nombre d'arêtes, mais (potentiellement) quadratique dans le nombre de sommets. n O ( m + n )mnO(m+n)
Raphael
3
Je pense que le commentaire de Raphael est juste. "Linéaire" doit être utilisé par rapport à quelque chose, souvent la taille de l'entrée. Si vous transposez une matrice est "linéaire" car l'entrée a la taille . Si vous recherchez des occurrences d'une chaîne de caractères dans une chaîne de caractères , n'est pas linéaire --- serait. O ( m n ) O ( m n ) n m O ( m n ) O ( m + n )m×nO(mn)O(mn)nmO(mn)O(m+n)
SamM
3
Je serais également d'accord avec le commentaire de @ Raphael, mais en même temps, il n'est pas rare d'entendre des gens dire qu'une complexité temporelle particulière est "linéaire" sans mentionner par rapport à quoi. Et dans certains cas, cela n'a pas d'importance, par exemple O (m + n) est linéaire par rapport à toutes les entrées, donc je ne penserais pas à deux fois à l'appeler linéaire comme SamM l'a également fait ci-dessus. Mais cela soulève la question: qu'est-ce qui, le cas échéant, rend O (mn) non linéaire?
Mehrdad
3
@Mehrdad: Je pense que la ligne de base est "dans la taille d'entrée, en supposant que l'entrée est codée en chaîne binaire (sur une bande de machine de Turing)". Cette taille d'entrée est alors fonction de et lui-même. SamM donne de bons exemples. mnm
Raphael
1
Voir aussi people.cis.ksu.edu/~rhowell/asymptotic.pdf sur la notation landau en plusieurs variables.
Jonas Kölker

Réponses:

18

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.mn

Peter Shor
la source
Qu'est-ce qui rend raisonnable l' un de et n ? mn
user2768
11

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(mn)

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)mnmnm+nmnmnmn

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×nO(mn)O(mn)O(mn)

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 .mnO(mn)mnm=nO(m2)2m

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(mn)

SamM
la source
8

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(mn)(m,n)mn

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.

Kaveh
la source
3

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 .

Reza
la source
2
Il peut ne pas y avoir de variable dominante, par exemple si vous avez le nombre de nœuds et d'arêtes.
Raphael
0

Étant donné une langue et une fonction f telle que min { | w 1 | , | w 2 | } f ( | w | ) pour tout w = w 1 # w 2LL={w1#w2|wi(Σ{#}),}fmin{|w1|,|w2|}f(|w|)w=w1#w2Lvous 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)

frafl
la source