Пересмотр: 2D-массив отсортирован по осям X и Y - PullRequest
4 голосов
/ 21 декабря 2010

Итак, это общий вопрос для интервью.Уже есть тема, которую я прочитал, но она мертва, и ответ так и не был принят.Кроме того, мои интересы лежат в несколько более ограниченной форме вопроса с парой практических применений.

Учитывая двумерный массив такой, что:

  • Элементы уникальны.
  • Элементы сортируются вдоль оси x и оси y.
  • Ни одна из сортировок не имеет преимущественного значения, поэтому ни одна из них не является вторичным параметром сортировки.
  • В результатедиагональ также отсортирована.
  • Все виды можно рассматривать как движущиеся в одном направлении.То есть все они восходящие или все убывающие.
  • Технически, я думаю, если у вас есть компаратор> / = / <, любой общий порядок должен работать. </li>
  • Элементы представляют собой числовые типы с одноцикловым компаратором.
  • Таким образом, операции с памятью являются доминирующим фактором в анализе больших значений.

Как найти элемент?Имеет значение только анализ наихудшего случая.

Решения, которые мне известны:
Разнообразные подходы:
O (nlog (n)), когда вы подходите к каждой строке отдельно.
O(nlog (n)) с сильной лучшей и средней производительностью.

Тот, который является O (n + m):
Начните с неэкстремального угла, который, как мы предположим, будет справа внизу.
Пусть целью будет J. Cur Pos - M.
Если M больше, чем J, двигаться влево.
Если M меньше, чем J, двигаться вверх.
Если вы не можете сделать ни того, ни другого, все готово, а J отсутствует.
Если Mравно J, все готово.
Первоначально найден в другом месте, последний раз украден из здесь .

И я полагаю, что видел один с O (n + m) в худшем случае, но оптимальным случаем почти O (log (n)).

Что мне интересно:

Прямо сейчас я с удовлетворением доказал, что наивная атака с разделами всегда переходит к nlog (n).Атаки с разделением в целом, как представляется, имеют оптимальный наихудший случай O (n + m), и большинство из них не заканчиваются рано в случаях отсутствия.В результате мне также стало интересно, не может ли интерполяционный зонд быть лучше, чем бинарный зонд, и поэтому мне пришло в голову, что можно подумать об этом как о проблеме пересечения множеств со слабым взаимодействием между множествами.Мой разум сразу обратился к пересечению Баэса-Йейтс , но у меня не было времени подготовить адаптацию этого подхода.Однако, учитывая мои подозрения, что оптимальность O (N + M) наихудшего случая доказуема, я подумал, что я просто хочу пойти дальше и спросить здесь, чтобы посмотреть, сможет ли кто-нибудь собрать противоположный аргумент или собрать рекуррентное отношениедля интерполяционного поиска.

Ответы [ 2 ]

0 голосов
/ 08 июля 2013

Оптимальное решение O (m + n) - начать с верхнего левого угла, который имеет минимальное значение.Перемещайтесь по диагонали вниз вправо, пока не дойдете до элемента, значение которого> = значение данного элемента.Если значение элемента равно значению данного элемента, возвращаемое значение равно true.

В противном случае отсюда мы можем действовать двумя способами.

Стратегия 1:

  1. Двигайтесь вверх по столбцу и ищите заданный элемент, пока не дойдете до конца.Если найдено, вернуть найденное как true
  2. Переместиться влево в строке и искать заданный элемент, пока мы не достигнем конца.Если найдено, возвращаемое найдено как истинное
  3. возвращаемое найдено как ложное

Стратегия 2: Пусть i обозначает индекс строки, а j обозначает индекс столбца диагонального элемента, на котором мы остановились.(Здесь мы имеем i = j, кстати).Пусть k = 1.

  • Повторяйте приведенные ниже шаги, пока ik> = 0
    1. Поиск, если a [ik] [j] равно данному элементу.если да, вернуть найдено как true.
    2. Поиск, если a [i] [jk] равен данному элементу.если да, возвращаемое значение равно true.
    3. Приращение k

1 2 4 5 6
2 3 5 7 8
4 6 89 10
5 8 9 10 11

0 голосов
/ 22 декабря 2010

Вот доказательство того, что оно должно быть не менее Omega(min(n,m)). Пусть n >= m. Затем рассмотрим матрицу, которая имеет все 0 с (i,j), где i+j < m, все 2 с i+j >= m, за исключением одного (i,j) с i+j = m, который имеет 1. Это действительная входная матрица, и для 1 возможно m размещение. Ни один запрос в массив (кроме фактического местоположения 1) не может отличить эти m возможные места размещения. Таким образом, вам придется проверить все m местоположений в худшем случае и, по крайней мере, m/2 ожидаемых местоположений для любого рандомизированного алгоритма.

Одним из ваших предположений было то, что матричные элементы должны быть уникальными, а я этого не делал. Однако это легко исправить, поскольку вы просто выбираете большое число X=n*m, заменяете все 0 с уникальными номерами, меньшими X, все 2 с уникальными номерами, большими X и 1 с X.

И поскольку это также Omega(lg n) (подсчет аргумента), это Omega(m + lg n), где n>=m.

...