[英]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
如果您要查找两个数字加起来等于第三个数字,通常您会得到以下信息:
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.