Каков наилучший способ реализовать PriorityQueue в Java?

Я пытаюсь реализовать свой собственный класс PriorityQueue с нуля (без использования каких-либо существующих импортов Java или библиотек). Я знаю, что хочу использовать структуру данных с минимальной кучей. Но я визуализирую кучу как форму в бинарном дереве поиска. Должен ли я использовать узлы в стиле Linked List для реализации этой минимальной кучи, или я должен использовать массив? Каковы преимущества или предпочтительный метод того или другого? Или есть третий вариант, который я мог бы использовать?

2 ответа

Прежде чем ответить на вопрос, пожалуйста, посмотрите это.

Но я визуализирую кучу как форму в бинарном дереве поиска.

Это неправда. Куча - это форма двоичного дерева, но не двоичное дерево поиска. Пожалуйста, смотрите Разница между двоичным деревом и двоичным деревом поиска

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

Дано n - индекс текущего узла, а индекс начинается с 1(для простоты)

  • индекс родителей = n/2
  • левый дочерний индекс = 2n
  • правый дочерний индекс = 2n+1

Когда вы делаете это с LinkedList.get(n), это O(n). В ArrayList или массиве это O(1).

Самая простая реализация, о которой я могу подумать, будет использовать LinkedList или ArrayList, который сохраняет себя в отсортированном порядке в зависимости от приоритета. Затем вы удаляете спереди или сзади списка (в зависимости от того, как вы сортируете массив), когда пришло время удалить кого-либо из очереди.

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