使用二进制搜索的问题

时间:2014-05-09 20:50:30

标签: java search binary

我目前正在编写一些代码,用于解决分配的数独谜题。我目前编写的代码应该是隔离我们需要插入值的行和列,然后测试值1-9以查看哪些已经出现在行或列中。问题是,二进制搜索没有检测到一些数字,我不知道为什么。这是我的代码。你需要的只是A.grid是一个包含未解决的谜题的数组,而set值方法是我编写的用于将值插入数组并使用fromat setValue(xLocation,yLocation,value)

int currentVal = 0;
    int j;
    int [] currentRow = new int [9];
    int [] currentCol = new int [9];
    for (i = 0; i<9 ; i++) {
        for (j = 0; j<9 ; j++){
            currentVal=A.grid[i][j];
            boolean keepGoing = true;
            int newVal=1;
            if (currentVal==0) {
                for( int k = 0; k < 9; k++) 
                {currentCol[k] = A.grid[k][j];
                        }
                    currentRow = A.grid[i];
                    log(Arrays.toString(currentRow));
                    log(Arrays.toString(currentCol));
                    log("");
                while (keepGoing) {
                        int indexRow=Arrays.binarySearch(currentRow, newVal);
                        int indexCol=Arrays.binarySearch(currentCol, newVal);
                        log(indexRow);
                        log(indexCol);
                        log("");
                        if (indexRow<0 && indexCol<0) {
                            keepGoing = false;
                        }
                        newVal++;

            }
            A.setValue(j, i, newVal-1); 

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定这是否是您唯一的问题,但如果您要使用二进制搜索算法,则需要确保对数组进行排序。否则,你将获得垃圾结果。

话虽如此,为什么你认为你需要在只有9个元素的数组上进行二进制搜索?只需手动进行搜索并忘记使用二进制搜索就可能更快。

int indexRow = -1;
for (int z = 0; z < 9; ++z)
{
    if (currentRow[z] == newVal)
    {
        indexRow = z;
        break;
    }
}

// indexRow is now the index of newVal in currentRow

就此而言,如果将整个例程包含在一个单独的函数中,那么可能会更清楚:

int search(int[] source, int val)
{
    for (int z = 0; z < source.length; ++z)
    {
        if (source[z] == val)
        {
            // z is the position of val in the source array
            return z;
        }
    }

    // Return -1 if val is not present
    return -1;
}

然后,您将使用对search()的调用替换您的binarySearch()调用。

我希望这有帮助!