반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 프로그래머스 신규아이디추천
- MySQL
- 타입스크립트
- binary search
- 자료구조
- next.js
- Javascript sort
- node.js
- TypeScript
- 티스토리챌린지
- 프로그래머스 자바스크립트
- 자바스크립트 정렬
- 깃허브
- 키패드누르기풀이
- 자바스크립트 배열
- Javascript 정렬
- 좌표거리구하기
- 프로그래머스 자바스크립트 풀이
- 오블완
- 정규표현식문제
- mysql스키마
- TS
- js 알고리즘
- 알고리즘
- JavaScript
- 맨해튼거리예제
- 자바스크립트 알고리즘
- 정렬 알고리즘
- 프로그래머스
- 맨해튼거리
Archives
- Today
- Total
FE PARADISE
분할정복 알고리즘 - 큰수 곱셈 본문
반응형
두 수를 곱할 경우 우리는 그 두 수의 각자리수를 곱하고 덧셈한다.
만약 두 수 가 큰 수라면 연산 횟수가 많아져 O(n^2)의 시간이 걸린다.
이 문제를 해결하는 것이 바로 카라바츠 알고리즘 이다.
카라바츠 알고리즘
분할정복으로 큰 두수의 곱셈을 처리한다.
일반적인 두 수 A와 B의 곱셈을 나타내어보자. 두 수의 자릿수가 n인 경우,
m = n / 2 ( 자릿수의 반)
A = a1 * 10 ^ m + a0
B = b1 * 10 ^ m + b0
A * B = (a1 * 10 ^ m + a0) * (b1 * 10 ^ m + b0) = a1*b1*(10 ^ 2m) + a1 * (10 ^ m) * b0 + a0*b1*(10^m) + a0*b0
= a1*b1*(10^2m) + (a1*b0 + a0*b1) * (10^m) + a0*b0
이와 같은 과정을 거쳐서 두 수의 곱셈을 구하려면 총 4번의 곱셈이 필요하다.
a1*b1*(10^2m) + (a1*b0 + a0*b1) * (10^m) + a0*b0
하지만 카라바츠의 알고리즘을 사용하면 다음과 같다.
z2 = a1 * b1, z0 = a0 * b0, z1 = (a1 + a0)*(b1 + b0) - z2 - z0
(a1 + a0)*(b1 + b0) = a1 * b1 + a1 * b0 + a0 * b1 + a0 * b0
(a1*b0 + a0*b1) = (a1 + a0)*(b1 + b0) - a1 * b1 - a0 * b0 = (a1 + a0)*(b1 + b0) - z2 - z0
z0, z1, z2라는 변수로 위와 같이 값을 정의해준다.
a1*b1*(10^2m) + (a1b0 + a0b1) * 10m + a0b0 = z1*(10 ^ 2m) + z1*(10^m) + z0
이와 같이 카라바츠 알고리즘을 사용하면 위에선 4번이던 곱셈을 이젠 3번의 곱셈으로 구해낼 수 있다.
방법 | 곱셈 횟수 | 시간복잡도 |
일반 곱셈 | 4개 | O(n²) |
카라츠바 | 3개 | O(n^log₂3) ≈ O(n^1.585) |
반응형
'자료구조 & 알고리즘' 카테고리의 다른 글
프로그래머스 땅따먹기 - 자바스크립트 풀이(Bottom-up DP사용) (0) | 2025.04.21 |
---|---|
[자료구조] 힙 Heap - 자바스크립트로 구현하기 (0) | 2025.04.13 |
프로그래머스 뒷 큰수 스택 풀이 - 자바스크립트 풀이 (0) | 2025.03.08 |
프로그래머스 k진수에서 소수 개수 구하기 - 자바스크립트 풀이 (0) | 2025.03.06 |
프로그래머스 [1차] 캐시 - 자바스크립트 코드 (0) | 2025.02.17 |