У меня есть программа, которая ищет массив 2d, используя двоичный поиск. В этом случае я использую приведенную ниже матрицу и ищу целые числа 4,12,110,5,111. Программа находит все из них, за исключением 110 и 111, почему это?Бинарный поиск отсортированного массива 2d
{1,3,7,8,8,9,12},
{2,4,8,9,10,30,38},
{4,5,10,20,29,50,60},
{8,10,11,30,50,60,61},
{11,12,40,80,90,100,111},
{13,15,50,100,110,112,120},
{22,27,61,112,119,138,153},
public static boolean searchMatrix(int[][] matrix, int p,int n) {
int low = 0, high = n-1 ;
while (low < high) {
int mid = (low + high)/2;
if (p == matrix[mid][0])return true;
else if (p < matrix[mid][0]) high = mid - 1;
else if (p < matrix[mid+1][0]) { low = mid; break; }
else low = mid + 1;
}
int row = low;
low = 0; high = matrix[row].length - 1;
while (low <= high) {
int mid = (low + high)/2;
if (p == matrix[row][mid]) return true;
else if (p < matrix[row][mid]) high = mid - 1;
else low = mid + 1;
}
return false;
}
Я не хочу быть придирчивым, но это не «двоичный» поиск, не так ли? Гораздо лучше, чем ничего, еще :-) –
@SimonFischer Да, вы правы, спасибо. Я сделал исправление. Я думаю, что я назвал его двоичным поиском, потому что он следует тому же шаблону «<: идти одним путем,> =: идти другим путем». Но технически это не двоичный, поскольку он не разбивает пространство поиска пополам на каждом шаге (если это это было бы O (log (n^2)), которое быстрее, чем O (n)). Моя ошибка. – Shashank