Амортизированная стоимость вставки/удаления в минимальной куче

Недавно я столкнулся с вопросом на собеседовании. никакая дополнительная информация не ставится под сомнение (возможно, следует использовать реализацию по умолчанию...)

Амортизированная стоимость n произвольных последовательностей операций вставки и удаления в пустой минимальной куче (местоположение элемента удаления известно) составляет:

А) вставить O(1), удалить O(log n)

B) вставить O (log n), удалить O (1)

Вариант (B) правильный.

Я удивлен, когда вижу лист ответов. я знаю, что это сложно, может быть, пустая куча, может быть, зная расположение элементов для удаления,... я не знаю, почему (A) ложно? Почему (В) верно?


person Community    schedule 07.12.2020    source источник
comment
(A) Можно реализовать с помощью кучи Фибоначчи, см. Википедию. Не уверен, почему они говорят, что это ложь, когда она явно существует.   -  person Zabuzard    schedule 07.12.2020
comment
Куча Фибоначчи @Zabuzard точно обратная, я худая! я ошибся?   -  person    schedule 07.12.2020
comment
Верно. У вас есть больше контекста? Почему они говорят, что оно ложно, когда оно явно существует?   -  person Zabuzard    schedule 07.12.2020
comment
правда не знаю!! можно ли сделать хорошо и действительные ссылки сравнить в качестве ответа. @Zabuzard, ты такой эксперт...   -  person    schedule 07.12.2020
comment
@Zabuzard Договорился о кучах Фибоначчи. Я предположил (?), что OP относится к классической двоичной куче, и в этом случае ответ (A) неверен, а ответ (B) правильный, хотя при втором чтении я понимаю, что OP на самом деле не указывал, что .   -  person templatetypedef    schedule 07.12.2020
comment
может быть, из-за расположения элемента, который нужно удалить, известно @Zabuzard, может быть, пустая куча, наверняка есть трюк ...   -  person    schedule 07.12.2020
comment
@templatetypedef Я согласен с тобой. Я думаю, что следует использовать классическую и общую кучу, потому что никаких других подробностей не предоставлено.   -  person    schedule 07.12.2020
comment
Нет, я имею в виду, есть ли какая-нибудь информация о том, что вы на самом деле должны делать? Например, вам разрешено ограничивать входной домен? Например, только отсортированные входы? Или только произвольные входы?   -  person Zabuzard    schedule 07.12.2020
comment
ответ templatetypedefs абсолютно правильный. Вы должны понимать, что означает амортизированная стоимость. Если ранее вам приходилось тратить много времени на вставку, это компенсирует дорогостоящие затраты на удаление при анализе и снова ослабит его. Математически мы говорим о потенциальных функциях, и потенциал структуры данных возрастает по мере того, как вы выполняете больше работы. А затем дорогостоящий вызов на удаление может использовать этот потенциал вместо этого, что приведет к снижению амортизированной стоимости.   -  person Zabuzard    schedule 07.12.2020
comment
@Zabuzard, никаких ограничений. просто любой тип кучи, будь то классический или общий. какова твоя идея?   -  person    schedule 07.12.2020
comment
Я просто пытался понять ваш вопрос, в котором не хватает деталей. Но теперь вы получили хороший ответ.   -  person Zabuzard    schedule 07.12.2020
comment
Спасибо @Zabuzard :) Именно это очень сложно... Жесткое интервью с отсутствием информации. Потенциальный метод очень хорош, если вы тоже можете дать ответ.   -  person    schedule 07.12.2020


Ответы (2)


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

