From 4c48bebc717f247a3f6e454e529d510ec96179d7 Mon Sep 17 00:00:00 2001 From: Diego Date: Sat, 25 Sep 2021 21:06:07 -0300 Subject: [PATCH] Optimizar en memoria sum abs diff (#10) --- python/sols/arrays/prefix_sum_problems.py | 14 ++++++------ sols-expl/arrays/README.md | 26 +++++++++++++++++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/python/sols/arrays/prefix_sum_problems.py b/python/sols/arrays/prefix_sum_problems.py index 2c9ff28..dd5c107 100644 --- a/python/sols/arrays/prefix_sum_problems.py +++ b/python/sols/arrays/prefix_sum_problems.py @@ -16,14 +16,12 @@ def sum_absolute_differences(nums: List[int]) -> List[int]: :rtype: List[int] """ n = len(nums) - prefix = [0]*(n + 1) - for i in range(1, len(nums) + 1): - prefix[i] = prefix[i - 1] + nums[i - 1] - + total_sum = sum(nums) result = [0]*n + cum_sum = 0 + cum_sum_next = 0 for i in range(n): - result[i] = ( - prefix[n] - prefix[i + 1] - nums[i]*(n - i - 1) - - prefix[i] + nums[i]*i - ) + cum_sum_next += nums[i] + result[i] = total_sum - cum_sum_next - nums[i]*(n - i - 1) + nums[i]*i - cum_sum + cum_sum += nums[i] return result diff --git a/sols-expl/arrays/README.md b/sols-expl/arrays/README.md index a44857a..e486174 100644 --- a/sols-expl/arrays/README.md +++ b/sols-expl/arrays/README.md @@ -187,5 +187,31 @@ algoritmo sum-abs-diff En este caso podemos observar un intercambio memoria/tiempo de ejecución, ya que ahora la complejidad en tiempo de ejecución es `O(N)`, y la complejidad en memoria es también `O(N)` ya que necesitamos pre-calcular la suma acumulada. +### Enfoque optimizado en memoria + +Tomando ideas del enfoque optimizado, podemos darnos cuenta que no necesitamos pre-calcular la suma acumulada, y podemos hacer el cálculo _in place_ si modificamos el algoritmo como sigue: + +``` +algoritmo sum-abs-diff-mem-opt + entrada: nums: int[] + salida: result: int[] + + total_sum = 0 + for i in 1 to N: + total_sum += nums[i] + + result = new int[nums.length] + cum_sum = 0 + cum_sum_next = 0 + for i = 0 to N - 1: + cum_sum_next += nums[i] + result[i] = total_sum - cum_sum_next - nums[i] * (n - i - 1) - cum_sum + nums[i] * i + cum_sum += nums[i] + + return result +``` + +En este caso, la complejidad en tiempo es `O(N)`, pero se redujo la complejidad en memoria a `O(1)`. + [i3]: https://github.com/dpalmasan/code-challenges/issues/3 [i10]: https://github.com/dpalmasan/code-challenges/issues/10 \ No newline at end of file