Tak, powiedziałbym, że wiedza o złożoności obliczeniowej jest koniecznością dla każdego poważnego programisty. Tak długo, jak nie masz do czynienia z dużymi zestawami danych, nic ci nie będzie, wiedząc o złożoności, ale jeśli chcesz napisać program, który rozwiązuje poważne problemy, potrzebujesz go.
W twoim konkretnym przypadku przykład znalezienia połączonych komponentów mógł zadziałać dla wykresów zawierających do węzłów. Jeśli jednak wypróbujesz wykres z węzłami, algorytm twojego wykładowcy prawdopodobnie poradziłby sobie z tym w ciągu 1 sekundy, podczas gdy twój algorytm zająłby (w zależności od tego, jak złożona była złożoność) 1 godzinę, 1 dzień, a może nawet 1 wieczność.000100100.000
Dość częstym błędem popełnianym przez studentów w naszym kursie algorytmów jest iteracja takiej tablicy:
while array not empty
examine first element of array
remove first element from array
To może nie być najpiękniejszy kod, ale w skomplikowanym programie coś takiego może się pojawić bez wiedzy programisty. Jaki jest problem z tym programem?
Załóżmy, że działamy na zestawie danych elementów. W porównaniu z następującym programem poprzedni program będzie działał o wolniej.000 50 000100.00050.000
while array not empty
examine last element of array
remove last element from array
Mam nadzieję, że zgadzasz się, że posiadanie wiedzy umożliwiającej uruchomienie programu razy szybciej jest prawdopodobnie ważną rzeczą dla programisty. Zrozumienie różnicy między tymi dwoma programami wymaga podstawowej wiedzy na temat teorii złożoności oraz pewnej wiedzy o szczegółach języka, w którym programujesz.50.000
W moim języku pseudokodów „usunięcie elementu z tablicy” przesuwa wszystkie elementy na prawo od usuwanego elementu o jedną pozycję z lewej strony. To sprawia, że usunięcie ostatniego elementu jest operacją , ponieważ w tym celu wystarczy interakcja z 1 elementem. Usunięcie pierwszego elementu to ponieważ w celu usunięcia pierwszego elementu musimy przesunąć wszystkie pozostałe elementy jedną pozycję w lewo.O ( n ) n - 1O(1)O(n)n−1
Bardzo podstawowym ćwiczeniem w złożoności jest udowodnienie, że pierwszy program wykona operacje , podczas gdy drugi program używa tylko operacji. Jeśli podłączysz , zobaczysz, że jeden program jest znacznie bardziej wydajny niż drugi.nn=100 00012n2nn=100.000
To tylko zabawkowy przykład, ale już wymaga podstawowej znajomości złożoności, aby odróżnić oba programy, a jeśli faktycznie próbujesz debugować / zoptymalizować bardziej skomplikowany program, który ma ten błąd, znalezienie jeszcze większego zrozumienia wymaga jeszcze większego zrozumienia gdzie jest błąd. Ponieważ błąd, taki jak usunięcie elementu z tablicy w ten sposób, można bardzo dobrze ukryć przez abstrakcje w kodzie.
Dobre zrozumienie złożoności pomaga również przy porównywaniu dwóch podejść do rozwiązania problemu. Załóżmy, że sam wymyśliłeś dwa różne sposoby rozwiązania problemu z połączonymi komponentami: aby zdecydować między nimi, bardzo przydatne byłoby (szybko) oszacowanie ich złożoności i wybranie lepszego.