Очередь приоритетов Java - PullRequest
0 голосов
/ 11 апреля 2011

Как бы я использовал очередь приоритетов, встроенную в Java, для считывания и сортировки вершин графа, в конечном итоге удаляя минимальное ребро на каждой итерации?

1 Ответ

0 голосов
/ 11 апреля 2011

Сначала создайте компаратор для очереди приоритетов:

  class MinHeapComparator implements Comparator<Integer> {
    @Override
    public int compare(Integer one, Integer two) {
    return mDistances[one] - mDistances[two];//...
    }
  }  

Это из алгоритма кратчайшего пути, который я написал.mDistances - это расстояния от источника до вершины.Вы можете изменить компаратор, чтобы сравнить, как вам нравится.

Из документации для Comparator: «Сравнивает два аргумента для порядка. Возвращает отрицательное целое число, ноль или положительное целое число, так как первый аргумент меньше, равен или больше второго.»

Полная документация здесь: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Comparator.html

Во-вторых, добавьте элементы в приоритетную очередь.Я обычно строю граф с массивом, содержащим объекты вершин, каждый из которых содержит список смежных вершин.Так что в моем случае я просто добавляю индексы в очередь приоритетов для представления вершин.Компаратор затем может содержать логику, чтобы делать что-либо с вершинами.PriorityQueue.add () добавляет элементы.

В-третьих, создайте экземпляр очереди приоритетов с помощью компаратора:

    PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(numberItems, new MinHeapComparator());

В-четвертых, вызовите PriorityQueue.poll () для извлечения верхнего элемента в куче.Ваш компаратор используется для определения того, что находится на вершине кучи.

...