Selection algorithms

  • Definition
    • 주어진 도메인 안에서 i번째 작은 수(또는 큰 수)를 찾는 것.
  • Quick sorting시 pivot 선정에서 worst case avoidance로 쓰임 (n시간 안에 정확히 중간 값을 찾기 때문에)
  • types
    • Average linear time
      • 알고리즘 복잡도, 평균 O(n), worst case O(n2)
    • Guarantee average linear time in worst case.
      • O(n)

       

       

Average linear time selection

  • How to
    • endIdx를 pivot으로 하여 파티션을 나눔
    • 파티션 때 pivot의 랭킹(몇 번 째 순위의 숫자인가)이 정해짐.
    • 랭킹이 적절하지 않으면 해당 값의 좌 우로 recursion
  • Pseudo

    //

    //        array, 입력배열

    //        startIdx, 배열의 시작 index

    //        endIdx, 배열의 끝

    //        i, i번째 작은 인덱스를 찾음.

    //

    Select(array, startIdx, endIdx, i)

    if startIdx = endIdx

    return array[p]

       

    //

    //        quick sorting과 마찬가지로 partition을 나눔.

    //

    partIdx := partition(array, startIdx, endIdx)

    rankNum := partIdx - startIdx + 1

    if i = rankNum

    return array[partIdx]

    else if i < rankNum

    return Select(array, startIdx, partIdx - 1)

    else

    return Select(array, partIdx + 1, endIdx)

       

       

  • Example
    • 2번째 작은 값을 찾을 때.

   

Median finding algorithms

  • Deterministic Selection algorithms
  • K번째 작은 값을 O(n)안에 찾아냄.
  • Divide and Conquer 전략을 사용하며 작은 단위로 구분하여 런 타임 시간을 현저하게 줄임
  • How to
    • 주어진 배열의 사이즈가 특정 숫자 크기(주로 5를 사용)보다 작은 경우면 단순히 sorting 하고 K번째 값을 return.
    • 주어진 숫자만큼의 element를 가지는 배열로 그룹화.
    • 각 그룹을 sorting하고 각 그룹의 median 값을 찾음.
    • 그 중에서 median 값을 구함.
    • 전체 element를 뒤지면서 찾은 median값 보다 작은 set을 L로 큰 set은 R로 구분하여 정리.
    • 정리된 set의 사이즈를 k와 비교하여 k원소가 있을 set에서 다시 recursion
  • Pseudo

    FindingMedian(array, k)

            if array.size < k

                    sort(array)

                    return array[k]

              

            group(array, subsets)

              

            loop i := [0, array.size / 5)

                    medianSets[i] := FindingMedian(subsets[i], 3)

              

            //

            //        group.size = array.size / 5

            //        median of median group.size / 2

            //

            medianVal = FindingMedain(medianSets, array.size / 10)

              

            partition(array, LSet, Rset, medianVal)

            if k < LSet.size

                    return FindingMedian(LSet, k)

            else if k LSet.size + 1

                    return FindingMedean(RSet, k - LSet.size - 1)

            else

                    retrun medianVal

     

  • Example
    • Element를 5이하로 가지는 그룹을 생성하는 step
       
    • Sorting후 median들을 정리 하는 단계
       
    • Median중에서 median을 선택한 단계.
       
    • Median of median으로 구분된 배열을 형성하는 단계
       
    •    

'Fundamental Notes > Algorithms' 카테고리의 다른 글

Selection Algorithms  (0) 2008/11/14
AVL  (0) 2008/11/14
Red-Black Tree  (0) 2008/11/14
B-Tree  (0) 2008/11/14
Hash  (0) 2008/11/14
Graph  (0) 2008/11/14