簡體   English   中英

二維搜索二維數組與重復Java

[英]Binary search in 2 dimensional array with duplicates Java

設計一個算法,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))來搜索整個數組。

這個解決方案是否適合於給定的任務? 我不知道如何實現這個算法,請你給我偽代碼或解釋如何做到這一點。 提前致謝。

是的,您的解決方案似乎是正確和有效的(鑒於您對初始問題的描述,他們可能希望您使用二進制搜索)。 你的算法應該是這樣的:

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

是解決方案是正確的。

這是偽代碼

     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的第一次出現。

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

以下是我如何看待這個問題:

有蠻力的方式,半蠻力的方式和有效的方式。 我沒有看到這里列出的有效方式。

假設它是一個方陣,n =行數/列數

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

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

  3. 更有趣的答案,2D二進制搜索。

假設您有一個在矩陣中搜索值的函數,

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。 此解決方案不適用於該問題。

二進制搜索僅適用於排序列表。 所以,如果它是合適的:我會說是的。 當你得到所有重復的答案時,請確保你前進和后退。

您可以將此作為基礎: http//www.java-tips.org/java-se-tips/java.lang/binary-search-implementation-in-java.html

在現實生活中,如果我能保證數據的排序,我會使用java.util.Arrays.binarySearch。 我使用Arrays.sort函數對數組進行排序或使用TreeMap / TreeSet加載數據並使用get函數。

如果我正確理解你的問題描述,那么你在各行之間沒有任何關系/約束,對嗎? 只是單行中的元素按升序排序。

如果你需要搜索很多,只需將矩陣作為列表讀取並再次排序。 這需要N ^ 2 * log(N)的時間。 之后,只在該折疊列表上進行二進制搜索,該列表再次按log(N)的順序作為log(N ^ 2)= 2 * log(N)。

可以將預處理包含在搜索時間中的收支平衡點是您至少搜索N次。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM