簡體   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