繁体   English   中英

在数组中搜索值的总和

[英]Searching an array for sum of values

我有一个在包含以下值的文本文件中生成值的系统

第1行:可能的总价值

第2行:数组中的元素数

第3行(如果需要,可以添加额外的行):数字本身

我现在正在考虑一种方法,我可以从数组中的第一个整数减去总值,然后在数组中搜索剩余的数,然后执行相同的操作直到找到该对。

另一种方法是在排列和组合的基础上将两个整数相加并找到对。

根据我的分析,第一个解决方案更好,因为它减少了迭代次数。我的分析在这里正确吗,还有其他更好的方法吗?

编辑:我将在此处提供一个示例,以使其更清晰第1行:200第2行= 10第3行:10 20 80 78 19 25 198 120 12 65

现在这里的有效对为80,120,因为它的总数为200(在第一行中表示为输入文件中可能的总值),并且它们在数组中的位置将为3,8。所以找到这个对,我列出了我的方法我选择第一个元素,然后将其与可能的总值相减,然后通过基本搜索算法搜索另一个元素。

在这里使用示例,我首先取10并减去200,得到190,然后搜索190,如果找到了,则找到该对,否则继续相同的过程。

您的问题含糊不清,但是如果您要在数组中寻找总和达到一定数量的对,则可以使用哈希表平均在O(n)完成。

迭代数组,并对每个元素进行迭代:
(1)检查是否在表格中。 如果是的话-停下来再返回,会有这样的一对。
(2)其他:在哈希表中插入num-element

如果您的迭代在没有找到匹配项的情况下终止-没有这样的配对。

伪代码:

checkIfPairExists(arr,num):
   set <- new empty hash set
   for each element in arr:
        if set.contains(element):
            return true
         else:
            set.add(num-element)
    return false

“是否存在一个总和等于一定数量的子集”的一般问题是NP-Hard ,被称为子集和问题 ,因此没有已知的多项式解。

如果您要查找两个数字加起来等于第三个数字,通常您会得到以下信息:

for(i=0;i<N;i++)
   for(j=i+1;j<N;j++)
      if(numbers[i]+numbers[j]==result)
         The answer is <i,j>
         end

就是O(n ^ 2) 但是,可以做得更好。

如果数字列表已排序(需要O(n log n)时间),则可以尝试:

for(i=0;i<N;i++)
   binary_search 'numbers[i+1:N]' for result-numbers[i]
   if search succeeds:
      The answer is <i, search_result_index>
      end

也就是说,您可以单步浏览每个数字,然后在其余列表上进行二进制搜索以找到其伴随数字。 这需要O(n log n)时间。 您可能需要在自己之上实现search功能,因为内置功能可能会在O(n)时间中沿列表走去,从而导致O(n ^ 2)结果。

对于这两种方法,您都需要检查一下特殊情况是否当前数等于您的结果。

两种算法使用的空间都不比数组本身占用的空间更多。

对编码风格表示歉意,我对Java并不是很熟悉,这里的想法很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM