2010-08-05 47 views
1

我有一個數組,我用它來查找值。我使用前兩個值來獲得n行。例如,所有在第一列中有2個而第二個中有7個的行。 什麼是最快(我的意思是微優化)的方式來獲得這些值? 我現在用一個for循環來獲取值:優化查找

int l = SpreadLookupTable.GetLength(0); 

for (int iCombo = 0; iCombo < l; iCombo++) {       
     bool o = SpreadLookupTable[iCombo, 0] == perWeek 
     && SpreadLookupTable[iCombo, 1] == workDays; 

    if (o) { 
     // do stuff 
    } 
} 

編輯: 它只有大約60行。如果我製作3個嵌套數組,所以我可以直接使用前2列作爲索引,比如t [2] [7],然後我只會迭代我真正需要的行。那會更快嗎?

表:

private static int[,] SpreadLookupTable = { 
                {2, 7, 1, 0, 0, 1, 0, 0, 0}, 
                {2, 7, 1, 0, 0, 0, 1, 0, 0}, 
                {2, 7, 0, 1, 0, 0, 1, 0, 0},                           
             ... 
                {2, 3, 1, 1, 0, 0, 0, 0, 0}, 
                {2, 3, 1, 0, 1, 0, 0, 0, 0}, 
                {2, 3, 0, 1, 1, 0, 0, 0, 0} 
                }; 

回答

1

如果表格是靜態的,並且搜索值的組合已知,則可以將兩個搜索搜索值組合到一個散列中,並使用帶有列表的字典將該散列映射到該表中。

如果搜索值未知,您可以構建多級字典(或多個字典)並使用相同的技術。 (我與Neil N和你的編輯交叉發佈,但這基本上是一個相同的一般想法的版本:預處理索引到某種查找結構。字典或列表是否更有效取決於你的數據的特徵)

+0

這就是我在我的問題的'編輯'部分所說的? – Jeroen 2010-08-05 14:36:07

+0

Sry,我交叉發佈你的編輯。我編輯*我的*答案來引用你的編輯,哈哈。 – TechNeilogy 2010-08-05 14:37:44

+0

謝謝。我需要擠出每毫秒,這些建議幫助很大。 – Jeroen 2010-08-05 14:42:26

1

你可以保持符合條件的iCombo的索引列表,所以之後通過的所有數據,所有後續的時間你的第一個循環,你將只需要通過索引循環,並跳過比較。

+0

這與@TechNeilogy所說的相似嗎? – Jeroen 2010-08-05 14:37:09

1

我在一個項目中看到我的一個同事正在做的一個例子是他採取了一個多列網格視圖並將單元格導出到一個數組集。用一個新的數組來索引具有「A」的行,並且使用另一個新的數組來索引具有「B」的行。然後,下面的數組用於索引Array1和Array2中索引位置匹配的數組。利用這一點,你可以再微觀管理這些排在你

if (o) { 
     // do stuff 
    } 

循環使用,因此採取了所有需要處理行,因爲他們似乎滿足於

 bool o = SpreadLookupTable[iCombo, 0] == perWeek 
    && SpreadLookupTable[iCombo, 1] == workDays; 

在我們的測試中設定的標準它將應用程序完成的工作時間減少了大約13%,並不是很多,但是我們有幾千行可以使用,所以60行可能會顯示出更小的索引更好的改進。

+0

希望這有助於! – 2010-08-05 14:54:36

+0

很好的答案。我認爲它與所有上述答案和我的編輯類似。我的情況是類似的,表訪問數百或數千次。所以每毫秒都是重要的。 – Jeroen 2010-08-05 15:12:01