Как найти максимальное значение в любом диапазоне массива за время log (n)?

Например. Массив: {1, 5, 2, 3, 2, 10}

Диапазон: 0-1 Ответ: 5 Диапазон: 2-4 Ответ: 3 Диапазон: 0-5 Ответ: 10 и т. Д.


person Daniel Talamas    schedule 27.02.2012    source источник
comment
Вы не можете. Чтобы найти максимум в несортированной последовательности, вам нужно будет хотя бы один раз просмотреть каждое значение. Это делает алгоритм O (n).   -  person sbi    schedule 27.02.2012
comment
@sbi: Если вы не обработаете массив и не построите дерево поиска / таблицу / что угодно, чтобы получить максимум любого поддиапазона быстрее, чем поиск поддиапазона. Предположительно, об этом и задается вопрос, хотя он немного лаконичен.   -  person Mike Seymour    schedule 27.02.2012
comment
@Mike: Хотя это правда, я бы не назвал такого зверя несортированной последовательностью. Я умышленно оставил эту лазейку, понимаете? :)   -  person sbi    schedule 27.02.2012
comment
Вы думали о создании квантового компьютера для этого?   -  person PlasmaHH    schedule 27.02.2012
comment
вы можете взглянуть на мой комментарий.   -  person ddacot    schedule 27.02.2012
comment
wcipeg.com/wiki/Range_minimum_query предоставляет несколько алгоритмов. Оптимальным является линейное время предварительной обработки плюс постоянное время запроса.   -  person misterbee    schedule 20.01.2014


Ответы (4)


Если массив не отсортирован, то сделать то, что вы просите, невозможно.

Чтобы найти максимум, вам нужно по крайней мере проверить все элементы в диапазоне, что занимает O (n).

Если вы разрешите некоторую форму предварительной обработки данных, это легко. Вы можете просто построить поисковую таблицу n 2 с ответами. Тогда вы сможете найти максимум для любого диапазона за постоянное время.

person aioobe    schedule 27.02.2012

Это невозможно. Придется посетить каждый элемент.

Если ваш массив отсортирован априори, то это операция O (1).

person GregC    schedule 27.02.2012

См. Также здесь: Как лучше всего получить минимальное или максимальное значение из массива чисел?

Как отмечали другие, это невозможно

person Azrael3000    schedule 27.02.2012

@ Даниэль Таламас, если я правильно вас понял, вы этого хотели:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int maxlement(int range1,int range2) {
std::vector<int> v{ 1, 5, 2, 3, 2, 10 };
std::vector<int>::iterator result;

result = std::max_element(v.begin()+range1, v.begin()+range2+1);
int dist = std::distance(v.begin(), result);
return v[dist];

}
int main() {
int range1,range2;
cout<<"From ";
cin>>range1;
cout<<"To ";
cin>>range2;
cout<<"Max Element Is "<<maxlement(range1,range2);
return 0;
}
person ddacot    schedule 27.02.2012
comment
Только в логарифмическом, а не в линейном времени. - person Mike Seymour; 27.02.2012