예, 계산 복잡성에 대해 아는 것이 진지한 프로그래머에게는 필수입니다. 거대한 데이터 세트를 다루지 않는 한 복잡성을 모르는 것이 좋지만 심각한 문제를 해결하는 프로그램을 작성하려면 필요합니다.
특정 경우에 연결된 구성 요소를 찾는 예는 최대 노드의 그래프에서 작동했을 수 있습니다 . 그러나 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.00050.000
while array not empty
examine last element of array
remove last element from array
프로그램을 배 빠르게 실행하는 데 필요한 지식을 보유 하는 것이 프로그래머에게는 중요한 일 이라는 데 동의합니다 . 두 프로그램의 차이점을 이해하려면 복잡성 이론에 대한 기본 지식과 프로그래밍중인 언어의 특정 사항에 대한 지식이 필요합니다.50.000
의사 코드 언어에서 "배열에서 요소 제거"는 모든 요소를 왼쪽에서 한 위치에서 제거되는 요소의 오른쪽으로 이동합니다. 이렇게하면 마지막 요소를 제거하는 작업이 가되므로 하나의 요소와 만 상호 작용하면됩니다. 첫 번째 요소 를 제거하려면 첫 번째 요소를 제거하기 위해 다른 모든 n - 1 요소를 한 위치 왼쪽으로 이동해야하므로 O ( n ) 입니다.O(1)O (n)n - 1
복잡성의 매우 기본적인 운동은 첫 번째 프로그램이 수행 할 것임을 증명하는 것입니다 두 번째 프로그램은n 개의작업만 사용하지만 2 n2개의작업입니다. 당신이에 연결하면N=100.000당신은 하나 개의 프로그램이 대폭보다 효율적인 다른보다 볼 수 있습니다.12엔2엔n =100.000
이것은 단지 장난감의 예이지만 두 프로그램의 차이점을 말하기 위해서는 복잡성에 대한 기본 이해가 이미 필요합니다. 실제로이 실수가있는보다 복잡한 프로그램을 디버깅 / 최적화하려고하면 찾기에 더 많은 이해가 필요합니다 버그가 어디에 있는지. 이런 식으로 배열에서 요소를 제거하는 것과 같은 실수는 코드의 추상화에 의해 잘 숨겨 질 수 있습니다.
복잡성을 잘 이해하면 두 가지 접근 방식을 비교하여 문제를 해결할 때 도움이됩니다. 연결된 구성 요소 문제를 스스로 해결하기위한 두 가지 다른 접근 방식을 생각해 냈다고 가정 해 봅시다. 구성 요소 간을 결정하려면 복잡성을 추정하고 더 나은 방법을 선택할 수 있다면 매우 유용 할 것입니다.