【问题标题】:Binary search of sorted-by-column 2D array only searching first column按列排序的二维数组的二进制搜索仅搜索第一列
【发布时间】:2015-10-15 17:59:19
【问题描述】:

所以我对编程很陌生,我正在尝试将二进制搜索算法应用于按列排序的二维数组。我的程序只在第一列上正确执行,所以我认为它陷入了无限循环。问题似乎在我的 while 循环中的第二个 else-if 语句中,但我完全不知道问题可能是什么。

public static void main(String[] args) {
    // TODO Auto-generated method stub

    int[][] array = { {5, 8, 10, 6},
            {20, 10, 20, 15},
            {20, 15, 25, 20}, 
            {20, 20, 32, 25} };
    int query = 20;

    int search_status;
    search_status = count(array, query);
    System.out.println(query + " occurred " + search_status + " times");

}

public static int count(int[][]array, int query){
    int count = 0;
    int low = 0;
    int high = array.length - 1;
    for (int c = 0; c < array[0].length; c++) {
        while (low <= high) {
            int mid = low + (high - low) / 2;

            if (array[mid][c] > query) {
                high = mid - 1;
            }
            else if (array[mid][c] < query) {
                low = mid + 1;
            }
            else if (array[mid][c] == query) {
                count++;
                int up = -1;
                int down = 1;
                while ((mid + up >= 0) && (array[mid + up][c] == query)) {
                    up--;
                    count++;
                }
                while ((mid + down <= array.length - 1) && (array[mid + down][c] == query)) {
                    down++;
                    count++;
                }
                return count;
            }
        }
    }
    return - 1;
}

}

【问题讨论】:

    标签: java arrays algorithm multidimensional-array binary-search


    【解决方案1】:

    尝试这种先将列推入行的方法:

    public static void main(String[] args) {
        // TODO Auto-generated method stub
    
        int[][] array = { {5, 8, 10, 6},
                {20, 10, 20, 15},
                {20, 15, 25, 20}, 
                {20, 20, 32, 25} };
        int query = 20;
    
        int search_status = 0;
    
        for (int c = 0; c < array.length; c++)
            search_status += count(array, query, c);
    
        System.out.println(query + " occurred " + search_status + " times");
    
    }
    
    public static int count(int[][]array, int query, int row){
        int[] column = new int[array.length];
        int count = 0;
        int low = 0;
        int high = column.length - 1;
    
        for (int i = 0; i < array[row].length; i++)
            column[i] = array[i][row];
    
        while (low <= high) {
            int mid = low + (high - low) / 2;
    
            if (column[mid] > query) {
                high = mid - 1;
            }
            else if (column[mid] < query) {
                low = mid + 1;
            }
            else if (column[mid] == query) {
                int mover = -1;
                int counted = 1;
    
                // Go all the way down
                while ((mid + mover >= 0) && (column[mid + mover] == query))
                {
                    mover--;
                    counted++;
                }
    
                mover+=counted+1;
                count+=counted;
    
                while ((mid + mover <= column.length - 1) && (column[mid + mover] == query))
                {
                    mover++;
                    count++;
                }
    
                return count;
            }
        }
    
        return 0;
    }
    

    编辑:稍微好一点的实现,以免重复计算。

    【讨论】:

    • 列是按升序排列的,不是吗?我确实看到我在第一列中留下了三个 20,但是当我有 5、18、20、20 时,它的执行方式相同。
    • 你是绝对正确的。我可以建议另一种方法吗?如果您将列放入数组中,然后以传统方式对它们进行二进制搜索呢?
    • 谢谢!我会试试看。
    • 这个实现有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多