Я недавно попросил построить структуру данных, которая поддерживает четыре операции, а именно,Как оптимизировать эту структуру данных?
- принудительный: Добавить элемент в DS.
- Pop: Удалите последний толкаемый элемент.
- Find_max: Найдите максимальный элемент из сохраненных в данный момент элементов.
- Pop_max: удалить максимальный элемент из DS.
Элементы представляют собой целые числа.
Вот решение, которое я предложил:
- Возьмите пачку.
- Хранить пару элементов в нем. Пара должна быть (элемент, max_so_far), где элемент является элементом этого индекса и max_so_far - это максимальный элемент, который был оценен до сих пор.
- Нажав элемент в стек, проверьте max_so_far самого верхнего элемента стека. Если текущее число больше этого, поместите значение текущей пары max_so_far в качестве значения текущего элемента, иначе сохраните предыдущий max_so_far. Это означает, что нажатие будет просто выполнять операцию
O(1)
. - Для
pop
просто вытащите элемент из стека. Опять же, эта операция -O(1)
. - Для
Find_max
верните значение max_so_far верхнего элемента в стеке. Опять же,O(1)
. - Попадание элемента max будет проходить через стек и явно удалять элемент max и отбрасывать элементы поверх него, после выделения новых значений max_so_far. Это было бы линейно.
Меня попросили улучшить его, но я не мог.
Что касается временной сложности, общее время можно улучшить, если все операции произойдут в O(logn)
, я думаю. Как это сделать, я не могу получить.
Вы написали код? –
Кодирование это очень тривиально. Проблема не в коде, а в алгоритме. – Ranveer
Когда вы получаете кодировку и работу, подумайте о публикации на [Code Review] (http://codereview.stackexchange.com) :) У них будут указатели на * код *, а также на алгоритм. –