Example: Print all positive integer solutions to the equation a^3 + b^3 = c^3 + d^3 and a, b, c, d are integers between 1 and 1000.
1. A brute force solutions
n = 1000
n = 1000
for a from 1 to n
for b from 1 to n
for c from 1 to n
for d from 1 to n
if a^3 + b^3 = c^3 + d^3
print a, b, c, d
This returns O(n^4)
To optimize it we can make a break when we find it
n = 1000
for a from 1 to n
for b from 1 to n
for c from 1 to n
for d from 1 to n
if a^3 + b^3 = c^3 + d^3
print a, b, c, d
break
However, it will not optimize much. It's still O(n^4)
1. Remove Unnecessary Work
To optimize, we can use math. d = sqrt of 3 (a^3 + b^3 + c^3)
n = 1000
for a from 1 to n
for b from 1 to n
for c from 1 to n
d = pow(a^3 + b^3 - c^3, 1/3)
if a^3+b^3 == c^3+d^3 && 0<= d && d <= n
print a, b, c, d
break
It will reduce the runtime from O(N^4) to O(N^3)
2. Remove Duplicated Work
We can now use the pairs. We can just use a map to find it. We can even use the Hash Table.
n = 1000
for a from 1 to n
for b from 1 to n
result = c^3 + d^3
append (c,d) to list at value map[result]
for a from 1 to n
for b from 1 to n
result = a^3+b^3
list = map.get(result)
for each pair in list
print a, b, pair
Once we have the map of all the (c, d) pairs, we can just use that directly. We don't need to generate the (a,b) pairs. Each (a, b) will already be in the map.
(Remove the duplicated storage)
n = 1000
for a from 1 to n
for b from 1 to n
result = c^3 + d^3
append (c,d) to list at value map[result]
for each result list in map
for each pair1 in list
for each pair2 in list
print pair1, pair2
This will take our runtime to O(n^2)
'Algorithms and Data Structures > Algorithms' 카테고리의 다른 글
LeetCode 278. First Bad Version (0) | 2022.06.15 |
---|---|
Bit Manipulation (0) | 2022.06.11 |
[Coding Test] How to Solve Coding Problems (0) | 2022.05.15 |
[Big O] Missed Questions (0) | 2022.05.14 |
Big O Notation and Frequently missed questions (0) | 2022.05.13 |