Arhn - архитектура программирования

Как найти минимальный или максимальный элемент в области матрицы?

Для матрицы NxM с целыми значениями, как наиболее эффективно найти минимальный элемент для области (x1,y1) (x2,y2), где 0 ‹= x1‹=x2 ‹ M и 0 ‹= y1 ‹= y2 ‹ N

Можно предположить, что мы будем многократно запрашивать разные регионы.

Мне интересно, можем ли мы расширить методы запроса диапазона минимума на этот вопрос. http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAncestor

Довольно простым решением может быть использование наиболее эффективного решения RMQ (Дерево сегментов ), затем примените его по строкам или столбцам.

В худшем случае сложность будет min(N,M)*log(max(N,M))

Но все же я верю, что мы можем добиться большего.

09.01.2013

Ответы:


1

Это зависит от того, что вы подразумеваете под «наиболее эффективным способом». Можно минимизировать само время запроса, время предварительной обработки или требования к памяти.

Если нужно свести к минимуму только время запроса, «наиболее эффективным способом» является предварительное вычисление всех возможных областей. Затем каждый запрос обрабатывается путем возврата некоторого предварительно вычисленного значения. Время запроса O(1). И память, и время предварительной обработки огромны: O((NM)2).

Более практично использовать алгоритм разреженной таблицы со страницы, указанной в ОП. Этот алгоритм подготавливает таблицу всех интервалов длины степени двойки и использует пару этих интервалов для обработки любого запроса минимального диапазона. Время запроса O(1). Память и время предварительной обработки составляют O (N log N). И этот алгоритм легко распространяется на двумерный случай.

Алгоритм разреженной таблицы в 2D

Просто подготовьте таблицу из всех прямоугольников со степенью двойки длины и высоты со степенью двойки и используйте четыре из этих прямоугольников для обработки любого запроса на минимальный диапазон. В результате получается как минимум четыре минимальных значения для каждого из этих прямоугольников. Время запроса O(1). Память и время предварительной обработки составляют O(NM*log(N)*log(M)).

Этот документ: "Двумерные запросы минимального диапазона" Amihood Amir , Йоханнес Фишер и Моше Левенштейн предлагают, как уменьшить требования к памяти и время предварительной обработки для этого алгоритма почти до O(MN).

Эта статья: "Структуры данных для запросов минимального диапазона в многомерных массивах" Хао Юань и Михаил Дж. Аталлах дает другой алгоритм с временем запроса O (1) и памятью O (NM) и временем предварительной обработки.

10.01.2013

2

Не имея никакой другой информации о содержании матрицы или о том, как она хранится, невозможно сделать какое-либо предложение, кроме как просто просмотреть каждую запись в данном регионе. Это O((x2-x1) * (y2-y1)). Ваш вопрос слишком расплывчатый, чтобы сказать что-то еще.

Возможно, вы могли бы сделать лучше (вероятностно, в среднем случае), если бы вы знали что-то еще о матрице, например, если бы вы знали, что элементы, вероятно, каким-то образом отсортированы.

09.01.2013

3

Псевдокод:

function getMax(M, x1, x2, y1, y2)
    max = M[x1,y1]
    for x = x1 to x2 do
        for y = y1 to y2 do
            if M[x,y] > max then max = M[x, y]
    return max

Это O (n) в размере ввода, который можно разумно интерпретировать только как размер области матрицы (x2 - x1) * (y2 - y1). Если вам нужен минимум, измените max на min и > на ‹. Вы не можете сделать лучше, чем O(n), т.е. проверить каждый из возможных элементов. Предположим, у вас есть алгоритм, который работает быстрее, чем O(n). Тогда он не проверяет все элементы. Чтобы получить неверный случай для алгоритма, возьмите один из элементов, который он не проверяет, и замените его на (max + 1) и повторно запустите алгоритм.

09.01.2013
  • спасибо за констатацию очевидного, но если бы это был массив чисел и запрашивался минимальный элемент в диапазоне, мы могли бы сделать очень хорошо. community.topcoder.com/ 10.01.2013
  • @cirik Я не хочу это читать, и это не было частью вашего вопроса, когда мы отвечали на него. Но по вашему настоянию посмотрел раздел RMQ. Все дело в предварительной обработке массива для получения вспомогательного индекса для ускорения последующих запросов. Этот тип предварительно обработанного индекса является компромиссом, и стоит ли оно того, зависит от того, сколько раз вы ожидаете запросить массив/матрицу перед внесением изменений. Если вы с самого начала имели в виду этот тип предварительной обработки и не упомянули об этом в своем вопросе, это то, что я имел в виду, говоря, что ваш вопрос был расплывчатым. 10.01.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..