Итак, давайте возьмем Вариант 1, который присваивает амортизированную стоимость O(1) вставкам и амортизированную стоимость O(log n) удалениям. Мы должны задать следующий вопрос: верно ли, что для любой последовательности операций над пустой двоичной кучей реальная стоимость этих операций ограничена сверху амортизированной стоимостью этих операций? И в этом случае ответ - нет. Представьте, что вы делаете последовательность из n вставок в кучу. Фактическая стоимость выполнения этих операций может быть Θ(n log n), если каждый элемент должен подниматься до вершины кучи. Однако амортизированная стоимость этих операций при такой схеме учета будет равна O(n), поскольку мы выполнили n операций и сделали вид, что каждая из них стоит O(1) времени. Следовательно, эта схема амортизированного учета не работает, так как позволяет недооценивать работу, которую мы делаем.

С другой стороны, давайте посмотрим на вариант 2, где мы назначаем O(log n) в качестве амортизированной стоимости вставки и O(1) в качестве амортизированной стоимости удаления. Теперь можем ли мы найти последовательность из n операций, где реальная стоимость этих операций превышает амортизированную стоимость? В этом случае ответ - нет. Вот один из способов увидеть это. Мы установили амортизированную стоимость вставки равной O(log n), что соответствует ее реальной стоимости, поэтому единственный способ, которым мы могли бы в конечном итоге занизить общую сумму, — это наша амортизированная стоимость удаления (O(1)). ), что ниже реальной стоимости удаления. Впрочем, здесь это не проблема. Чтобы мы могли выполнить операцию удаления, мы должны предварительно вставить удаляемый элемент. Совокупная реальная стоимость вставки и удаления равна O(log n) + O(log n) = O(log n), а совокупная амортизированная стоимость вставки и удаления равна O(log n) + O(1). ) = O (log n). Так что в этом смысле представление о том, что удаление происходит быстрее, не меняет наших общих затрат.

Хороший интуитивный способ понять, почему второй подход работает, а первый нет, — это подумать о том, что такое амортизированный анализ. Интуиция, стоящая за амортизацией, заключается в том, чтобы взимать немного больше за более ранние операции, чтобы будущие операции занимали меньше времени. В случае второй схемы учета именно это мы и делаем: мы смещаем стоимость удаления элемента из двоичной кучи обратно на стоимость вставки этого элемента в куче в первую очередь. Таким образом, поскольку мы только перемещаем работу назад, сумма амортизированных затрат не может быть ниже суммы реальных затрат. С другой стороны, в первом случае мы сдвигаем работу вперед во времени, заставляя удаления оплачивать вставки. Но это проблема, потому что, если мы сделаем кучу вставок, а затем никогда не сделаем соответствующих удалений, мы переложим работу на несуществующие операции.

