【问题标题】:How to find every combination of numbers that sum to a specific X given a large array of numbers?给定大量数字,如何找到总和为特定 X 的每个数字组合?
【发布时间】:2023-01-13 02:03:34
【问题描述】:

我有一个很大的整数数组(~3k 项),我想找到每个数字组合的索引,其中所述数字的总和等于 X。如何在程序不花费数年时间执行的情况下执行此操作?

我可以使用以下 Python 代码找到第一个可能的组合:

def find_numbers_that_sum_to(source_arr, target_number, return_index=True):
    result = []
    result_indices = []
    
    for idx, item in enumerate(source_arr):
        sum_list = sum(result)
        
        assert (sum_list + item) <= target_number
        result.append(item)
        result_indices.append(idx)
        
        if (sum_list + item) == target_number:
            break
    
    return result_indices

但我需要每一种可能的组合。至少是一种动态生成它们的方法。我一次只需要其中一个,但如果它给我的索引不符合我需要的另一个标准,我将需要下一组。

【问题讨论】:

  • 一个快速的建议是您可以 yield 而不是返回列表。这将允许该函数产生一个结果,您可以根据您的标准对其进行评估,并仅在需要时才要求另一个结果。
  • 出色地每一种可能的组合3000 个整数需要一段时间才能列出。如您所知,除非对此有一些限制,否则将需要数年时间才能执行。

标签: python arrays numpy math numpy-ndarray


【解决方案1】:

不幸的是,this problem is NP-hard,这意味着当前没有已知的多项式时间算法。如果您想将当前代码与其他实现进行基准测试,this SO question 包含一堆。那些实现可能更快,但它们的运行时间仍将呈指数级增长。

【讨论】:

    【解决方案2】:

    一种有效的方法是使用“两点法”

    def find_numbers_that_sum_to(source_arr, target_number):
        source_arr.sort() # Sort the array
        start = 0
        end = len(source_arr) - 1
        result = []
        while start < end:
            curr_sum = source_arr[start] + source_arr[end]
            if curr_sum == target_number:
                result.append((start, end))
                start += 1
                end -= 1
            elif curr_sum < target_number:
                start += 1
            else:
                end -= 1
        return result
    
    find_numbers_that_sum_to(source_arr, target_number)
    
    

    由于排序步骤,此解决方案的时间复杂度为 O(n log n),两指针搜索的时间复杂度为 O(n),这对于 ~3k 项的数组应该足够快。

    注意:如果您想将其用作生成器,也可以将 return 替换为 yield

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2021-08-09
      相关资源
      最近更新 更多