Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

알고리즘2

4,281 views

Published on

코딩 소림사 알고리즘 스터디 #2

Published in: Software
  • Be the first to comment

  • Be the first to like this

알고리즘2

  1. 1. 알고리즘 문제해결전략 #2 분할 정복
  2. 2. 지난 시간 숙제 recursion 과 stack overflow • Iteration vs recursion • Fibonacci f(n) = f(n-1) + f(n-2) • Recursion 으로 푸는 편이 자연스럽다. 하지만… • 자라나는 stack 의 속도 : 2n • Stack overflow 발생 • Tail call recursion? • Function 자신을 return하면 stack이 linear 하게 자라남 • Compiler가 지원해주면 stack이 자라나지 않을수도(!) 있음 • Tail call optimization 이라고 한다.
  3. 3. 지난 시간 숙제 recursion 과 stack overflow • Trampoline • Coding 은 recursion 으로 • 수행은 iteration 처럼 • 값이 evaluation 될 때 까지 call stack 이 자라나지 않음
  4. 4. 지난 시간 숙제 recursion 과 stack overflow • Java 의 tail call optimization 지원 계획은? • https://blogs.oracle.com/jrose/entry/tail_calls_in_the_vm • http://openjdk.java.net/projects/mlvm/subprojects.html#TailCall • 딱히 지원해 줄 것 같지는 않아 보인다. • 다른 언어는? • golang, scala, ECMA6 … : 지원 또는 부분 지원 • 그밖에 다른 언어는 직접 알아보도록
  5. 5. Divide and conquer • 큰 문제를 작은 문제로 나눈다. • 작은 문제를 해결한다. • 병합한다. 출처 : http://kugistory.net/76
  6. 6. 카라츠바 알고리즘 • 매우 큰 수에 대한 곱셈 연산 • 매우 큰 수를 다음과 같이 int[] 로 저장해보자 • 100000 : {0,0,0,0,0,1} • O(𝑛2 ) 방법 • 일반적으로 노트에 적어가며 푸는 방식과 동일 • 카라츠바 알고리즘 • 이항연산의 규칙을 이용하여 연산의 횟수를 줄임 • 큰 곱셈 문제를 작은 곱셈 여러 번으로 나누어 이 규칙을 적용 1234 x 5678 9872 8638 ….
  7. 7. 카라츠바 알고리즘
  8. 8. • 시간복잡도 분석 • n 자릿수 곱셈에 대하여, n = 2 𝑘 라 할 때 • k 개의 Karatsuba 연산으로 분할 • 그런데 1개의 Karatsuba 연산에 3 번의 곱셈(=Karatsuba)이 발생하므로 • 𝑎1 × 𝑏1 • 𝑎0 × 𝑏0 • 𝑎0 + 𝑎1 × 𝑏0 + 𝑏1 • 시간복잡도 = O(3 𝑘 ) • 그런데, n = 2 𝑘 이므로 양변에 밑이 2인 로그를 취하면 • 𝑙𝑜𝑔2 𝑛 = 𝑘 𝑙𝑜𝑔22 • 𝑙𝑜𝑔2 𝑛 = 𝑘 • O(3 𝑘 ) = O(3𝑙𝑜𝑔2 𝑛 ) • 3𝑙𝑜𝑔2 𝑛 = 𝑥 라 할 때 • 𝑙𝑜𝑔23𝑙𝑜𝑔2 𝑛 = 𝑙𝑜𝑔2 𝑥 • 𝑙𝑜𝑔2 𝑛 × 𝑙𝑜𝑔23 = 𝑙𝑜𝑔2 𝑥 • 𝑙𝑜𝑔2 𝑛𝑙𝑜𝑔23 = 𝑙𝑜𝑔2 𝑥 • 𝑛 𝑙𝑜𝑔23 = 𝑥 • 따라서, 3𝑙𝑜𝑔2 𝑛 = 𝑛 𝑙𝑜𝑔23 • O(3𝑙𝑜𝑔2 𝑛 ) = O(𝑛𝑙𝑜𝑔23 ) 카라츠바 알고리즘

×