person templatetypedef    schedule 07.12.2020
comment
всегда у нас должна быть реальная стоимость › амортизированная стоимость? - person ; 07.12.2020
comment
Да, реальные затраты всегда должны быть меньше или равны амортизированным затратам. В противном случае амортизированные затраты не очень полезны (например, мы могли бы представить, что все стоит O(1), но это не будет соответствовать тому, что мы видим, если мы действительно используем структуру данных). - person templatetypedef; 07.12.2020
comment
Я тоже удивлен!! если сортировка слиянием принимает O (n log n) для n элементов, для одного элемента мы получаем O (log n), потому что делим на n. поэтому реальная стоимость больше амортизированной. я ошибаюсь полностью? - person ; 07.12.2020
comment
Амортизация обычно применяется в тех случаях, когда у вас есть несколько операций, выполняемых одна за другой, и вы хотите распределить затраты по этим операциям. (Например, ваш вопрос касался переноса работы между различными операциями в двоичной куче). Обычно вы не задумываетесь о проведении амортизированного анализа сортировки слиянием, поскольку сортировка слиянием представляет собой единый сквозной алгоритм, а не структуру данных с различными операциями, которые можно произвольно чередовать. - person templatetypedef; 07.12.2020
comment
идеально. действительно мило - person ; 07.12.2020
comment
действительно очень хороший ответ. пять раз читал... сейчас снова. еще один вопрос, есть ли какая-либо действующая книга или ссылки на советы по верхней границе реальной стоимости и амортизированной стоимости? вы очень хорошо это определяете. ты такой эксперт. - person ; 07.12.2020
comment
Для интуитивного понимания того, что такое амортизация, и некоторых основных методов, посетите эти слайды. Мне также нравится эта глава книги в качестве ссылки. - person templatetypedef; 07.12.2020
comment
большое спасибо. один момент сомневаюсь во мне. если у нас есть опция (C), как вставить O (log n), удалить O (log n), как насчет этого. не могли бы вы учесть это в своем ответе? Спасибо. - person ; 07.12.2020
comment
Основываясь на том, что вы здесь увидели, что вы думаете? Будет ли это когда-либо недооценивать общий объем работы, выполненной в любой последовательности операций? - person templatetypedef; 07.12.2020
comment
поэтому реальная стоимость O (n log n) вставить O (n log n) удалить. Я стараюсь больше, чтобы лучше понять, но поскольку этот случай приходит мне на ум, это лучше помогает для понимания. - person ; 07.12.2020
comment
информативный ответ. @LisaBerry Я думаю, что этот вариант тоже работает. - person ; 07.12.2020
comment
@templatetypedef может быть неправильно ... не так ли? это более сложно, я думаю, что они оба O (log n)? - person ; 07.12.2020
comment
Я путаюсь. оба случая (log n) тоже очень сложны. Я думаю, что это то же самое. не могли бы вы пояснить меня? - person ; 07.12.2020
comment
Ваше предложение по варианту (C) устанавливает амортизированную стоимость каждой операции равной ее реальной стоимости, так что это совершенно правильный набор амортизированных затрат, потому что он никогда не может недооценивать вещи. (Полезно это второстепенный вопрос. ^_^) - person templatetypedef; 07.12.2020
comment
см. stackoverflow.com/questions/65203302/ - person ; 08.12.2020
comment
@templatetypedef, не могли бы вы поделиться своей идеей о том, почему (B) является лучшим по отношению к O (log n) в качестве варианта (C) в новом вопросе? - person ; 09.12.2020
comment
Я знаю, что один из вариантов сложнее, поэтому не могли бы вы рассмотреть ответ на новый вопрос? - person ; 09.12.2020
comment
не могли бы вы рассмотреть ответ на мой вопрос, как вы рекомендуете через несколько дней? stackoverflow.com/questions/65203302/ - person ; 06.01.2021

Поскольку куча изначально пуста, у вас не может быть больше удалений, чем вставок.

Амортизированная стоимость O(1) на удаление и O(log N) на вставку точно такая же, как амортизированная стоимость O(log N) как на вставки, так и на удаления, потому что вы можете просто подсчитать стоимость удаления, когда выполняете соответствующую вставку.

Это не работает наоборот. Поскольку у вас может быть больше вставок, чем удалений, может быть недостаточно удалений, чтобы оплатить стоимость каждой вставки.

person Matt Timmermans    schedule 08.12.2020
comment
если вы выберете один из них, я имею в виду вариант (C), оба из них в O (log n) и вариант (B), какой из них лучше? хорошо ли открыть для него новый вопрос сейчас? - person ; 08.12.2020
comment
В этом случае варианты B и C будут одинаковыми. Но для теста вариант Б намного лучше, потому что он показывает, что вы понимаете концепцию амортизации. - person Matt Timmermans; 08.12.2020
comment
это новый вопрос здесь stackoverflow.com/questions/65203302/ - person ; 09.12.2020
comment
Я думаю, вы неправильно понимаете. Вариант B не является лучшим ответом на вопрос, это лучший вариант для проверки. Вам нужно подумать, для чего для предназначен сам тест. - person Matt Timmermans; 09.12.2020
comment
конечно, вы правы, это логика, по которой я открываю новый вопрос. думаю, что эти три варианта присутствовали в одном вопросе интервью. какой из них лучше? извините за мой плохой выбор слова. - person ; 09.12.2020