Sí, diría que saber algo sobre la complejidad computacional es imprescindible para cualquier programador serio. Mientras no esté lidiando con grandes conjuntos de datos, estará bien sin conocer la complejidad, pero si desea escribir un programa que aborde problemas graves, lo necesita.
En su caso específico, su ejemplo de encontrar componentes conectados podría haber funcionado para gráficos de hasta nodos. Sin embargo, si probaste un gráfico con nodos, entonces el algoritmo de tu profesor probablemente lo hubiera logrado en 1 segundo, mientras que tu algoritmo habría (dependiendo de cuán grave fuera la complejidad) tomado 1 hora, 1 día, o tal vez incluso 1 eternidad.100.000100100.000
Un error algo común que los estudiantes cometen en nuestro curso de algoritmos es iterar sobre una matriz como esta:
while array not empty
examine first element of array
remove first element from array
Puede que este no sea el código más hermoso, pero en un programa complicado, algo como esto podría aparecer sin que el programador lo sepa. Ahora, ¿cuál es el problema con este programa?
Supongamos que lo ejecutamos en un conjunto de datos de elementos. En comparación con el siguiente programa, el programa anterior se ejecutará más lento.50.000100.00050.000
while array not empty
examine last element of array
remove last element from array
Espero que esté de acuerdo en que tener el conocimiento para hacer que su programa se ejecute veces más rápido es probablemente algo importante para un programador. Comprender la diferencia entre los dos programas requiere algunos conocimientos básicos sobre la teoría de la complejidad y algunos conocimientos sobre los detalles del lenguaje en el que está programando.50.000
En mi lenguaje de pseudocódigo, "eliminar un elemento de una matriz" desplaza todos los elementos a la derecha del elemento que se está eliminando una posición desde la izquierda. Esto hace que eliminar el último elemento sea una operación ya que para hacerlo solo necesitamos interactuar con 1 elemento. Eliminar el primer elemento es ya que para eliminar el primer elemento, también debemos desplazar todos los demás elementos una posición hacia la izquierda.O ( n ) n - 1O ( 1 )O ( n )n - 1
Un ejercicio muy básico de complejidad es demostrar que el primer programa realizará operaciones mientras que el segundo programa usa solo operaciones. Si conectas , verás que un programa es drásticamente más eficiente que el otro.nn=100.00012norte2norten = 100.000
Este es solo un ejemplo de juguete, pero ya requiere una comprensión básica de la complejidad para distinguir la diferencia entre los dos programas, y si realmente está tratando de depurar / optimizar un programa más complicado que tiene este error, se necesita una comprensión aún mayor para encontrar fuera de donde está el error. Porque un error como eliminar un elemento de una matriz de esta manera puede ocultarse muy bien por abstracciones en el código.
Tener una buena comprensión de la complejidad también ayuda cuando se comparan dos enfoques para resolver un problema. Suponga que ha ideado dos enfoques diferentes para resolver el problema de los componentes conectados por su cuenta: para decidir entre ellos sería muy útil si pudiera (rápidamente) estimar su complejidad y elegir el mejor.