준비물

  • 평균 계산 복잡도를 산출하려면 확률 변수와 기대값에 대해 알아야 한다.

확률 변수

Random Variables

A random variable is a function from the sample space of an experiment to the set of real numbers. That is, a random variable assigns a real number to each possible outcome.

  • 확률 변수는 실험의 표본 공간으로부터 실수의 집합으로의 함수다.
  • 확률 변수(함수)는 가능한 모든 결과에 실수를 할당한다.
  • 확률 변수는 주로 X()로 표기한다.

이름은 확률 변수지만 함수라는 점에 주의하자.

확률 변수의 예제

XX가 동전을 두 번 던진 결과 tt에서 앞면의 수를 할당하는 확률 변수(함수)라 하자.

X(t)는 모두 다음의 값을 갖는다.

X(HH)=2X(HT)=X(TH)=1X(TT)=0X(HH)=2X(HT)=X(TH)=1X(TT)=0

기대값

Expected Values

The expected value, also called the expectation or mean, of the random variable XX on the sample space SS is equal to
E(X)=sSp(s)X(s)E(X)=sSp(s)X(s).
The deviation of XX at sSsS is X(s)E(X)X(s)E(X), the difference between the value of XX and the mean of XX.

  • 표본 공간 SS에서의 확률 변수 XX의 기대값(혹은 평균)
    • E(X)=sSp(s)X(s)E(X)=sSp(s)X(s).
      • p(s)p(s): ss의 확률.
    • 즉, 각 경우에 대한 확률 변수와 그 확률을 곱한 값을 모두 더한 것이다.
    • 즉, 평균이다.
  • 편차는 X(s)E(X)X(s)E(X) 이다.
    • 즉, XX의 값과 XX의 평균과의 차이이다.

평균 계산 복잡도

다음과 같이 정의하자.

  • ajaj: 가능한 입력. j=1,2,...,nj=1,2,...,n
  • X(aj)X(aj): 입력 ajaj에 대해 알고리즘이 사용하는 연산의 수
  • p(aj)p(aj): ajaj의 확률

그렇다면 XX의 기대값(평균 계산 복잡도)를 다음과 같이 표현할 수 있다.

E(X)=nj=1p(aj)X(aj)E(X)=nj=1p(aj)X(aj)

예제: 선형 탐색 알고리즘

다음과 같이 선형 탐색 알고리즘을 심플하게 구현한 함수가 있다.

function linearSearch(x, list) {
  let i = 0;
  for (let i = 0; i < list.length; i++) {
    if (list[i] === x) {
      return i;
    }
  }
  return -1;
}
  • list의 길이가 nn 이라 하자.
  • 가능한 결과는 11이 리턴되는 경우까지 합쳐서 모두 n+1n+1개이다.
  • xx가 리스트에 있을 확률을 pp라 하자.
  • xx가 리스트에 없을 확률을 q=1pq=1p라 하자.

비교 연산은 매 루프마다 2번씩 일어난다. i < list.lengthlist[i] === x

그러므로 다음과 같이 생각할 수 있다.

  • x가 0번 인덱스에 있다면 필요한 연산의 수는 2×12×1.
  • x가 1번 인덱스에 있다면 필요한 연산의 수는 2×22×2.
  • x가 n1n1번 인덱스(리스트의 마지막)에 있다면 필요한 연산의 수는 2×n2×n.
  • x가 리스트에 없다면 필요한 연산의 수는 2×(n+1)=2n+22×(n+1)=2n+2

리스트에 x가 있고, 리스트의 i번째 아이템과 x 가 같을 확률은 p×1np×1n.

따라서 기대값은 다음과 같이 표현할 수 있다.

E=2pn+4pn+...+2npn+(2n+2)q=2pn(1+2+...+n)+(2n+2)q=2pn×n(n+1)2+(2n+2)q=p(n+1)+(2n+2)qE=2pn+4pn+...+2npn+(2n+2)q=2pn(1+2+...+n)+(2n+2)q=2pn×n(n+1)2+(2n+2)q=p(n+1)+(2n+2)q
  • 만약 리스트에 x가 반드시 포함된다고 하면
    • p=1,q=0 이므로 평균 계산 복잡도는 n+1이 된다.
  • 만약 리스트에 x가 존재하지 않는다고 하면
    • p=0,q=1 이므로 평균 계산 복잡도는 2n+2이 된다.
  • 만약 리스트에 x가 존재할 확률이 12 라면
    • p=q=12 이므로 평균 계산 복잡도는 3n+32이 된다.

예제: 삽입 정렬 알고리즘

다음과 같이 삽입 정렬 알고리즘을 심플하게 구현한 함수가 있다. (코드 출처는 한국어 위키백과)

