[英]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.