В духе вопросы по программированию: предположим, есть набор объектов, которые можно сравнивать друг с другом и сортировать. Какой самый эффективный способ отслеживать наименьший элемент в коллекции по мере добавления объектов и временного удаления текущего наименьшего элемента?

Если вам нужна случайная вставка и удаление, лучшим способом, вероятно, будет отсортированный массив. Вставки и удаления должны быть O (log (n)).
Лучше всего использовать min-heap.
http://en.wikipedia.org/wiki/Heap_(data_structure)
Он создан специально для этого приложения.
Я никогда не слышал о куче Фибоначчи
[изначально это был отдельный «ответ», который я опубликовал до того, как были реализованы комментарии] Это было моим первоначальным предложением, пока я не понял, что min-heaps не предназначены для случайного удаления элементов, а только для самого маленького. Ну что ж, похоже, твой ответ все равно был принят.
@ Harpreet
Это не оптимально. Когда объект удаляется, Эриксону придется сканировать всю коллекцию, чтобы найти новый наименьший.
Вы хотите прочитать о Дерево двоичного поиска. MS имеет хороший сайт для начала пути. Но вы можете захотеть получить книгу вроде Введение в алгоритмы (Cormen, Leiserson, Rivest, Stein), если хотите глубоко погрузиться.
If you need random insert and removal, the best way is probably a sorted array. Inserts and removals should be O(log(n)).
Да, но вам нужно будет повторно отсортировать каждую вставку и (возможно) каждое удаление, что, как вы заявили, составляет O (log (n)).
С решением, предложенным Харприт:
Так что это зависит от обстоятельств. Один из этих алгоритмов будет лучше для случая использования с интенсивной вставкой и небольшим количеством удалений, но другой в целом более согласован. Думаю, я бы по умолчанию использовал механизм Харприта, если бы не знал, что наименьшее число будет часто удаляться, потому что это обнаруживает слабое место в этом алгоритме.
Просто хотел указать, что big-O не обязательно является наихудшим случаем ... это просто обозначение для описания асимптотического поведения функций, оно ничего не «знает» о наихудшем или лучшем случае, или о чем-то промежуточном, это просто для описания поведения любой функции, на которую вы смотрите.
На самом деле, я бы даже сказал, что если не указано иное, нотация большого О чаще всего используется для описания среднего, а не наихудшего случая.
Харприт:
the inserts into that would be linear since you have to move items for an insert.
Разве это не зависит от реализации коллекции? Если он действует как связанный список, вставки будут O (1), а если бы он был реализован как массив, он был бы линейным, как вы заявили.
Зависит от того, какие операции вам нужно поддерживать в контейнере. мин-куча - лучший вариант, если вам может потребоваться удалить элемент min в любой момент времени, хотя некоторые операции нетривиальны (в некоторых случаях амортизированное время log (n)).
Однако, если вам нужно нажимать / выталкивать только спереди / сзади, вы можете просто использовать mindeque, который обеспечивает амортизированное постоянное время для всех операций (включая findmin). Вы можете выполнить поиск scholar.google.com, чтобы узнать больше об этой структуре. Недавно мы с другом вместе разработали гораздо более понятную и реализуемую версию mindeque. Если это то, что вы ищете, я могу опубликовать для вас подробности.
Для случайных удалений Куча Фибоначчи даже быстрее, чем min-heap. Вставка - это O (1), и поиск минимума также O (1). Удаление - O (log (n))
Куча Фибоначчи быстрее, чем min-heap, она имеет вставку O (1) вместо O (log (n))