2009-12-01 4 views
1

Je suis en train de calculer la complexité de l'algorithme suivantcomplexité algorithme

private static List<int> GetIndexes(string strippedText, string searchText) 
    { 
     List<int> count = new List<int>(); 
     int index = 0; 
     while (strippedText.Length >= index && index != -1) 
     { 
      index = strippedText.IndexOf(searchText.Trim(), index, 
             StringComparison.OrdinalIgnoreCase); 
      if (index != -1) 
      { 
       count.Add(index); 
       index++; 
      } 
      else continue; 
     } 
     return count; 
    } 

Je sais que la boucle a une complexité de O(n) si des augmentations de comptage de 1 à chaque itération, mais les incréments dépend des indices trouvés . à chaque itération, il peut incrémenter 1 ou strippedText.lenght().

Une idée?

+2

Pourquoi "else continue"? – kriss

Répondre

4

Cependant, le pire des cas est O (n).

+0

Jetez un oeil à la page Big O sur Wikipedia: http://en.wikipedia.org/wiki/Big_O_notation – jldupont

+0

O (-) sera le pire scénario et seulement dans le cas moyen prendra en considération d'autres facteurs ?? ? – user220994

+0

De la page de Wikipedia: "Une description d'une fonction en termes de notation O grande fournit seulement une limite supérieure sur le taux de croissance de la fonction;" – jldupont

0

Je dirais encore qu'il est O (n) (ou au moins au pire O (n), à moins que votre index peut être fait moins de -1 dire -10, qui réinitialiser davantage)

Mais oui O (n).

1

O (n) où n est la longueur de la chaîne strippedText. Dans le pire des cas, chaque caractère sera égal à searchText et entraînera des n térations, mais même si ce n'est pas le cas (ce que je suppose que ce ne sera pas le cas), votre cas moyen sera un facteur, c, de n où c est supérieur à zéro mais inférieur à 1, donc le nombre de boucles sera cn, mais un facteur constant de n sera toujours représenté par O (n).

+0

Pourriez-vous m'expliquer? > votre cas moyen sera un facteur, c, de n où c est supérieur à zéro mais inférieur à 1, donc le nombre de boucles sera cn, mais un facteur constant de n sera toujours représenté par Sur). Je ne comprends pas merci – user220994

+0

La notation Big O traite des taux de croissance et sert à déterminer la façon dont le temps d'exécution de l'algorithme change lorsque la taille de votre ensemble de données change. Par définition, la notation O fournit des limites supérieures asymptotiques à l'intérieur d'un facteur constant. Donc O (cn) = O (n), que c soit 0,00001 ou c soit 100000000. Il croît toujours au même rythme par rapport à n, donc lors de la description de l'exécution d'un algorithme, les facteurs constants sont typiquement rejetés. –

0

En fait c'est O (strippedText.Length * searchText.Length) puisque l'index de fait une comparaison entre les caractères dans searchText et strippedText.

3

Il est encore O(n) - c'est parce qu'il croît asymptotiquement au même rythme que O(n)

notation Big O est utilisé pour la limite supérieure de la croissance algorithmique - qui est, il est une fonction que l'algorithme est garanti croître au même rythme que, ou plus lentement que.

Dans le cas moyen, votre algorithme va croître au taux O(n/m)m est une estimation de la densité des index dans vos chaînes (0 = pas d'index, 1 = indice à chaque caractère). En supposant que c'est à peu près constant sur n, vous pouvez ignorer le m et toujours dire que l'algorithme est O(n).

Le fait que, dans le monde réel, votre algorithme sera presque certainement plus rapide que O(n) ne l'arrête pas O(n) fonction.


Jetez un oeil à this page, en particulier:

Le symbole O est utilisé pour décrire une limite supérieure asymptotique pour la grandeur d'une fonction en termes d'une autre fonction plus simple. Cela signifie que pour x> k, lorsque x tend vers l'infini, la valeur f (x) sera toujours inférieure à C * g (x) (avec C a constante).

+0

m dépend de 'searchText', donc ce n'est pas constant. Considérez le texte de recherche avec beaucoup de répétitions (comme 'ababab'). – Abgan

+0

Oui, mais tant que ça ne dépend pas de la * longueur * de 'searchText' alors mon point est –

+0

Autrement dit, si' m' est fondamentalement orthogonal à 'n' alors' O (n/m) = O (n) ' –

-1

Je dirais que c'est O(n/m)strippedText.Length == n et m est la longueur d'un préfixe de searchText qui est un suffixe de searchText (si aucune préfixe existe, il est la longueur de searchText).

Exemples:

searchText = 'ababab' -> m == 2

searchText = 'aaaaaa' -> m == 1

searchText = 'abcabc' -> m == 3

searchText = 'abcdefg' -> m == 7

0

tout dépend de la façon dont les chaînes méthode IndexOf() est mis en œuvre. Fondamentalement, il suffit de rechercher dans toute la chaîne avec IndexOf() - l'efficacité de cette méthode dépend de l'efficacité de cette méthode.

Il y a plusieurs string search algorithms de différentes complexités allant O(m+n)-O(m*n) (m et n étant la longueur des deux cordes).