ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arrays(λ°°μ—΄), Binary Search(이진 탐색), 증λͺ…, 그리고 log
    PROGRAMMING/자료ꡬ쑰 2020. 6. 18. 14:26

    Arrays: μ—°μ†λœ μ£Όμ†Œ, λ™μΌν•œ Type

    μž₯점: 각 μ›μ†Œμ— λŒ€ν•œ 접근이 μƒμˆ˜ μ‹œκ°„μ— κ°€λŠ₯. Search κ°€ 빠름

    단점: λ°°μ—΄μ˜ 크기λ₯Ό λ³€ν™”ν•˜λ €λ©΄ λΉ„μš©μ΄ 크게 듦. Insert, Delete κ°€ 느릴 수 μžˆλ‹€.

    -> λ³€ν™”κ°€ μ—†κ±°λ‚˜ λ“œλ¬Έ ν˜•νƒœμ˜ μžλ£Œμ— μ‚¬μš©ν•œλ‹€.

     

    Binary Search (이진 탐색)

    자료의 탐색 μ•Œκ³ λ¦¬μ¦˜ 쀑 μ„ ν˜• 탐색(ν•œ μ›μ†Œμ”© μ²˜μŒλΆ€ν„° 순차적으둜 λ°©λ¬Έν•˜μ—¬ μ°ΎλŠ” 방법) 보닀 μ›”λ“±νžˆ λΉ λ₯Έ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ, 자료λ₯Ό λ°˜μ”© λ‚˜λˆ„μ–΄ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. 즉, 쀑간값을 보고 그보닀 μ™Όμͺ½μ— μžˆμ„μ§€ 였λ₯Έμͺ½μ— μžˆμ„μ§€ νŒλ‹¨ν•˜μ—¬ κ·Έ ν•΄λ‹Ή κ΅¬μ—­μ—μ„œ μƒˆλ‘­κ²Œ λ°˜μ”© νƒμƒ‰ν•˜λŠ” 것이닀. μ΄λ•Œ, μžλ£ŒλŠ” (무쑰건) μ •λ ¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 

     

    λ‹€μŒμ€ 각각 반볡적 μ ˆμ°¨μ™€ μž¬κ·€μ  절차둜 μ μ„±ν•œ 이진 탐색 μ½”λ“œμ΄κ³ , 각각에 λŒ€ν•΄ 증λͺ…ν•΄λ³΄μž.

    int search(int a[], int n, int target){ // arrays a, length n, and target
    	int left, right, middle;	// left, right, and middle elements of arrays a
        left=0; right=n-1;
        while(left <= right) { // repeat until the elements are flip
        	middle = (left + right) /2;
            if(a[middle]==target) return middle;
            else if(a[middle]>target) right=middle-1;
            else left=middle+1;
        }
        return -1; // there isn't target in array a
    }

    : Proof by Invariant : invariant* κ°€ μ‚¬μ‹€μ΄λΌλŠ” 것을 보이고, κ·Έλ‘œλΆ€ν„° 이 ν•¨μˆ˜κ°€ 항상 μ„±κ³΅ν•œλ‹€λŠ” 것을 λ³΄μ΄λŠ” 방법

     

    1) invariant : λ§Œμ•½ μ–΄λ–€ i 에 λŒ€ν•΄μ„œ a[i] == target 라면, left<=i<=right κ°€ 항상 μ„±λ¦½ν•œλ‹€.

      -> μ°Έ! invariant κ°€ μ΅œμ΄ˆμ— 성립 && invariant κ°€ 꺠질 수 μžˆλŠ” μ½”λ“œκ°€ μ „ν˜€ μ—†λ‹€.

          (left, right κ°€ λ°”λ€ŒλŠ” 곳은 middle-1 or middle + 1 인데, μ΄λŠ” invariant λ₯Ό κΉ° 수 μ—†λ‹€.)

    2) a[i] == target 인 i κ°€ μ—†λ‹€λ©΄ λ£¨ν”„λŠ” μ–Έμ  κ°„ λ°˜λ“œμ‹œ λλ‚˜κ³  -1 을 리턴, i κ°€ μžˆλ‹€λ©΄ 루프 μ•ˆμ—μ„œ λ°˜λ“œμ‹œ 리턴 됨

     

    * invariant : 항상 μ„±λ¦½ν•˜λŠ” 사싀. ν”„λ‘œκ·Έλž¨μ΄ λŒμ•„κ°€λŠ” λ™μ•ˆ μ ˆλŒ€ λ°”λ€Œμ§€ μ•ŠλŠ” μ„±μ§ˆ

     

    int search(int a[], int n, int target){ // arrays a, length n, and target
    	int middle, r;
        if(n==0) return -1;
        middle = n/2;
        if(a[middle]==target) return middle;
        else if(a[middle]>target) search(a, middle-1, target);
        else {
        	r = search(a+middle+1, n-middle-1, target);
            if(r==-1) return r;
            else return r+middle+1;
    	}
    }
        

    : Proof by Induction with μˆ˜ν•™μ  귀납법

     

    P(n) ; λ§Œμ•½ μ–΄λ–€ i 에 λŒ€ν•΄μ„œ a[i] == target 이라면 i λ₯Ό λ¦¬ν„΄ν•œλ‹€.

    1) (Base) n=0 일 경우 μ–΄λ–€ i 에 λŒ€ν•΄μ„œ a[i]==target 이 성립할 방법이 μ—†κ³ , ν•¨μˆ˜λŠ” 항상 -1 을 리턴

    2) (Step) 

      - case 1: a[middle] == target 인 경우 middle 을 λ¦¬ν„΄ν•˜λ―€λ‘œ μ£Όμž₯이 성립

      - case 2: a[middle] > target 인 경우 a[middle], a[middle+1], ..., a[n-1] μ€‘μ—μ„œλŠ” target 와 같은 값이 μ—†λ‹€. λ”°λΌμ„œ a[i]==target 인 κ²½μš°κ°€ μžˆλ‹€λ©΄ i λŠ” 0, 1, ... , m-1 쀑 ν•˜λ‚˜μ΄λ‹€. κ·€λ‚©μ μœΌλ‘œ search(a, middle-1, x) κ°€ μ •ν™•(성립)ν•˜λ‹€κ³  ν•œλ‹€λ©΄ (P(n-1) 이 참이라고 κ·€λ‚©μ μœΌλ‘œ κ°€μ •) 전체도 μ„±λ¦½ν•œλ‹€.

      - case 3: a[middle] < target : case 2 와 μœ μ‚¬ν•¨

     

    이 μž¬κ·€ μ•Œκ³ λ¦¬μ¦˜μ˜ Complexity λ₯Ό μ‚΄νŽ΄λ³΄μž.

    T(n) = 1+ T(n/2)

          = 1 + 1 + T(n/4) = ... = log n

    ∴ T(n) = O(log n)

    => λΉ λ₯Έ 속도!!!!!!!

     

    log λž€?

    k=log2 n  <=> 2^k = n

    λ”°λΌμ„œ log n 은

    - 2λ₯Ό λͺ‡ 번 κ³±ν•˜λ©΄ n 이 λ˜λŠλƒ

    - n 을 2둜 λͺ‡ 번 λ‚˜λˆ„λ©΄ 1이 λ˜λŠλƒ

    의 λ‹΅

    λ‹€μ‹œ 말해, n 이 계속 1/2 둜 μ€„μ–΄λ“œλŠ”λ° log n λ²ˆλ§Œμ— μ—†μ–΄μ§„λ‹€λŠ” μ–˜κΈ°!

     

    log n 은 n 보닀 μ›”λ“±νžˆ μž‘μ€λ°, n 이 10얡이라면 log n 은 μ•½ 33 이기 λ•Œλ¬Έμ΄λ‹€.

     

    log n 의 μœ„λ ₯을 항상 κΈ°μ–΅ν•˜μž. 

    μžλ£Œκ΅¬μ‘°μ™€ μ•Œκ³ λ¦¬μ¦˜μ—μ„œ log n 을 μ„€λͺ…ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ 곡뢀λ₯Ό μ œλŒ€λ‘œ ν•œ 것이 λ§žλŠ”μ§€ μ˜μ‹¬ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

     

    λŒ“κΈ€

Designed by Tistory.