2017-01-03 2 views
-2

У нас есть m разных продуктов (от 1 до m). тендер открыт в течение нескольких дней, в течение этих дней русский человек дает предложение о покупке (каждое предложение относится к одному продукту), В конце каждого дня продукт (формирует все продукты, которые еще не были проданы) с самым высоким предложением будет продан .внедрение структуры данных

мы должны реализовать структуру данных, которая обеспечивает следующие операции:

  1. Init (м) -> инициализирует DS с т элементов без предложений
  2. Bid (у, р) -> добавляет предложение с ценой p к продукту j по сложности O (1) амортизируется
  3. Sell-> продает продукт с самым высоким предложением. return j (продукт, который был продан) и p (цена, в которой продукт был продан) по сложности O (log m) амортизирован.

я пытался решить вопрос с помощью fibonacce кучки:

  • мы создаем новую Фибо кучу и вставить т раз (продукты с ключом у и информация нуль)

  • I используйте идею уменьшения ключа в кучих флюида и переключите информацию с новым p в

  • Я использую идею delete min для удаления max

Так что, чтобы решить проблему, я думаю, что я должен использовать максимальные кучи, а не минимальные кучи, это заставляет меня думать, что я ошибаюсь.

Кто-то может помочь мне получить истинное решение?! **

+0

Да, вам нужна максимальная куча. Помимо этого, решение, которое вы набросаете, является правильным. –

ответ

0

Вы можете получить O (log M) для Bid() и O (1) для Sell(), сохранив хеш-таблицу продуктов до максимальной ставки и список товаров, отсортированный по максимальной ставке.

Для Bid() вы обновляете таблицу, если необходимо, и обновляете список с помощью бинарного поиска, если это необходимо; Для Sell() вы просто выставляете верхний элемент из списка и получаете цену с карты.

+0

Не видите, как вы можете делать ставку в O (log n) со списком. Если список является дважды связанным списком, то перемещение элемента при размещении новой заявки требует поиска O (n). Если список поддерживается в массиве, то поиск нового пятна - O (log n), но на самом деле его вставка будет O (n), потому что вам нужно переместить все вниз, чтобы создать пробел. –

+0

, мы получили эту проблему, узнав о бинарных кучах, биномиальных кучках, ленивых биномиальных кучках и кучах фишек, поэтому я думаю, что в ответе должна использоваться идея этих структур данных. В соответствии со сложностью, требуемой выше, этот вопрос заставляет задуматься об использовании кучи фишек, но продавая max (вместо min in fib) и увеличивая информацию (вместо уменьшения ключа в fib), мне сложно выполнить решение , – user7370059