def insert_sort(x):
    for i in range(1, len(x)):
        j = i - 1
        key = x[i]
        while x[j] > key and j >= 0:
            x[j+1] = x[j]
            j = j - 1
        x[j+1] = key
    return x
  • 정렬할 n개의 원소 a1,a2,...,an가 있다고 하자.
  • i1개의 원소가 정렬된 상태에서, ai를 삽입하는데 필요한 비교 연산의 수를 확률변수 Xi라 하자.
    • X1: 0개의 원소가 정렬된 상태에서, a1을 삽입하는 데 필요한 비교 연산의 수.
    • X2: 1개의 원소가 정렬된 상태에서, a2을 삽입하는 데 필요한 비교 연산의 수.
    • Xn: n1개의 원소가 정렬된 상태에서, an을 삽입하는 데 필요한 비교 연산의 수.

그런데 확률변수 Xii 를 알면 바로 얻어낼 수 있는 값일까?

그렇지 않다.

만약 2,4,13,14 가 정렬되어 있는 상태에서 25를 삽입하려 한다면 2,4,13,14과 비교해야 할 것이므로 4 번의 비교가 필요하다.

이 경우 X5=4 이다.

하지만 2,4,13,14 가 정렬되어 있는 상태에서 1을 삽입하려 한다면 2하고만 비교하면 되므로 1번의 비교로 충분하다.

이 경우 X5=1 이다.

즉 삽입하려는 원소 a5가 이미 정렬된 수열의 어느 자리에 들어가야 하는지에 따라 확률 변수X5의 값이 바뀐다.

  a_1,  a_2,  a_3,  a_4
1     2     3     4     5
번    번     번    번    번
자    자     자    자    자
리    리     리    리    리

그러므로 X5의 기대값을 다음과 같이 생각할 수 있다.

E(X5)=1번 자리에 들어갈 확률 × 1번 자리에 들어갈 경우 비교 연산의 수+2번 자리에 들어갈 확률 × 2번 자리에 들어갈 경우 비교 연산의 수+3번 자리에 들어갈 확률 × 3번 자리에 들어갈 경우 비교 연산의 수+4번 자리에 들어갈 확률 × 4번 자리에 들어갈 경우 비교 연산의 수+5번 자리에 들어갈 확률 × 5번 자리에 들어갈 경우 비교 연산의 수

이걸 기호를 사용하면 조금 더 단순하게 쓸 수 있다.

E(X5)=p5(1)×Xi(1)+p5(2)×Xi(2)+p5(3)×Xi(3)+p5(4)×Xi(4)+p5(5)×Xi(5)

를 쓰면 한 줄로 표현할 수 있다.

E(X5)=5k=1p5(k)×Xi(k)

그런데 1번 자리에 들어가건 2번 자리에 들어가건 수열이 랜덤하게 분포되어 있다면 확률은 다 똑같다.

따라서 다음과 같이 식을 다시 쓸 수 있다.

E(X5)=5k=115×Xi(k)=155k=1Xi(k)

한편, Xi(k)k번 자리에 들어갈 경우 비교 연산의 수 이므로, 그냥 k 이다.

그러므로 식을 다음과 같이 정리할 수 있다.

E(X5)=155k=1k=15×5(5+1)2

X5인 경우를 해 봤으니 Xi인 경우에 대해서 일반화를 해보면 다음과 같을 것이다.

E(Xi)=1iik=1k=1i×i(i+1)2=i+12

이제 삽입 정렬의 평균 계산 복잡도를 구할 수 있다.

삽입 정렬은 원소를 하나하나 정렬해가므로, 삽입 정렬 과정 전체에 필요한 비교 연산의 수는 다음과 같을 것이다.

X=X1+X2+...+Xn

X10일 것이므로 X1을 제외하고 다시 써보자.

X=X2+X3+...+Xn

그렇다면 기대값은 다음과 같을 것이다.

E(X)=E(X2+X3+...+Xn)=E(X2)+E(X3)+...+E(Xn)

그런데 E(Xi)=i+12라는 것을 위에서 이미 밝혔으므로 이를 이용하여 다음과 같이 정리할 수 있다.

E(X)=E(X2)+E(X3)+...+E(Xn)=ni=2E(Xi)=ni=2i+12=ni=1i+121+12=ni=1i+121=12ni=1(i+1)1=12ni=1i+n21=12×n(n+1)2+n21=n(n+1)4+2n444=n2+3n44

즉, 삽입 정렬 알고리즘에서 사용하는 비교 연산의 평균 개수는 n2+3n44 이므로 Θ(n2) 이다.

함께 읽기

참고문헌

  • Rosen의 이산수학 / Kenneth H. Rosen 저 / 공은배 등저 / 한국맥그로힐(McGraw-Hill KOREA) / 2017년 01월 06일