Page 33 -
P. 33

루프는 이런 부류에 속하는 대표적인 사례로서, 삽입 정렬(프로그램 4.2.4)이라고 하는 기초적인 정
               렬 알고리즘도 여기에 속한다.

               삼차 함수 이번 절 예제인 threesum.py는 n개 요소에서 세 쌍을 모두 뽑아 처리하기 위해 삼중 for 루
                                                 3
               프를 사용하기 때문에 실행 시간 증가도가 n 으로서 삼차 함수이다. 1.4절에서 구현한 행렬 곱셈의
                                                    3
               실행 시간도 두 개의 m × m 행렬을 곱할 때 m 의 증가도를 가지고 있으므로 삼차 함수이지만, 입
                                          2
               력의 크기(행렬 요소의 수)가 n = m 에 비례하므로, 알고리즘의 시간 증가도가 삼차 함수라기보다는
                3/2
               n 라고 분류하는 편이 옳다.

               지수 함수 2.3절에서 설명한 것처럼 towersofhanoi.py(프로그램 2.3.2)와 beckett.py(프로그램
                                                                         n
               2.3.3)는 둘 다 n개 요소의 모든 부분집합을 처리하기 때문에 실행 시간이 2 에 비례해 증가한다. 일
                                                        n
               반적으로 ‘지수’라는 용어는 b>1인 모든 상수에 대한 b  증가도를 가진 알고리즘을 모두 의미하며, b
               값에 따라 차이가 많이 발생하지만 중요하지 않다. 지수 함수는 아주 느리므로 문제가 클 때는 이런
               프로그램을 실행하면 결코 안 된다. 지수 증가도를 가진 알고리즘이 최선의 해결책인 문제들이 아주
               많이 있으므로 이런 문제는 알고리즘 이론에서 아주 중요한 역할을 담당한다.


                  표 4.1.3 일반적인 증가도 가설 정리
                  설명       증가도                     예                           형태

                  상수         1                  count += 1                     문장
                                                                           (정숫값 증가)

                  로그       log n               while n > 0:                절반으로 나눔
                                                  n = n // 2           (이진으로 표현할 때 필요
                                                  count += 1                한 비트 수)
                  선형         n               for i in range(n):              단일 루프
                                                 if a[i] == 0:
                                                     count += 1

                 선형 로그     n log n     [합병 정렬(프로그램 4.2.6) 참조]                분할 정복
                                                                            (합병 정렬)

                  이차         n 2             for i in range(n):            이중 내포 루프
                                             for j in range(i+1, n):       (모든 쌍 확인)
                                                if (a[i] + a[j]) == 0:
                                                       count += 1

                  삼차         n 3             for i in range(n):            삼중 내포 루프
                                             for j in range(i+1, n):      (모든 세 쌍 확인)
                                                for k in range(j+1, n):
                                                if (a[i] + a[j] + a[k]) == 0:
                                                         count += 1
                  지수         2 n      [그레이 코드(프로그램 2.3.3) 참조]               철저한 검색
                                                                        (모든 부분집합 검사)





               486
   28   29   30   31   32   33   34   35   36   37   38