как найти n-й минимум / максимум из всех подмассивов размера k (проблема скользящего окна)

#arrays #algorithm #data-structures

#массивы #алгоритм #структуры данных

Вопрос:

Существует так много ссылок, чтобы найти минимум / максимум из всех подмассивов размера k, но как найти n-й максимум / минимум наилучшим возможным способом. Если нам нужно найти только минимальное / максимальное количество подмассивов, то мы можем использовать решение deque с линейной временной сложностью. Но для n-го минимума / максимума я не могу найти решение.

Примечание: n<=k

Пример: arr = {7,1,4,20,11,17,15} n = 2, k = 4

вывод: 4,4,11,15

Комментарии:

1. Вопросы должны быть самодостаточными. Каков ваш подход?

2. Что вы подразумеваете под «лучше»? Детерминированное линейное время? Меньший постоянный коэффициент?

3. @user202729 Я упомянул о своем подходе. Должен ли я уточнить больше?

4. @user202729 Просто хочу знать, каков наилучший подход к этой проблеме. Например, могу ли я изменить решение проблемы со скользящим окном, используя deque, и все будет сделано. Я имею в виду, сможем ли мы решить это за линейное время.

5. Пожалуйста, предоставьте любую необходимую информацию из связанных статей в тексте вопроса. Ссылки могут обрываться. (Это также может помочь нам всем упорядочить наши мысли вокруг того, что важно для этого вопроса.)

Ответ №1:

Я полагаю, что нужная вам структура данных — это немного модифицированное двоичное дерево поиска (BST), где каждый узел также хранит размер своего поддерева.

Добавление, удаление элементов или нахождение n-го элемента в BST все тогда становится log(K) * . Таким образом, при перемещении окна по вашему массиву у вас есть 3 log(K) операции, предполагающие общее количество N элементов в данном массиве, следовательно, общая временная сложность N*log(K) .

  • Вам нужен сбалансированный BST (например, красно-черное дерево), чтобы поддерживать эту временную сложность. Если вы обращаетесь к каким-либо онлайн-судьям, таким как Codeforce или Hackerrank, помните, что они чаще всего предоставляют входные данные, которые будут генерировать вырожденные BSTS.

Комментарии:

1. Проголосовал за это, но я не уверен, что мы не можем сократить коэффициент регистрации.

2. Спасибо, честно говоря, я тоже не убежден