Page 30 -
P. 30

3
                     프로그램의 실행 시간을 분석하는 핵심 포인트는 다음과 같                                   n /6
                     다. 대부분의 프로그램에서 실행 시간은 T(n)~cf(n) 관계를
                     만족하는데, 이때 c는 상수, f(n)은 실행 시간의 증가도(order
                                                                            166,666,667  n(n  1)(n  2)/6
                     of growth)라고 하는 함수이다. 잠시 후에 살펴보겠지만 대부
                                                        2
                                                           3
                     분의 프로그램에서 f(n)은 log n, n, n log n, n , n  등의 함                     166,167,000
                     수이다(전통적으로 증가도 함수는 상수 계수를 붙이지 않는                                                     4
                                                                                    1,000
                     다). f(n)이 n의 거듭제곱인 경우가 간혹 있는데, 이때는 실
                                                                                    그림 4.1.5 n이 커질 때의 근삿값
                     행 시간이 멱법칙을 만족한다고 할 수 있다. threesum.py의
                                                                    3
                     경우 이미 실험을 통해 검증한 것처럼 실행 시간의 증가도는 n 이다. 상수 c는 명령을 실행하는 비용                            알고리즘과 데이터 구조
                     과 상세한 빈도수에 따라 달라질 수 있지만, 잠시 후에 설명하는 것처럼 일반적으로 이 값을 알아낼
                     필요가 없다.

                     증가도는 간단한지만 실행 시간을 모델링하는 강력한 도구다. 예를 들어 증가도를 알면 두 배 추정을
                                                           3
                     간단히 할 수 있다. threesum.py의 경우 증가도가 n 인 것을 알고 있으므로 다음과 같은 식에 의해 문
                     제의 크기를 두 배로 늘리면 실행 시간이 8배로 늘어날 것이라고 예상할 수 있다.

                                         3
                                             3
                        T(2n) / T(n) → c(2n)  / (cn ) = 8
                     이 결과는 경험적 분석으로 알아낸 값과 일치하므로, 모델과 실험이 모두 정확함을 검증한다. 이 예
                     제를 주의 깊게 살펴보기 바란다. 이와 똑같은 방법을 이용해 여러분이 작성하는 어떠한 프로그램의

                     성능도 더욱 잘 이해할 수 있기 때문이다.
                     커누스 교수는 어떠한 프로그램에 대해서도 실행 시간을 예측할 수 있는 정확한 수학적 모델을 만들
                     수 있음을 입증했으며, 많은 전문가들이 그런 모델을 개발하기 위해 노력을 쏟아왔다. 그러나 여러분

                     이 작성하는 프로그램의 성능을 이해하기 위해 그런 자세한 모델을 사용할 필요는 없다. 일반적으로
                     내부 루프 바깥에서 실행되는 명령의 비용은 무시할 수 있으며(내부 루프에서 실행되는 명령의 비용
                     에 비해 무시할 수 있을 정도로 작기 때문이다), 실행 시간을 추정할 때 상숫값을 알아낼 필요가 없다
                     (실행 시간을 예측하기 위해 두 배 추정할 때 제거되기 때문이다).


                       표 4.1.1 프로그램의 실행 시간 분석 예
                       명령 수     명령 당 실행 시간(초)             빈도                 전체 시간
                                                                                2
                                                       3
                                                                            3
                                                           2
                         6            2×10 -9         n /6 - n /2 + n/3   (2n  - 6n + 4n)×10 -9
                                                                              2
                                                         2
                         4            3×10 -9           n /2 - n/2          (6n  - 6n)×10 -9
                         4            3×10 -9              n                  (12n)×10 -9
                         10           1×10 -9              1                  10×10 -9

                                                                            3
                                                                 총합       (2n  - 10n+ 10)×10 -9
                                                                                3
                                                                물결식           ~2n ×10 -9
                                                                증가도             n 3


                                                                                              483
   25   26   27   28   29   30   31   32   33   34   35