优化查找

时间:2010-08-05 14:20:42

标签: c# optimization micro-optimization

我有一个用于查找值的数组。我使用前2个值来获得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}
                                                  };

3 个答案:

答案 0 :(得分:1)

你可以保留一个符合条件的iCombo索引列表,所以在你第一次循环遍历所有数据后,所有后续时间,你只需循环遍历索引,并跳过比较。

答案 1 :(得分:1)

如果表是静态的并且已知搜索值的组合,您可以将搜索搜索值组合成一个哈希值,并使用带有列表的字典将该哈希值映射到表中。

如果搜索值未知,您可以构建一个多级字典(或词典)并使用相同的技术。

(我与Neil N和你的编辑交叉发布,但这基本上是一个相同的一般想法的版本:将索引预处理成某种查找结构。字典或列表是否更有效取决于数据的特征。)

答案 2 :(得分:1)

我在一个同事中看到的一个例子是他采用多列网格视图并将单元格导出到数组。一个新数组用于使用“A”索引行,另一个新数组用于使用“B”索引行。然后使用以下数组来索引Array1和Array 2中索引位置匹配的数组。使用此功能,您可以微观管理这些行以在

中使用
 if (o) {
         // do stuff
    }

循环,因此取出所有需要处理行,因为它们看起来符合

中设置的标准
     bool o = SpreadLookupTable[iCombo, 0] == perWeek 
  && SpreadLookupTable[iCombo, 1] == workDays;

在我们的测试中,它将应用程序完成的工作时间减少了大约13%,不多但我们有几千行可以使用,因此60行可能会从较小的索引大小中显示出更好的改进。