二维搜索二维数组与重复Java

时间:2011-11-22 22:39:03

标签: java algorithm search

设计一个算法,FindElement(a,p),其中“a”是带有重复的正整数的二维正方形数组,每个整数行按非递减顺序排列:  a [i] [0]≤a[i] [1]≤a[i] [2]···≤a[i] [n-1] (i = 0,1,...,n-1),.算法应该定义p是否包含在a中。如果“p”成立,它应该返回true,否则返回false。 您的算法必须尽可能高效。算法应该基于二进制搜索

我找到了以下解决方案(但我不确定它是否正确):

解决方案是使用二进制搜索一次搜索在一行上工作的元素。二进制搜索给定的大小(n)的排序行需要O(Log(n)),因此在最坏的情况下需要O(nlog(n))来搜索整个数组。

此解决方案是否适合特定任务?我不知道如何实现这个算法,请你给我伪代码或解释如何做到这一点。 提前谢谢。

6 个答案:

答案 0 :(得分:1)

是的,您的解决方案似乎正确且有效(鉴于您对初始问题的描述,他们可能希望您使用二进制搜索)。你的算法应该是这样的:

public Point FindElement(int[][] matrix, int number) {
    Point p = new Point(); // holds two integers and represents 
                           // a position in the matrix.
    int found = -1;
    for(int i = 0; i < N; i++) {
        found = binarySearch(matrix[i], number, 0, N);
        if(found != -1) { 
           p.setX(i); 
           p.setY(found); 
           return p; 
        }
    }
    return null;
}

可以根据此处的伪代码实现二进制搜索:http://en.wikipedia.org/wiki/Binary_search_algorithm#Recursive

答案 1 :(得分:1)

是的解决方案是正确的。

这是伪代码

     int index = -1;
    for (int i : height of array){
      int[] putIn1Darray = a[i][j] where j = 0 to n;
      index = Arrays.binarySearch(putIn1Darray,p); 
      if (index == -1)
          //Element not found yet
          continue;
      else
          //Element found
          break;   
    } 
    print index;

上述算法用于显示元素p的第一次出现。

您可以根据您的硬件修改它。

答案 2 :(得分:0)

二进制搜索仅适用于排序列表。所以,如果它是合适的:我会说是的。当你得到所有重复的答案时,请确保你前进和后退。

您可以将此作为基础: http://www.java-tips.org/java-se-tips/java.lang/binary-search-implementation-in-java.html

答案 3 :(得分:0)

在现实生活中,如果我能保证数据的排序,我会使用java.util.Arrays.binarySearch。我使用Arrays.sort函数对数组进行排序或使用TreeMap / TreeSet加载数据并使用get函数。

答案 4 :(得分:0)

如果我正确理解了您的问题描述,那么您在各行之间没有任何关系/约束,对吧?只是单行中的元素按升序排序。

如果你需要经常搜索,只需将矩阵作为列表阅读并再次排序。这需要N ^ 2 * log(N)的时间。之后只需在该折叠列表上进行二进制搜索,该列表将再次按log(N)的顺序作为log(N ^ 2)= 2 * log(N)。

预处理可以包含在搜索时间中的收支平衡点是您至少搜索N次。

答案 5 :(得分:0)

以下是我如何看待这个问题:

有蛮力的方式,半蛮力的方式和有效的方式。 我没有看到这里列出的有效方式。

假设它是一个方阵,n =行数/列数

  1. 蛮力方式是线性搜索一切,O(n ^ 2),

  2. 您的方法(以及列出的其他答案),O(n log n),

  3. 更有趣的答案,二维二分法搜索。

  4. 假设您有一个在矩阵中搜索值的函数,

    boolean findInMatrix(a, p)
    {       
        if(a == null) 
            return false;
        //Compare the middle of the matrix with p
    
        if(p == a[n/2][n/2])
            return true;        
    
        if(a.length == 1)
            return false;       
    
        if p < a[n][n], then 
            return findInMatrix(top left, p) || findInMatrix(bottom left, p) || findInMatrix(top right, p);
        else 
            return findInMatrix(bottom right, p) || findInMatrix(bottom left, p) || findInMatrix(top right, p);
    }
    
    砰的一声,完成了。当然,您需要处理如何传入矩阵的一部分进行搜索,您可以通过传入2D范围来使用就地方法,也可以复制矩阵。 如您所见,它在每次迭代时都是二进制搜索x 3。复杂性应该仍然是O(log N),其中N是细胞总数,n ^ 2.

    这个解决方案的灵感来自于我认为我们应该充分利用给定的属性,而不仅仅是使用一半的一维排序搜索。

    如果我的解决方案有误,请告诉我。

    注意:哎呀,我把这个问题误读为Clockwork-Muse。此解决方案不适用于该问题。

相关问题