Да, я бы сказал, что знание чего-либо о сложности вычислений является обязательным условием для любого серьезного программиста. Пока вы не имеете дело с огромными наборами данных, у вас все будет в порядке, не зная сложности, но если вы хотите написать программу, которая решает серьезные проблемы, она вам нужна.
В вашем конкретном случае ваш пример поиска связанных компонентов мог бы работать для графиков, скажем, до узлов. Однако, если вы попробуете граф с 100 000 узлов, то алгоритм вашего лектора, вероятно, справится с этим за 1 секунду, в то время как ваш алгоритм (в зависимости от степени сложности) займет 1 час, 1 день или даже 1 вечность.100100,000
Несколько распространенная ошибка, которую студенты делают в нашем курсе алгоритмов, состоит в том, чтобы перебрать массив следующим образом:
while array not empty
examine first element of array
remove first element from array
Это может быть не самый красивый код, но в сложной программе что-то вроде этого может появиться без ведома программиста. Теперь, в чем проблема с этой программой?
Предположим, мы запускаем его на наборе данных из элементов. По сравнению со следующей программой прежняя программа будет работать на 50 000 медленнее.100,000+50,000
while array not empty
examine last element of array
remove last element from array
Я надеюсь, что вы согласны с тем, что знание программиста для того, чтобы ваша программа работала в раз быстрее, вероятно, важно для программиста. Понимание различий между этими двумя программами требует некоторых базовых знаний о теории сложности и некоторых особенностей языка, на котором вы программируете.+50,000
В моем языке псевдокода «удаление элемента из массива» сдвигает все элементы справа от удаляемого элемента на одну позицию слева. Это делает удаление последнего элемента операцией поскольку для этого нам нужно взаимодействовать только с 1 элементом. Удаление первого элемента - это O ( n ), поскольку для удаления первого элемента нам нужно сместить все остальные n - 1 элементов на одну позицию влево.O ( 1 )O ( n )n - 1
Очень базовое упражнение по сложности, чтобы доказать, что первая программа будет делать операций, в то время как вторая программа использует толькоnопераций. Если вы подключитеn=100.000,вы увидите, что одна программа значительно эффективнее другой.12N2Nn = 100 000
Это всего лишь игрушечный пример, но он уже требует базового понимания сложности, чтобы понять разницу между двумя программами, и если вы на самом деле пытаетесь отладить / оптимизировать более сложную программу, которая имеет эту ошибку, требуется еще большее понимание, чтобы найти где ошибка. Потому что такая ошибка, как удаление элемента из массива таким способом, может быть очень хорошо скрыта абстракциями в коде.
Хорошее понимание сложности также помогает при сравнении двух подходов к решению проблемы. Предположим, что вы придумали два разных подхода к решению проблемы со связанными компонентами самостоятельно: для того, чтобы решить между ними, было бы очень полезно, если бы вы могли (быстро) оценить их сложность и выбрать лучший.