簡體   English   中英

使用二進制搜索在已排序的多維數組中查找數字

[英]Find a number in sorted multidimentional array with binary search

我們得到了一個增加排序的多維數組,例如:

int[][] mat = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}};

如何使用二進制搜索查找特定數字? 讓我說我正在尋找3。

您可以通過將一維索引轉換為二維對應來完成此操作。 例如,索引0映射到0, 0但索引4將映射到1, 0 ,索引15將映射到3, 3

這樣您就可以使用標准的二進制搜索算法,當您需要在該特定索引處查找值時,您所要做的就是調用轉換函數。

將一維索引轉換為二維對應的公式為:

row = floor(index / columns);
column = index % columns;

這假設每個數組都已排序,並且在展平時,結果數組也會排序。

如果對多維數組進行排序,則可以將二進制搜索算法分為兩部分。 首先,您將執行二進制搜索以查找包含您要查找的數字的多維搜索中的數組。 然后,在該數組中執行搜索。

希望有所幫助。

您可以為每個子數組使用Arrays.binarySearch()

private static int[] binarySearch2d(int[][] arr, int toFind) {
    int[] index2d = new int[] { -1, -1 };

    // find the row
    int row = -1;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i][0] > toFind) {
            break;
        }
        row = i;
    }

    if (row > -1) {
        int indexInSecond = Arrays.binarySearch(arr[row], toFind);
        if (indexInSecond > -1) {
            index2d[0] = row;
            index2d[1] = indexInSecond;
        }
    }
    return index2d;
}

private static void test() {
    int[][] mat = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 },
            { 13, 14, 15, 16 } };

    int[] found = binarySearch2d(mat, 12);
    int element = mat[found[0]][found[1]];
    System.out.println("Found: " + element + " at mat[" + found[0] + "]["
            + found[1] + "]");
}

將輸出

Found: 12 at mat[2][3]

使用以下索引公式,二維數組可以按以下方式用作一維數組: -

假設你需要在1-d數組中找到第k個索引,那么它就是i= k/nj = k%n元素,其中n是2-d數組中矩陣的階數。 使用二進制搜索,如1-d數組,結尾索引為n * n-1。

替代方法: -

1.>對arr[i][0]的每個1-D數組的第一個元素進行二分查找。

2.>然后使用上面的方法得到包含元素的1-D數組,然后在arr[k]上進行二元搜索。

您可以創建一維array並使用binary搜索。

    int[] arr = new int[]{1, 5, 6};// your converted array
    int index = Arrays.binarySearch(arr, 1);
    if (index >= 0) {
        System.out.println("found ");
    } else {
        System.out.println("not found");
    }

您可以使用每個數組(或最后一個)的第一個數字來查找您的數字可能存在的元素,然后對該元素使用二進制搜索來查找它是否實際存在。

public boolean Find(int[][] array, int number) { 
    int find = -1;
    for(int i = 0; i < N; i++) {
        find = binarySearch(array[i], number, 0, N);
        if(find != -1) { 
           return true; //the element is exist
        }
     }
     return false;//the element is not exist
}

或者您可以修改這個問題它會對您有所幫助

您可以僅使用每個內部數組的第一個元素進行二進制搜索,以查找它所在的行。然后在該行內進行二進制搜索以查找該列。

如果矩陣支持重復,則可能需要更多邏輯。

使用java.util.Arrays 在展平矩陣上使用Arrays.binarySearch()函數:

int[][] mat = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}};


int key = 3;
int[] oneDArray = new int[mat[0].length*mat[0].length];

int s = 0;
for(int i = 0; i < mat[0].length; i ++) 
    for(int j = 0; j < mat[0].length; j ++){                           
        oneDArray[s] = mat[i][j];
        s++;
    } 


int found = Arrays.binarySearch(oneDArray, key);
if(found > -1){
     System.out.println(found/ mat[0].length + "," + found % mat[0].length);    
}

演示: https//ideone.com/bFZVMs

在二維數組中定義“順序”有不同的方法。 對於示例中的順序,在每行的第一個元素上進行bin搜索,找到該行,然后在該行內再次進行bin搜索。 如果行數> =大於列數,則可以優化對角度元素(從(0,0)開始)進行二元搜索,然后對該行的其余部分進行另一次二分查找。

暫無
暫無

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

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