C中不同变量的状态机

时间:2012-08-20 03:46:54

标签: c if-statement hashmap lookup state-machine

我有以下代码,它会执行很多if-else检查并耗费大量时间。

 while(i<1000) {

                if ( a == x1)
               {
                     if(b == y1)
                    {
                       array[i] = z1;
                    }
                    else if( b = y2)
                    {
                       array[i] = z2;
                    }
                    else if (b = z3);
                    {
                         array[i] = z3;
                    }
                    -
                    -
                    -
                    -
                    -
                   some 20 else --

                  }/*end of first if*/
                 else if (a == xx1)
                 {

                           if(b == yy1)
                          {
                               array[i] = zz1;
                          }
                          else (b == yyy3)
                         {
                              array[i] = zz2;
                         }
                         else ( b == yy4)
                        {
                           array[i] = zz3;
                        }
                          -
                          -
                          -
                          -
              -
             some 20 else --
        }
        else if(/*more conditions*/)
        {
            /* same as above with too many else loops */
        }
        -
        -
        -
        -
        -
        -
        -some 100 else-ifs
        -
        -
        -
        -
        -
        i++;
 }/*end of while*/

我怎样才能最大限度地减少时间消耗。我虽然更换了if if with switch(开关内的开关),但我仍然认为我可以做得更好 一些表(2d-3d数组),但数字x1,y1,z1,zz3,zz1,zz2不是连续数,并且它们之间没有关系它们存在于1到10亿之间,没有 repetetion.Any想要实现这个查找表。 RGDS, 软质皮

1 个答案:

答案 0 :(得分:0)

(1)如果数字是常量,则将其更改为case语句 - 如果可以的话,编译器应该输出跳转表(给定你的约束它不能 - 所以转到第2步)。

(2)如果您的数据不连续,则跳转表将不起作用。您可以使用哈希表使数据连续(或足够接近)。现在只需搜索哈希表。这应该是O(1)(或接近它)。虽然您必须承担创建哈希表的费用

如果您需要哈希表的代码,您可以使用C ++ STL,或者如果您需要C编写自己的代码或在Web上查找实现,这question可能会有所帮助。