Une complexité temporelle Big-Oh peut-elle contenir plusieurs variables?

11

Disons par exemple que je fais un traitement de chaîne qui nécessite une analyse de deux chaînes. Je n'ai aucune information sur leur longueur, ils proviennent donc de deux familles distinctes. Serait-il acceptable d'appeler la complexité d'un algorithme ou O (n + m) (selon que l'on utilise un algorithme naïf ou optimisé)?O(nm)O(n+m)

Dans la même veine, supposons que l'algorithme que nous choisissons nécessite en réalité deux étapes - une phase de configuration sur la première chaîne qui nous permet de traiter un certain nombre d'autres chaînes sans encourir ce coût initial. Serait-il approprié de dire qu'il a une construction O(n) suivie d'un nombre quelconque de calculs O(m) ?

Serait-il approprié de simplement les appeler O(n) parce que les deux calculs sont linéaires?

corsiKa
la source
Voir les commentaires sur cette réponse pour un peu de contexte - mon respect à @corsiKa pour avoir si courageusement posé une question aussi controversée.
OldCurmudgeon du
@OldCurmudgeon, je vois. Je détesterais me lancer dans ce fil de commentaires. Oldcurmudgeon, vous vous disputez sur la notation big-O sans comprendre la notation big-O? Gênant en effet. De plus, vous et corsiKa vous disputez sur le temps d'exécution sans définir les paramètres et - une recette pour une mauvaise communication. Astuce: une convention courante pour traiter les chaînes consiste à accepter d'utiliser pour utiliser la longueur d'une chaîne et pour la longueur d'une autre chaîne - mais idéalement, il est probablement préférable de le rendre explicite, car sinon cela peut causer de la confusion (comme illustré ici). m m nnmmn
DW
@DW Il est possible qu'OldCurmudgeon ait simplement appris une définition différente à l'école ... comme je le souligne dans un commentaire ci-dessous, il est possible d'éviter plusieurs variables, même si je n'ai jamais vraiment pensé à le faire jusqu'à présent. Peut-être que cela - ou quelque chose comme ça - était habituel?
Patrick87
2
Je pense que cela a des réponses suffisantes ici et ici .
Raphael

Réponses:

14

Oui bien sûr. C'est bien et parfaitement acceptable. Il est courant et standard de voir des algorithmes dont le temps d'exécution dépend de deux paramètres.

Par exemple, vous verrez souvent le temps d'exécution de la recherche en profondeur d'abord exprimé en , où est le nombre de sommets et est le nombre d'arêtes dans le graphique. C'est parfaitement valable. La signification de ceci est qu'il existe une constante et des nombres tels que le temps d'exécution de l'algorithme soit au plus , pour tout . En d'autres termes, si le temps de fonctionnement exact est , on dit que s'il existe tels que et impliquen m c n 0 , m 0 c ( n + m ) n > n 0 , m > m 0 f ( n , m ) f ( n , m ) = O ( n + m ) c , n 0 , m 0 n > n 0 mO(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) .

Oui, il est parfaitement approprié et acceptable de dire que le premier étage prend le temps et le deuxième étage prend le temps .O(n)O(m)

Important: assurez-vous de définir ce que sont et . Vous ne pouvez pas dire "ceci est un algorithme de temps " sans spécifier ce que est. Si n'est pas spécifié dans l'énoncé du problème, vous devez le spécifier. Par exemple, voir les algorithmes de graphe, où nous définissons généralement # de sommets et # d'arêtes.nmO(n)nnn=m=

Quant à savoir si vous pouvez les appeler temps , non, bien sûr que non - à moins que vous ne sachiez en quelque sorte que . Bien sûr, si vous savez que , il s'ensuit que , donc un algorithme de temps est également un algorithme de temps . Mais s'il n'y a aucune garantie que , alors vous ne pouvez pas l'appeler un algorithme de temps .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)

Ce sont des trucs de base. Vous le trouverez partout dans les manuels d'algorithmes.

DW
la source
1
@OldCurmudgeon, les chances sont que vous trouverez des exemples de cela dans de nombreux manuels d'algorithmes standard. Quels sont ceux que vous avez regardés? Avez-vous essayé de regarder le chapitre sur la recherche en profondeur d'abord (l'exemple que j'ai mentionné dans ma réponse)?
DW
2
@OldCurmudgeon Dans mon édition de l'exercice CLRS 3.1-8 présente exactement cette définition de la -notation pour les fonctions de nombreuses variables. Et sa limite supérieure sur le temps d'exécution de dfs est pour un graphique . O ( V + E ) ( V , E )OO(V+E)(V,E)
Kirill
2
@Kirill Mon point était qu'il est concevable, à un moment donné dans le passé, il était considéré comme habituel de ne considérer que la longueur totale des agrégats, dans la mesure où faire autrement aurait pu être considéré comme une erreur. Si vous notez l'examen d'un étudiant et que cet étudiant a utilisé la longueur d'entrée totale comme variable pour la complexité temporelle de DFS, considéreriez-vous une erreur de ne pas considérer deux dimensions (V et E)? Ce qui est vrai et ce que les gens sont prêts à concéder ne sont pas toujours les mêmes. n
Patrick87
1
Je suis d'accord dans la mesure où tout le monde utilise la notation Landau de cette façon, mais presque personne ne sait ce que cela signifie réellement (sauf si vous connectez les paramètres de manière fonctionnelle). Voir aussi l'article lié ici dans la réponse d'A. Schulz qui commence en déclarant que l'utilisation "de base" et "courante" est erronée.
Raphael
1
@ Patrick87 La théorie de la complexité utilise, en vertu de la définition de nombreuses classes bien connues, principalement la longueur d'entrée (à des exceptions notables). L'analyse des algorithmes est - lorsqu'elle est effectuée sérieusement - intéressée à apprendre quelque chose sur l'utilisation réelle des ressources (dans la mesure où le modèle le permet), de sorte que d'autres paramètres deviennent plus intéressants pour brosser un tableau d'ensemble (plus précisément).
Raphael