2010-09-20 43 views
0

我的程序經常處理大量的數據,並且它的一個特定組件根據條件創建了這些數據的一個子集。你可以認爲這是,有字符串,有什麼算法/優化計算數組元素的條件子集?

10457038005502 

問題是返回的第一個五年(比方說)非0的元素,即返回:

14573 

其實不然,每個該字符串的元素是包含大量數據的大數據結構,整個數據集的大小通常爲幾千兆字節,並且包含數以萬計的元素來確定是否應該包括該元素(不是' 0')每個元素需要被處理。我已經說過了,因爲我已經明確地解釋它,並且試圖將重點放在算法或技術上,而不是我們的具體實現和數據。

  • 編輯:感謝那些迄今已回覆的人。所有的建議 圍繞多線程,這 我同意是一個很好的方法,我希望 本身的問題可以被視爲 一個算法問題(我們做 有帶螺紋的任務框架這 將融入。) - 我可疑, 雖然我不知道,這是一個 一般問題適用於 搜索各種數據。 有鑑於此,一個真棒回覆將 是「Schwarzenegger等人提出的 算法X在1995年爲此,google 這個詞。」

我們當前的方法是從輸入數據集中沿着數組的第一個點開始的單線性線性搜索,計算一個元素是否需要保留,並根據需要構建結果。通常所請求的數據子集並不在開頭 - 使用字符串示例,您可能需要知道元素8-15(如果存在15,那麼在您輸入數據結束之前您可能不知道)。 )當然,我們不知道輸出數據集中的元素8是否在輸入數據集中,除非我們已經處理了遠離開始的數據集。

我們還應該如何解決這個問題?

我正在尋求任何完全不同的方法或算法來解決這類問題的輸入。

  • 還有什麼其他方法可以解決這個問題,即快速獲取任意子集?

  • 瞭解當前的解決方案是由於每個元素的處理量而產生的計算限制,或者更確切地說,因爲它需要生成每個元素以檢查它是否爲'0',什麼算法或你可能會建議解決這個問題嗎?有什麼辦法可以最大限度地減少程序的工作嗎?

如果它影響到特定的庫或工具,我們使用C++(不受管理;我們使用Embarcadero C++ Builder 2010。)例如,我們不能使用LINQ,如果沒有使用它,我認爲它可能是這類問題的一個有用的工具/語言功能。但是,我們當然可以實施任何算法解決方案,您通常可以在其他環境中以較少的工作來實現這些解決方案

+1

在你的字符串(或等效的數據結構向量)中找到第一個* k *非零元素是唯一的問題,還是你有其他問題需要解決?另外,你如何檢查數據結構是否爲'0'?你是否有一個函數適用於每個返回它是否爲'0'的元素? – Jacob 2010-09-20 01:57:37

+0

它是任何子集,即元素k-k + 100,不一定來自元素0.有一種方法,我們在每個數據結構上運行,如果返回0或不是,是的。 – 2010-09-20 02:26:06

回答

1

假設每個計算可以獨立於其他計算(即,項目的結果不依賴於前一項的結果),那麼顯而易見的第一步將是使用多線程並行執行計算。

+0

對於輸入數據,每個元素的值通常是獨立的。它的生成過程可能會有很大的不同,但假設存在一個元素,它是獨立的。對於輸出數據,似乎包含一個項目(給定您請求特定的索引子集)取決於處理每個先前的輸入數據項目。 重新多線程,你的意思是像分割輸入數據和處理線程中的每個分區或作爲任務對象獲得0 /非0元素的列表,然後重新組裝嗎? – 2010-09-20 02:25:37

+0

是的 - 想法是,如果(例如)要求您輸入前5個非零項,您先讀取前5個輸入項,然後旋轉5個線程以並行處理這5個項目。我可以看到包含一個非零項目可能取決於之前找到的項目數量,但如果要求您輸入N,那麼您至少可以並行處理第一個N,並確保使用任何積極的結果。是的,當你有你的結果時,你將它們重新組裝成原來的順序。 – 2010-09-20 03:27:55

1

從你的問題的快速閱讀,我想你可能想要實施某種形式的主 - 並行。讓一個線程(或您選擇的進程)讀取前N個條目,啓動N個線程(或進程)並將一個任務傳遞給每個線程。然後每個線程獨立工作並在完成時(成功或失敗)向主控者報告。然後,主人確定是否需要創建更多任務並傳遞給工作人員。

這樣做的主要潛在問題可能是確保跨工作人員的良好負載平衡,並確保主線程不是太多的瓶頸。

OpenMP 3.0支持這種類型的任務並行性,並具有相當平緩的學習曲線。

+0

OpenMP很遺憾不能在C++ Builder中使用(請參閱http://openmp.org/wp/openmp-compilers/。)儘管如此,感謝回覆/算法/方法建議! – 2010-09-21 01:07:46

+0

那麼溝渠C++ builder :-) – 2010-09-21 05:38:45