Наличие определенной структуры данных

Мне интересно, может ли существовать такая структура данных при следующих критериях и временах (может быть сложно)?

если мы получим несортированный список L, мы построим из него структуру данных следующим образом:

  • Build (L, X) - за время O (n) мы строим структуру S из несортированного списка из n элементов.
  • Insert (y, S) под O (lg n) мы вставляем z в структуру S
  • DEL-MIN (S) - под O (lg n) мы удаляем минимальный элемент из S
  • DEL-MAX (S) - под O (lg n) удаляем максимальный элемент из S
  • DEL-MId (S) - под O (lg n) удаляем верхний медиальный (потолочная функция) элемент из S

проблема в том, что список L не отсортирован. может ли существовать такая структура данных?

Как вы могли строить структуру данных в сублинейное время? Какими свойствами, по вашему мнению, обладает этот список? Это связанный список? Что-то другое?

John Coleman 21.04.2018 18:13

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

BeginningMath 21.04.2018 18:20

Конечно нет. Вы не можете помещать элементы в структуру данных без обработки элементов. Ваш вопрос похож на "Я хочу сделать миллион вещей, могу ли я сделать миллион вещей, сделав менее миллиона вещей?"

John Coleman 21.04.2018 18:23

@JohnColeman, давайте делать это медленно, от случая к случаю. как лучше всего реализовать Build (L, X) (под O (n)) и Insert (y, S) (под O (log n))?

BeginningMath 21.04.2018 22:03

Я надеюсь, что «под O (.)» Означает «в O (.)». В соответствии с этой предпосылкой сбалансированное двоичное дерево поиска, которое сохраняет размеры поддеревьев, является именно такой структурой данных. Фактически, с некоторыми популярными языками это возможно только с начальным усилием понимания: например, можно построить такое дерево из это расширение GCC стандартной библиотеки C++.

Gassa 22.04.2018 09:38

@Gassa, вы не можете построить сбалансированное двоичное дерево поиска за O (n) время.

Paul Hankin 22.04.2018 14:45

@PaulHankin Хм, я могу, но только тогда, когда элементы уже отсортированы, иначе это была бы сортировка на основе сравнения за O (n). Для несортированных данных это O (n log n). Спасибо за улов! Кучи - это то, что вам нужно, как в вашем ответе.

Gassa 22.04.2018 15:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

DEL-MIN и DEL-MAX просты: сохраняйте min-heap и max-heap всех элементов. Единственный трюк заключается в том, что вы должны хранить индексы значения в куче, чтобы, когда (например) вы удаляете максимум, вы также можете найти его и удалить в минимальной куче.

Для DEL-MED вы можете сохранить максимальную кучу элементов меньше медианы и минимальную кучу элементов, большую или равную медиане. Полное описание находится в этом ответе: Структура данных для поиска медианы. Обратите внимание, что в этом ответе возвращается медиана пола, но это легко исправить. Опять же, вам нужно использовать уловку перекрестной индексации, чтобы ссылаться на другие структуры данных, как в первой части. Вам также нужно будет подумать, как это обрабатывает повторяющиеся элементы, если это возможно в вашей постановке проблемы. (При необходимости вы можете сделать это, сохраняя повторяющиеся элементы как (count, value) в вашей куче, но это немного усложняет перебалансировку кучи при вставке / удалении).

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

Таким образом, структура данных состоит из 4 кучи (минимальная куча всех элементов, максимальная куча всех элементов, максимальная куча пола (n / 2) наименьших элементов, минимальная куча ceil ( n / 2) наибольшие элементы, все с перекрестными индексами друг к другу.

Вам не нужны отдельные min-heap и max-heap для DEL-MIN и DEL-MAX. Есть min-max куча.

Jim Mischel 24.04.2018 14:56

Другие вопросы по теме