Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

알고리즘2

4.346 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

알고리즘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 ) 카라츠바 알고리즘

×