超出内存限制-Python

时间:2018-11-19 11:47:14

标签: loops python-3.6

我正在运行以下代码,以从输入列表中获得两个数字的索引,其总和等于目标。

import itertools

class Solution:
   def twoSum(self, nums, target):
        combs = set(itertools.combinations(enumerate(nums), 2))
        while combs:
           elem = combs.pop()
           if int(elem[0][1]) + int(elem[1][1]) == target:
               return [elem[0][0], elem[1][0]]

cls = Solution()
nums = [3,3]
lst = cls.twoSum(nums,6)
print(lst)

在输入数组很小之前,它运行良好,但是当它增长到成千上万的数字时,内存限制已超出。我相信应该有其他一些优化的方法来实现它。

1 个答案:

答案 0 :(得分:0)

好吧,因为我们不能拥有大于10 ^ 6或10 ^ 7的数组/连续内存块

如果我们具有多维数组,则数组大小将减小为Matrix [1000] [1000],以获取总计〜10 ^ 7个块

Itertools生成所有可能是指数对的对,并将其存储在集合中肯定会在时间和空间上溢出。

因此,解决方案将是在时间和内存复杂度上都改善算法。

解决此问题的一种方法是通过散列

基本思想是 A + B =目标,其中A,B是数组的元素

所以我们使用键=元素和值=索引来维护哈希表

并反复检查数组中是否存在B =目标-A,如果找到,我们将打印(A,B)的索引

class Solution:
    def twoSum(self, nums, target):
        hashtable = dict() # key = number , value = index
        n = len(nums)
        lst = []
       for i in range(n):

           if(hashtable.get(target-nums[i],None) is None):
           # not found so update the hashtable
               hashtable[nums[i]] = i
           else:
           # pair found
               lst.append((hashtable[target-nums[i]],i))

        return lst

cls = Solution()

nums = [3,3]
lst = cls.twoSum(nums,6)

print(lst)