c ++:在2d数组中快速搜索

时间:2014-04-15 08:17:41

标签: c++ arrays

我有一个2D array我在我的代码中使用以下方式:

搜索特定条目需要花费大量时间,而我希望减少搜索元素的时间。任何人都可以建议我可以做些什么来减少在这个2D阵列中搜索的时间?

 for( counter1=0; counter1< size ; ++counter1)
    {   
    int index= GVector[counter1];
    SingleTableEntries NewNextState=NewSingleTable[Next][index];

    Next=NewNextState.Next_State;
    if(NewNextState.accept1==1 )
    {
        return 1;           
    }

    index= GuideVector[counter1+1];

    NewNextState=NewSingleTable[Next][index];

    NextState_chunk2=NewNextState.Next_State;
    if(NewNextState.accept1==1 )
    {
        return 1;       
    }       
    //code
 }

1 个答案:

答案 0 :(得分:2)

给定n×n矩阵,其中每个行和列按递增顺序排序。给定数字x,如何确定此x是否在矩阵中。设计的算法应具有线性时间复杂度。

  1. 从右上角元素开始
  2. 循环:将此元素e与x进行比较 i)如果他们是平等的,那么返回它的位置 ii)e&lt; x然后将其向下移动(如果超出矩阵的界限则断开返回false) iii)e> x然后将其移动到左边(如果超出矩阵的界限则断开返回false)
  3. 重复i),ii)和iii)直到找到元素或返回false
  4. 下面的函数搜索mat [] []中的元素x。如果找到该元素,则打印其位置并返回true,否则打印“not found”并返回false。

    int search(int mat[4][4], int n, int x) {
        int i = 0, j = n-1;  //set indexes for top right element
        while ( i < n && j >= 0 ) {
            if ( mat[i][j] == x ) {
                printf("\n Found at %d, %d", i, j);
                return 1;
            }
            if ( mat[i][j] > x )
            j--;
            else //  if mat[i][j] < x
            i++;
        }
        printf("\n Element not found");
        return 0;  // if ( i==n || j== -1 )
    }
    
    int main() {
        int mat[4][4] = {   {10, 20, 30, 40},
                            {15, 25, 35, 45},
                            {27, 29, 37, 48},
                            {32, 33, 39, 50},
                        };
        search(mat, 4, 29);
        getchar();
        return 0;
    }
    

    时间复杂度:O(n)

    上述方法也适用于m×n矩阵(不仅适用于n×n)。复杂性为O(m + n)。