Я переношу библиотеку С++ на Java и мне нужна структура данных кучи. Существует ли стандартный или мне нужно будет сделать это самостоятельно?
Есть куча в java?
Ответ 1
Познакомьтесь с Приоритетной очередью. это должно сделать это
Ответ 2
Мин куча:
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Макс кучи:
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return - Integer.compare(o1,o2);
}
});
Ответ 3
PriorityQueue использует кучу. Исходя из документации оракула на https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html кажется вероятным, что это реализация двоичной кучи. Я не думаю, что есть официальная реализация кучи Фибоначчи или кучи сопряжения, хотя я бы хотел увидеть одну из двух доступных.
Ответ 4
Для Java 8: обновление существующего ответа answer:
Вы можете использовать Java Priority Queue в качестве кучи.
Min Heap: → чтобы элемент min всегда был сверху, чтобы вы могли получить к нему доступ в O (1).
PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
Max Heap: → чтобы элемент max всегда был сверху, в том же порядке, что и выше.
PriorityQueue<Integer> maxHeap = new PriorityQueue<>((Integer o1, Integer o2) -> (- Integer.compare(o1,o2)));
И вы можете использовать:
add
→ добавить элемент в очередь. O (log n)
remove
→ чтобы получить и удалить мин/макс. O (log n)
peek
→ получить, но не убрать мин/макс. O (1)
Ответ 5
Вы также можете рассмотреть TreeSet, что гарантирует время log (n) для основных операций (добавление, удаление, содержит).