我有一个系统可以在文本文件中生成值,其中包含以下值
第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,如果找到则找到该对,否则继续相同的过程。
答案 0 :(得分:3)
你的问题很模糊,但是如果你在数组中寻找一个总和为一定数的对,那么平均可以使用哈希表在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,并且被称为subset-sum problem,因此没有已知的多项式解。
答案 1 :(得分:1)
如果您正在尝试找到一对(第二个)数字,这些数字总和为第三个数字,通常您会得到类似的内容:
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并不十分熟悉,而且这里的想法非常重要。