Complexidade de algoritmos é uma daquelas coisas que vc só percebe que faz diferença quando vc conhece. Quem não conhece não vai perceber, na verdade sequer vai chegar a conceber que aquilo pode fazer alguma diferença. Exagerando um pouco, é como se o Tarzan dissesse que pode ir de cipó pra qualquer lugar e isso é o suficiente, pois ele não conhece nenhum outro meio de transporte, e portanto não consegue nem imaginar que há como ir mais rápido.
E o pior de tudo é que, de fato, na maioria dos casos comuns vai "funcionar". Afinal, para poucos dados, tudo é rápido. Hoje os computadores estão tão rápidos, que se um algoritmo tiver que manipular apenas 10, 500 ou 2000 itens, qualquer algoritmo vai ser "rápido".
No artigo indicado acima tem um exemplo claro desse problema. A tabela que tem lá é mais completa, mas enfim, vamos considerar apenas um algoritmo que tem complexidade O(n2) e outro que tem O(nlogn). Veja como a diferença fica cada vez maior conforme o tamanho dos dados aumenta:
n | nlogn | n2 |
---|---|---|
1 | 0 | 1 |
16 | 64 | 256 |
256 | 2.048 | 65.536 |
4.096 | 49.152 | 16.777.216 |
65.536 | 1.048.565 | 4.294.967.296 |
1.048.476 | 20.969.520 | 1,09 trilhões |
16.775.616 | 402.614.784 | 281,4 trilhões |
Ou seja, conforme o N aumenta, o algoritmo O(nlogn) cresce a uma taxa muito menor do que o O(n2). E quanto maior o N, maior a diferença entre os dois.
O problema é que na maioria dos casos mais comuns, lidamos com poucos dados. Páginas e retornos de API web costumam ser paginados, raramente estamos lidando com centenas de milhões de itens. Por isso que na maioria dos casos "funciona" e as pessoas acham que não precisam saber sobre complexidade de algoritmos.
Para poucos itens, qualquer algoritmo rodará em menos de 1 segundo, o que é imperceptível para nós humanos. Mesmo que o algoritmo mais lento demore 0.1 segundo e o mais rápido demore 0.001 segundo (ou seja, 100 vezes mais rápido), ainda sim não perceberíamos a diferença. Só quando tivermos milhões de itens, e o algoritmo mais rápido rodar em 1 minuto enquanto o mais lento demora várias horas, é que as pessoas param para pensar no que estão fazendo.
Outro detalhe é que a complexidade de algoritmos está diretamente ligada a outro assunto importantíssimo: estruturas de dados.
Cada estrutura (fila, pilha, lista ligada, árvore, etc) tem a complexidade de suas operações muito bem documentadas. Por exemplo, "para adicionar elementos é O(n), para buscar um elemento é O(logn), para remover é O(n), etc". E a escolha da estrutura correta pode fazer toda a diferença no algoritmo: o seu caso vai ter mais alterações (adicionar/remover) ou acessos? Os dados precisam estar ordenados ou tanto faz em qual posição adicionar? etc etc etc... Sabendo das necessidades específicas, você consegue escolher a estrutura mais adequada, e essa simples escolha pode fazer toda a diferença no resultado final.
Mas tem gente que não liga pra isso e usa array (ou "objeto") pra tudo (e "funciona", pois sempre tem menos que 100 itens, então tanto faz). Por isso tem tanta gente que diz que não precisa saber, que nunca usou, etc. Só lamento...
Obrigado por esclarecer a questão, amigo. A tabela deixou bem claro a grandissíma diferença que existe. Esse conhecimento, aparentemente, é uma ponte para quem atravessa todos os dias o laguinho a pé. Parece fácil fazer a travessia, mas depois de um tempo se percebe o quão mais prático e e útil foi ter construído uma ponte enquanto outros se dedicaram apenas a se molhar no laguinho.