Estou lendo este post no Big-O
. Diz que o seguinte código é O (n ^ 2):
bool ContainsDuplicates(String[] strings)
{
for(int i = 0; i < strings.Length; i++)
{
for(int j = 0; j < strings.Length; j++)
{
if(i == j) // Don't compare with self
{
continue;
}
if(strings[i] == strings[j])
{
return true;
}
}
}
return false;
}
Mas eu não consigo entender o porquê.
O loop interno faz algo constante.
Portanto, é somatório de 1 .... N de uma constante. ou seja, número constante O (1).
O loop externo é somatório sobre o O (1).
Então, eu imagino que seja n * O (1).
Acho que estou entendendo algo errado aqui.
Eu não acho que todos os loops aninhados significam O (n ^ 2), certo?
i+1
vez de 0
. Como está escrito, na pior das hipóteses (sem bobagens) 1/2, as comparações são redundantes.
O(N)
, esse código seria O(N^2 * M)
onde M é o comprimento das strings.