Поиск в матрице — различия между версиями
Kolchanov (обсуждение | вклад) |
Kolchanov (обсуждение | вклад) |
||
| Строка 51: | Строка 51: | ||
| − | ==Решение за O | + | ==Решение за O(log^2(n))== |
Идея решения за O(<tex>(log(n))^2</tex>) основана на принципе "разделяй и властвуй". | Идея решения за O(<tex>(log(n))^2</tex>) основана на принципе "разделяй и властвуй". | ||
Версия 15:13, 23 января 2016
| Задача: |
| Задана отсортированная двумерная матрица, состоящая из n строк и m столбцов. Необходимо найти расположение указанного элемента в матрице или определить, что данный элемент в матрице отсутствует. |
| Определение: |
| Отсортированная матрица - матрица, для которой выполнено следующее условие: |
Содержание
Решение за O(nm)
Для начала рассмотрим наивный алгоритм поиска элемента. В каждой строке исходной матрицы запускаем линейный поиск, если находим элемент, то возвращаем его координаты . Время работы — .
Решение за O(nlog(m))
Данный способ решения использует наивное решение за , улучшенное с помощью двоичного поиска. Для этого в каждой строке запускается двоичный поиск. Время работы — .
Замечание
Время работы может быть улучшено до . Для этого необходимо модифицировать алгоритм так, чтобы в том случае, если столбцов больше чем строк, он бы запускал двоичный поиск по строкам, если строк больше — наоборот.
Решение за O(n + m)
В данном решении мы начинаем поиск из правого верхнего угла и движемся к искомому элементу. Идея алгоритма в том, что если текущий элемент меньше необходимого, то мы сдвигаемся на одну строку вниз. Если он больше, то мы сдвигаемся на одну колонку вправо.
Код
if (target < a[0][0] || target > a[N-1][N-1])
return false;
row = 0;
col = N-1;
while (row <= N-1 && col >= 0) {
if (a[row][col] < target)
row++;
else if (a[row][col] > target)
col--;
else
return true;
return false;
Оценка времени работы
Очевидно, что во время работы указатель сдвигается максимум на n строк и m столбцов. В этом случае время работы составляет .
Решение за O(log^2(n))
Идея решения за O() основана на принципе "разделяй и властвуй".
Идея решения
1) Выбираем центральную строку или столбец в матрице (middle), по которому мы будем перемещаться. Используя линейный поиск, необходимо найти такое значение i, что выполняется следующее условие: .

